Landlock LSM 通过规则集的堆叠机制与进程继承特性,提供了一种超越单一平面规则的嵌套沙箱化方案。这种分层策略允许父进程施加宽松限制,而子进程可进一步收紧,形成自然的安全层次结构,适用于多级应用场景如容器嵌套或脚本执行链。
核心在于规则集层(layers):每个 landlock_restrict_self() 调用会将新规则集作为一层追加到当前线程的 Landlock 域中。新域为父域与新规则集的合并,所有层必须同时授权访问,方可通过。例如,路径访问需每层至少一规则匹配授权,否则拒绝。这确保了策略的可组合性:父层定义全局边界,子层细化局部规则。“一个政策层授予路径访问,如果路径上至少一个规则授予该访问;沙箱线程仅当所有强制政策层及系统访问控制均授权时,方可访问。”(kernel.org 文档)
进程继承强化了这一层次:clone(2) 或 execve(2) 时,新线程自动继承父域限制,无法逃逸。这类似于 seccomp 的继承,但 Landlock 专为文件系统与网络设计,支持嵌套域(nested domains)。子域进程 ptrace 仅限父域或同域,IPC scoping(ABI 6+)进一步隔离信号与抽象 UNIX 套接字至同/嵌套域,避免横向泄露。
ABI 4/5 扩展了层次能力:ABI 4 引入 LANDLOCK_ACCESS_NET_BIND_TCP | CONNECT_TCP,支持网络端口规则(如仅允许 443 HTTPS),适用于服务嵌套;ABI 5 添加 LANDLOCK_ACCESS_FS_IOCTL_DEV,控制设备 ioctl(如 TTY TIOCSTI),防范设备滥用。实际工程中,先查询 ABI 版本:
int abi = landlock_create_ruleset(NULL, 0, LANDLOCK_CREATE_RULESET_VERSION);
if (abi >= 4) {
ruleset_attr.handled_access_net = LANDLOCK_ACCESS_NET_BIND_TCP | LANDLOCK_ACCESS_NET_CONNECT_TCP;
}
if (abi >= 5) {
ruleset_attr.handled_access_fs |= LANDLOCK_ACCESS_FS_IOCTL_DEV;
}
创建规则集时显式列 handled_access,确保前后向兼容;添加规则如 path_beneath(O_PATH fd)或 net_port。PR_SET_NO_NEW_PRIVS 先置位,防 SUID 提升。然后 restrict_self() 生效,不可逆转。
可落地参数与清单:
-
ABI 检查阈值:最低 ABI 4(网络),理想 5+(设备)。fallback ABI<4 仅 FS 规则。
-
规则集 flags:
- handled_access_fs:全集掩码(EXECUTE|WRITE_FILE|READ_FILE|READ_DIR|...|IOCTL_DEV),按 ABI 裁剪。
- handled_access_net:BIND_TCP|CONNECT_TCP,仅 ABI>=4。
- scoped(ABI>=6):SIGNAL|ABSTRACT_UNIX_SOCKET,嵌套 IPC。
-
嵌套深度监控:上限 16 层,sys_landlock_restrict_self() 超限 E2BIG。监控 /proc/self/status Landlock_layers(若暴露)或 audit 日志计数拒绝事件。阈值:>12 层报警,回滚至单一规则集。
-
继承清单:
| 层级 |
示例规则 |
适用场景 |
| 父进程 |
/home:rw, /usr:ro, net:443 connect |
容器宿主 |
| 子进程 |
./tmp:rw, deny ioctl_dev |
应用沙箱 |
| 孙进程 |
./cache:ro |
脚本执行 |
代码模板:
struct landlock_ruleset_attr attr = { .handled_access_fs = FULL_FS_MASK & abi_mask };
int fd = landlock_create_ruleset(&attr, sizeof(attr), 0);
prctl(PR_SET_NO_NEW_PRIVS, 1);
landlock_restrict_self(fd, 0);
-
风险缓解:
- 叠加层过多耗内存在 cgroup 内存控制器下受限。
- OverlayFS/bind mount:规则不跨层传播,仅影响显式路径。
- 审计:默认日志同 exec 拒绝,flags 如 LANDLOCK_RESTRICT_SELF_LOG_SUBDOMAINS_OFF 静默嵌套拒绝。
- 回滚策略:预 fork 测试规则集,失败 exec 备用无沙箱二进制。
实践验证:在父 shell 执行 sandboxer(samples/landlock/sandboxer.c)限制 /usr:ro,再子进程添加 /tmp:rw。测试 rm /usr/bin/ls 拒绝,echo > /tmp/ok 成功。dmesg|grep landlock 确认域激活。
此方案超越平面规则,实现 composable 沙箱:服务可安全 spawn 插件,浏览器隔离渲染器。结合 seccomp/AppArmor,提升多租户安全。
资料来源: