Page 471 - 《软件学报》2026年第3期
P. 471
1434 软件学报 2026 年第 37 卷第 3 期
环境的容器工具 (runC) 去访问其中的/proc/[PID]/exe(/proc/[runc-pid]/exe), 就可以得到程序文件 (/usr/bin/runc) 的
文件描述符 (/proc/self/fd/[fd]), 并通过文件描述符覆盖文件, 造成安全问题. 漏洞 CVE-2019-5736 即为容器内的进
程通过此通道重写 runC 可执行文件造成的 [37] .
属于
主机文件 文件描述符
① 操作
用户
容器
主机
图 3 文件描述符泄露漏洞攻击过程
漏洞 CVE-2024-21626 [38] 是通过/proc/self/fd/实现的, 其中包含了当前进程打开的文件描述符. runC 启动过程
中 openat2 系统调用缺少 O_CLOEXEC 标志 (执行 exec 前自动关闭文件描述符), 导致存在没有及时关闭的文件
描述符, 该文件描述符指向主机上的/proc/fs/cgroup, 子进程仍可以利用它的/proc/self/fd/[fdnum] 符号链接访问主
机文件, 实现容器逃逸.
类似漏洞还有本文发现的一个 Podman 上的安全缺陷, 漏洞原理如图 4 所示. Podman 提供“podman top”命令
用于显示在容器中运行的进程 [39] , 一般情况下, 该命令会进入容器的挂载命名空间并在 Proc 中获取相应的进程信
息. 但是当容器具有 SYS_PTRACE 特权时, “podman top”会调用“crun exec”在容器中运行 ps 命令 (①). 这个过程
中, crun exec 会启动一个 crun 进程并将其加入容器的命名空间中 (②). crun 在加入容器的命名空间之前打开了一
些文件描述符, 这些文件描述符对容器内的进程是可见的, 并且其中一个文件描述符指向 /run/user/1000/crun/
[CONTAINER_ID]/seccomp.bpf 文件.
用户
恶意进程
① 运行
“podman top”
② 进入容器命名空间
crun 进程 crun 进程
Proc
③ 访问文件
crun-pid crun-pid
②
fd fd
... ...
Proc 文件系统
具有 SYS_PTRACE 特权的容器
主机
图 4 Podman 漏洞攻击示意图

