跳至正文
Wener Notes

CVE-2024-21626

约 3 分钟阅读
  • runc - 内部文件描述符泄漏导致容器逃逸,可访问宿主机文件系统,部分变体可覆盖宿主机可执行文件
  • 官方公告:2024-01-31
  • 影响版本:1.0.0-rc93 <= runc <= 1.1.11
  • 首个修复版本:runc 1.1.12
  • 严重性:High,CVSS 3.1 8.6,GitHub CNA 评分;不同攻击变体评分不同
    • CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
  • CWE:CWE-403(文件描述符泄漏)、CWE-668(资源暴露到错误的作用域)

成因与影响

  • runc 初始化容器时,内部文件描述符泄漏到后续执行阶段,其中包含指向宿主机文件系统的目录句柄
  • 切换工作目录后未充分检查目录是否仍位于容器根目录内,导致容器进程的工作目录可能落在宿主机文件系统中
  • 攻击路径
    • 启动恶意镜像:攻击者控制镜像中的工作目录等内容,诱使用户或平台创建容器
    • 已运行容器:攻击者控制容器内相关路径或程序,等待管理员或自动化任务执行 runc exec 等操作
    • Docker、containerd、Kubernetes 环境是否受影响,取决于底层实际使用的 runc 及厂商补丁状态
  • 影响可从读取宿主机文件扩大到覆盖宿主机可执行文件,最终取得宿主机控制权;具体后果受进程权限与部署配置影响

修复与缓解

  • 更新宿主机或容器平台实际调用的 runc,使用包含修复的受支持版本或发行版回补补丁
    • 更新业务容器内的软件包不能替代宿主机运行时修复
    • runc 1.1.12 是此漏洞当时的修复基线,不代表当前推荐的最新版本
  • containerd 官方 1.6.28、1.7.13 发布构建将 runc 更新至 1.1.12
    • containerd 与 runc 可能分开安装;不能仅凭 containerd 版本判断是否修复
  • 无法立即升级时,官方缓解措施各有覆盖范围
    • 限制容器及 exec 的工作目录为 /,可阻止工作目录逃逸的攻击 1、2
    • 仅运行可信镜像,可降低依赖恶意镜像的攻击 1、3a 风险
    • 攻击 3b 除避免对不可信容器执行 runc exec 外,没有实用的通用缓解办法;前两项不能覆盖全部变体
bash
# 在宿主机上检查版本;同时核对容器运行时实际配置的二进制路径
runc --version
containerd --version

PoC

  • NitroCao/CVE-2024-21626 提供通过容器启动和直接调用 runc 的复现步骤,也列出了行为检测规则
  • 关键输入是指向泄漏描述符的工作目录,例如公告中的 /proc/self/fd/7
    • 实际编号取决于运行时打开文件的顺序;第三方示例也使用 /proc/self/fd/8,不能把某个编号当作固定条件
  • 在隔离测试宿主机准备普通标记文件,不把该文件挂载进容器;观察错误工作目录是否仍能使容器进程访问到该标记
  • 关键现象是访问越过容器根目录边界;只运行 runc --version 或看到特殊工作目录字符串不能证明已逃逸
  • 宿主机二进制覆写是另一组变体;基础目录逃逸演示不需要把系统程序作为测试目标

参考

关联信息

反向链接、本文链接的其他页面和外部资料。

参考资料

GitHub4 条
其他外链1 条
最近更新commit 0c5208b编辑