Page 477 - 《软件学报》2026年第3期
P. 477
1440 软件学报 2026 年第 37 卷第 3 期
inode 的访问. P3 实现了对执行文件行为的监控, 并确保不会发生在较高安全级别的环境中执行较低安全级别的
文件的行为, 有效地限制了控制流的转移. P3 可以防御类似 CVE-2019-14271 漏洞的攻击: 进入容器环境的 docker-
tar 进程加载了恶意的 nsswitch 动态库并准备执行时, 由于定位动态链接库之前需要进行路径查找, 在此过程得到
最终需要执行的文件 inode 后发现进程的安全级别标志 (0) 大于 inode 中的安全级别 (−2), 终止该次执行流程.
3.4 优化兼容性
为了使 FCFS 在不改变用户空间应用程序行为的情况下实现对容器文件系统的安全隔离和访问控制, 进行了
如下优化.
首先, 在容器启动过程中, 为了在不修改容器工具的情况下正确对容器文件系统对象进行标识, FCFS 通过截
获容器启动时使用的系统调用 pivot_root, 并基于其参数 new_root 对容器文件系统进行标识. pivot_root 用于将进
程的根目录切换到一个新的文件系统 (容器实例的文件系统), 它的 new_root 参数指示了容器文件系统的根目录.
当 pivot_root 被调用时, FCFS 会截获该系统调用并检查调用进程与其父进程是否在同一个挂载命名空间中. 如果
不是, 则从 new_root 参数所指示的路径开始递归式遍历其下所有文件对象的 dentry (即遍历属于容器的文件对
象), 使用当前进程的安全标签来标记 dentry 相关联的 inode. 如此可以确保所有相关的 inode 都被赋予了正确的标
签, 不会对后续访问控制造成影响.
其次, 当符号链接解析需跨越多个安全域时, FCFS 会根据安全域的根目录修正符号链接的解析范围, 而不是
仅基于访问控制规则阻止发生越界的符号链接解析过程, 保证应用程序功能的完整性. 为实现该功能, 在用于标识
安全域的 PID 命名空间结构体中添加了一个名为 root_path 的成员, 用于存储各安全域的根目录. 当内核函数
trailing_symlink 解析符号链接时, FCFS 会通过 inode 中的标签查询当前符号链接所在安全域, 并使用该安全域的
根目录重置符号链接解析的上下文, 以保证符号链接只能在其所属的安全范围内解析. 例如, 当宿主机进程尝试访
问容器中符号链接且最终将该符号链接解析到宿主机路径时, 该过程会因符号链接解析越界而被访问控制规则所
阻止. 优化后的 FCFS 则会在路径解析过程进入容器文件系统范围后, 将符号链接的解析起点 (即根目录) 重置为
容器的根目录, 使容器中的符号链接永远在容器内部完成解析, 保证宿主机进程正常访问容器中文件的同时防止
符号链接解析越界.
4 实验评估
本节将讨论在不同的基准测试下, FCFS 为 Linux 内核及应用层容器工具带来的性能开销. 实验结果表明,
FCFS 可完全兼容现有的容器生态, 对 Linux 内核及容器工具的性能影响可忽略不计.
4.1 实验设置与参数
实验环境的硬件配置为 6 核 3.70 GHz AMD Ryzen 5 7500F CPU 和 16 GB RAM 的虚拟机, 操作系统版本为
Ubuntu 18.04, 内核版本为 v5.6.0.
4.2 有效性分析
首先评估了 FCFS 的有效性, 即对上述两类漏洞的抵御能力. 为验证 FCFS 对攻击行为的响应结果, 本文选取
了 Docker、Podman、Containerd、runC 以及 Kubernets 等 5 个主流容器工具中的 13 个安全漏洞以及本文在第
4.3 节提到的“podman top”漏洞, 这些漏洞具有较高代表性, 涵盖了本文研究的两类漏洞类型. 通过实验复现所有漏
[8]
洞的攻击过程, 并开启系统日志以观测 FCFS 中访问控制策略的激活情况, 并与 Patrol 和 vKernel [41] 进行了对比,
实验结果如后文表 1 所示. 标记“√”表示该漏洞能被发现或防御, 可以看到所有漏洞利用过程中所有越界访问行为
均被 FCFS 捕获并被访问控制策略拦截, 有效抵御了各类路径解析错误和文件描述符泄露漏洞.
4.3 兼容性及性能评估
实验首先使用两种标准测试集 SPEC 2017 [42,43] 和 Filebench [44] 对 FCFS 进行性能与兼容性的评估, 实验结果分
别如图 8 和图 9 所示.

