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

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


                    这种渲染在路径查找过程中是不可逆的, 以确保可以识别从可信环境到不可信环境的访问. 当主机进程进入
                 容器文件系统时, nameidata 结构的标签会更新为容器的            PID  命名空间标签    (−2). 如果遇到指向主机文件系统的符
                 号链接, 或者容器内恶意进程想通过主机泄露的文件描述符访问主机文件, 解析最后文件                             inode 属于主机文件系
                 统, nameidata 中的安全级别标签仍指示路径查找曾跨越容器命名空间, 加以访问控制策略, 可以禁止这种恶意访问.
                  3.3   控制访问策略
                    在完成了静态和动态渲染之后, 接下来的步骤是强制执行由标记确定的访问控制策略. 首先, 根据之前描述的
                 威胁模型    (第  2.1  节), 容器被认为是不受信任的环境, 这意味着容器内的进程不能读取、写入或执行宿主机上的
                 任何文件, 反之亦然. 此外, 共享卷作为一种特殊的文件系统资源, 既可以被容器访问, 也可以被宿主机访问, 需要
                 特别注意. 为此定义了      3  种主要的访问控制策略, 并为了确保这           3  种策略的有效执行, 在内核中添加了放置在关键
                 函数的特定检查点. 这些检查点主要集中在路径查找的                  complete_walk  函数中, 该函数是路径查找过程的必要函
                 数, 用于处理路径查找最终结果. 因此在这里实施访问控制可以有效地覆盖路径查找过程, 确保不会遗漏任何请求.
                    根据数据访问和控制流策略设计的原则, 制定了以下                 3  条访问控制规则.
                    ● 规则  1 (P1): 禁止低安全等级进程或跨低命名空间访问高安全等级文件.
                    该策略限制进程对文件的访问范围, 即低安全级别的进程不允许访问高安全等级的文件. 一旦容器中进程通
                 过路径查找或文件描述符获取到的文件不在容器中, 即容器中进程非法访问了容器外的文件, 该过程将被禁止. 另
                 外, 宿主机中进程解析文件路径时进入容器文件系统后将被标记低安全等级, 若在该解析过程中因容器文件系统
                 中的符号链接再次回到宿主机文件系统中, 则禁止后续访问, 防止宿主机进程被恶意容器内符号链接误导而进行
                 非法访问.
                    P1  的实现依赖于检查进程的标签是否与渲染阶段分配给文件                     inode  的标签一致. 具体来说, 如果进程中的
                 PID  命名空间标签、nameidata 中的    PID  命名空间标签和最终获得的文件           inode 中的  PID  命名空间标签不同, 且
                 如果进程标签的安全级别低于在查找过程结束时的最终                    inode 的标签, 将阻止该次访问      P1, 可以有效防护链接欺
                 骗和文件描述符泄露漏洞. 针对本文提出的              Podman  文件描述符漏洞, 容器中的恶意进程获得了主机泄露在容器
                 环境中的主机文件描述符, 最终路径查找到主机上的文件, 文件                    inode 标签为  0, 进程的  PID  命名空间标签为−2,
                 该次访问被禁止. 符号链接欺骗漏洞的防御也是类似原理.
                    ● 规则  2 (P2): 允许主机进程访问共享卷.
                    该策略作为对      P1  的补充, 在容器进程访问挂载卷文件时, 因为容器进程的安全等级标签为“−2”, 低于挂载卷
                 文件的安全等级标签“−1”, 该访问被禁止. P2         规定允许该类访问.
                    在实现时, 在    complete_walk  函数中设置了访问控制检查: 如果最终获得的文件             inode 安全标签为−1, 即为共
                 享卷, 即使进程安全等级标签或          nameidata 中的  PID  命名空间标签低于该标签, 依然允许该次访问. P2          消除了   P1
                 过于严格的访问控制对正常容器使用过程中访问共享卷带来的问题.
                    ● 规则  3 (P3): 禁止高安全级别的进程执行低安全等级的文件.
                    该策略关注的是控制流的转移, 规定从不受信任的容器发起的控制流转移必须停留在不受信任的区域内. 换
                 句话说, 不允许任何处于较高安全级别的进程               (例如宿主机进程) 执行来自较低安全级别环境的文件                 (例如容器内
                 的文件). 例如, 一个宿主机进程使用容器内的可执行文件创建出一个新的进程且此进程将在宿主机上运行的情形
                 下, 因为容器内的可执行文件对宿主机而言不可信, 若以宿主机的上下文执行此不可信的可执行文件, 其中包含的
                 恶意负载将有权限访问宿主机中的资源.
                    为了实现    P3, 首先向  nameidata 结构中添加了一个访问模式标志, 这个标志在路径查找开始时初始化, 用于指
                 示在路径查找完成后是否会执行目标文件. 当触发了需要进行路径查找的系统调用                           (例如  sys_open  或  sys_execve)
                 时, 会检查调用该系统调用的参数并据此对访问模式标志进行初始化. 如果调用系统调用服务的进程的                                 PID  命名
                 空间和目标文件      inode 中的  PID  命名空间标签不同, 那么就需要检查是否满足             P3  的要求. 如果进程具有执行权
                 限  (即  nameidata 中的访问模式标志指示执行意图), 并且进程的安全级别标志大于                 inode 中的安全级别, 将阻止对
   471   472   473   474   475   476   477   478   479   480   481