Page 475 - 《软件学报》2026年第3期
P. 475
1438 软件学报 2026 年第 37 卷第 3 期
文件的容器内符号链接, 从结果来看是主机进程访问了主机文件 inode, 只设置静态渲染的情况下似乎是合法的,
但是实际上该主机进程被恶意符号链接诱导非法访问了容器外文件, 跨越了容器的安全边界. 因此需要将动态路
径查找渲染与静态渲染相结合形成多阶段渲染策略, 确保能够及时识别并阻止任何进入低安全级别的命名空间的
行为, 增强容器与主机之间的隔离安全.
dentry inode (0)
dentry inode (0) dentry inode (0) dentry inode (−2)
挂载卷
dentry inode (−2) dentry inode (−2)
...
dentry inode (−1)
...
容器
... dentry inode (−1)
图 6 静态渲染
路径查找过程中, nameidata 临时结构的作用是记录查找的中间结果. 通过它可以找到当前路径分量, 以及当
前文件系统的挂载点目录. 为了后续保存目前路径查找过程中最危险的安全级别, 在 nameidata 结构中添加了一个
存储 PID 命名空间的成员. 路径查找从进程的初始命名空间开始, 因此初始化时将 nameidata 结构中的标签设置
为当前进程的 PID 命名空间指针.
FCFS 通过拦截路径查找过程中调用的内核函数 path_to_nameidata 实现动态渲染. 该函数用于在每步查找时
更新 nameidata 结构. 具体来说, 在每一步更新 nameidata 结构时, 将 nameidata 结构中的当前标签与刚找到的部件
inode 的标签进行比较, 并将 nameidata 中的标签更新为安全级别较低的那个标签. 通过这种方式, 即使路径查找返
回到较高安全级别的命名空间, nameidata 结构中的标签也不会回退, 从而防止安全风险. 图 7 展示了容器进程访
问共享卷中的资源的多重渲染 (静态渲染和动态渲染) 过程图, 绿色箭头表示找到一个部件并调用 path_to_nameidata
函数的过程, 箭头上面的数字表示当前 nameidata 结构中安全标签的级别, 图中访问主机 inode 后, 当前安全标签
级别为 0, 进入容器访问容器文件系统 inode, 安全标签级别更新为最低——“strict”, 即−2. 随后沿着 dentry 树访问
共享卷的文件 dentry 和 inode, 由于共享卷文件 inode 被标记为“normal”, 即−1, 大于−2, 所以 nameidata 结构中的
安全级别不会更新, 其值为−2.
dentry inode (0)
0
dentry inode (0) dentry inode (−2)
−2
−2 挂载卷
dentry inode (−2) ...
dentry inode (−1) 容器
−2
... dentry inode (−1)
图 7 多重渲染过程

