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 多重渲染过程
   470   471   472   473   474   475   476   477   478   479   480