Page 466 - 《软件学报》2026年第3期
P. 466

李志 等: 容器文件系统隔离增强机制                                                              1429


                    完备的文件系统隔离机制是全面消除该类路径解析错误及文件描述符泄露漏洞的首选方法. 有效的主机与容
                 器文件系统隔离机制应该达到以下目标: (1) 隔离容器和宿主机间文件系统相关的所有数据结构, 保护主机的敏感
                 数据和系统文件, 同时防止主机被欺骗执行容器中的恶意可执行文件; (2) 具有完整的权限检查机制, 确保容器内
                 的进程只能访问其具有合法权限的文件和目录. 这两点可以防止攻击者通过解析恶意符号链接或者访问主机上的
                 文件描述符破坏容器环境的安全性.
                    本文提出了一种容器文件系统隔离增强机制, 将文件系统隔离拓展到文件的                          inode 结构. 在容器初始化过程
                 中, 通过在  inode 结构中添加指向     PID  命名空间的指针来标记文件         inode, 并根据容器文件系统、共享卷和宿主机
                 文件系统的不同特性, 为这些         inode 分配不同的安全级别标志. 此外还精心设计了两个访问控制策略, 分别限制路
                 径解析结果和控制流的转移, 来确保准确和全面的交互控制. 我们已经将源代码提交至开源网站                               [12] , 用户可以下
                 载并应用补丁.
                    本文贡献如下.
                    (1) 介绍了一个文件描述符泄露漏洞, 该漏洞揭示了               Podman  容器环境中文件描述符泄露的新途径, 并对攻击
                 原理和过程进行了详细的说明, 展示了攻击者如何通过“podman top”命令存在的缺陷, 获得宿主机文件的文件描述
                 符, 并以此为基础访问和修改宿主机文件.
                    (2) 分析了路径解析错误和文件描述符泄露漏洞的根本原因是容器文件系统隔离不完整. 通过对多个漏洞原
                 理的研究分析后, 认为仅针对单个漏洞进行修复是无效的, 无法防止相似漏洞的再次出现, 甚至修复手段本身也可
                 能引入新漏洞.
                    (3) 提出并实现了内核层增强容器文件系统隔离的方法                 FCFS (fine-grained container file system). 这种方法通
                 过将容器文件系统隔离扩展到           inode 级别, 并结合精心设计的访问控制策略, 来确保准确和全面的交互控制.
                    (4) 通过测试验证了本方法的有效性和高效性. 首先检验了                 FCFS  的有效性, FCFS  成功捕获并阻止了所有不
                 安全的跨范围访问进程, 可以完全消除上述两类安全风险. 其次验证                    FCFS  的高效性, 测试评估了     FCFS  在  Docker、
                 Podman  和  Kubernetes 上的实现, 引入的平均开销低于     2%, 性能远优于容器工具提出的各种用户层修复手段.
                    本文第   1  节介绍所需的基础知识, 包括虚拟文件系统和容器的文件系统隔离机制. 第                       2  节介绍对两类漏洞的
                 原理及现有修复手段, 分析解决漏洞的根本方法. 第               3  节介绍提出的容器文件系统隔离增强机制              FCFS. 第  4  节验
                 证  FCFS  的有效性, 并通过对比实验验证其高效性. 最后总结全文.

                  1   基础知识

                  1.1   虚拟文件系统
                    VFS  是操作系统内核中的一个抽象层           [13] , 它允许不同类型的文件系统在统一框架下进行操作. VFS             的设计体
                 现了“万物皆可为文件”的理念, 普通文件、目录、字符设备等都被视为文件. 它提供了一个通用的接口, 使得应用
                 程序可以通过一致的方式访问各种不同的文件系统, 而不需要关心底层文件系统的具体实现细节, 同时也为不同

                 文件系统的通信提供了媒介.
                    ● 文件描述符
                    文件描述符是进程访问文件的句柄, 实际上是一个非负整数, 用来高效管理被打开的文件. 当进程启动后, 进
                 程的进程控制块      (PCB) 中有一个指针指向进程的文件描述符表, 记录了该进程打开的所有文件. 进程的文件描述
                 符表是一个数组, 数组中的每个元素是一个指向打开文件结构体的指针. 此外, 内核为所有打开的文件维护了一个
                 系统级的描述表, 记录所有当前打开的文件. 每个条目是一个文件结构体, 包含文件的状态信息、当前偏移量等.
                    调用  open  系统调用打开文件时, 若成功打开, 内核会向进程返回一个指向打开文件的文件描述符. 文件描述
                 符的值由操作系统自动分配, 规定从            0  依次增加. 在  POSIX  语义中, 0、1、2  这  3  个文件描述符值被赋予特殊含
                 义, 分别是标准输入      (STDIN_FILENO), 标准输出  (STDOUT_FILENO) 和标准错误     (STDERR_FILENO). 因此用户
                 进程打开文件得到的最小描述符只能是              3. 后续所有执行    I/O  操作的系统调用都通过返回的文件描述符来实现. 由
   461   462   463   464   465   466   467   468   469   470   471