Landlock 在 Linux 中
Source: Hacker News
Landlock‑Ing Linux
Landlock:它是什么?
Landlock 是一个 Linux API,允许应用程序显式声明它们被允许访问的资源。它的理念类似于 OpenBSD 的 unveil()(以及(较少)pledge()):程序可以与内核签订合约,声明“我只需要这些文件或资源——如果我被攻陷,请拒绝我所有其他访问”。
它提供了一种简单、面向开发者的方式,为应用程序添加纵深防御。相比传统的 Linux 安全机制,Landlock 更易于理解和集成。
它是如何工作的?
Landlock 是自 Linux 5.13 起提供的 Linux 安全模块(LSM)。不同于 SELinux、AppArmor 等 MAC 框架,Landlock 应用瞬时限制:
- 策略在运行时创建。
- 限制作用于当前线程及其未来的子线程/子进程。
- 当进程退出时,限制随之消失。
你不需要给文件打标签或设置扩展属性,而是由应用程序动态创建策略。
一个 Landlock 策略由两部分组成:
- 受控访问 – 你想要限制的操作类别(例如文件系统读/写)。
- 访问授权 – 明确的允许列表,列出哪些对象可以进行这些操作。
示例策略
- 受控 所有文件系统读写和网络绑定。
- 授权:
- 对
/home/user只读访问 - 对
/tmp读写访问 - 允许绑定到端口
2222
- 对
随后应用调用 landlock_restrict_self() 进入受限域。从此以后,线程的子线程和子进程将永久受限;限制不可撤销。
- 分层 – 最多 16 层。子层可以进一步降低访问权限,但不能重新引入父层已移除的权限。
- 无特权 – 任意应用都可以自行沙箱化。
- ABI 版本化 – 程序即使在旧内核上也能尽力进行沙箱化。
- 可堆叠 LSM – 可与 SELinux 或 AppArmor 组合使用。
为什么要使用它?
当一个应用拥有可预测的文件或目录集合时,Landlock 的优势尤为明显。例如:一个 Web 服务器可以将自己限制在 /var/www/html 与 /tmp。
- 不需要管理员介入或系统范围的配置。
- 策略直接嵌入应用代码。
- 不需要特殊权限,采纳门槛低。
- 已有 Rust、Go、Haskell 等语言绑定(尚未有官方 C 库)。
Rust 示例
use landlock::{
ABI, AccessFs, Ruleset, RulesetAttr, RulesetCreatedAttr, RulesetStatus, RulesetError,
path_beneath_rules,
};
fn restrict_thread() -> Result<(), RulesetError> {
let abi = ABI::V1;
let status = Ruleset::default()
.handle_access(AccessFs::from_all(abi))?
.create()?
// Read‑only access to /usr, /etc and /dev.
.add_rules(path_beneath_rules(&["/usr", "/etc", "/dev"], AccessFs::from_read(abi)))?
// Read‑write access to /home and /tmp.
.add_rules(path_beneath_rules(&["/home", "/tmp"], AccessFs::from_all(abi)))?
.restrict_self()?;
match status.ruleset {
RulesetStatus::FullyEnforced => println!("Fully sandboxed."),
RulesetStatus::PartiallyEnforced => println!("Partially sandboxed."),
RulesetStatus::NotEnforced => println!("Not sandboxed! Please update your kernel."),
}
Ok(())
}
Linux 沙箱的现状:为何这很重要
Linux 的使用率在增长,针对桌面用户的恶意软件也随之增多。虽然 Linux 历史上相对安全,但这更多归功于市场份额和技术壁垒,而非固有安全性。
主流发行版的典型风险:
- 用户可以在没有警告的情况下执行不可信的二进制文件。
- Shell 脚本可以直接从网络管道读取并盲目运行。
- 无密码
sudo很常见,导致随时可以获取 root 权限。
无特权的应用通常能够:
- 读取
$HOME下的文件(~/.ssh、~/.bashrc、浏览器 cookie 等)。 - 修改环境变量和
$PATH。 - 创建 systemd 用户服务。
- (在 X11 上)记录键盘输入并读取输入设备。
- 绑定任意网络端口。
现有沙箱方案
| 方法 | 优点 | 缺点 |
|---|---|---|
| 容器化(Docker、Podman) | 为服务提供强隔离 | 不适合桌面应用;访问 home 目录笨拙;--privileged 会破坏隔离 |
| Flatpak / Snap | 适合图形应用 | 常需过宽权限;对 CLI 工具支持不足 |
| Firejail | 每个应用的配置文件 | 需要显式调用或包装脚本 |
| seccomp | 细粒度系统调用过滤 | 编写繁琐、易出错;黑名单脆弱;存在 TOCTOU 风险 |
| SELinux | 功能极其强大 | 复杂,需要管理员策略,桌面上常被禁用 |
| AppArmor | 相对 SELinux 更易上手 | 仍需管理员定义、系统范围,且有时被禁用 |
| Landlock | 无特权、面向应用、易集成、默认拒绝、5.13 起支持、向前/向后兼容 | 仍在成熟中;暂无官方 C 库 |
Landlock 填补了一个重要空白:提供一种简单、独立、无特权的沙箱工具。
Landlock 能带来的可能性
- 系统守护进程 可以被限制在真正需要的文件上。
- 桌面应用(PDF 阅读器、图片查看器、浏览器、文字处理器)可以仅限于用户打开的文件。
- 服务器(FTP、HTTP)只能绑定必需的资源;即使被攻陷,攻击者也无法随意读取文件。
- 将来的 supervisor 模式 可以实现类似 Android 的权限提示,允许用户交互式授权或拒绝访问。
- 与 GUI 以及权限管理器结合,Landlock 有望显著提升桌面安全性。
Landlock 的正在进行的工作
- Supervise Mode – 让用户空间的“监督者”能够交互式地允许或拒绝访问(类似 Android 权限提示)。
- Socket Restrictions – 对套接字类型和端口进行细粒度控制。
- LANDLOCK_RESTRICT_SELF_TSYNC – 即将推出的内核特性,用于跨线程同步限制。
这些发展旨在让 Landlock 成为更加通用、用户友好的沙箱解决方案。