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  漏洞攻击示意图
   466   467   468   469   470   471   472   473   474   475   476