Landlock 在 Linux 中

发布: (2025年11月30日 GMT+8 05:30)
7 min read

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 策略由两部分组成:

  1. 受控访问 – 你想要限制的操作类别(例如文件系统读/写)。
  2. 访问授权 – 明确的允许列表,列出哪些对象可以进行这些操作。

示例策略

  • 受控 所有文件系统读写和网络绑定。
  • 授权
    • /home/user 只读访问
    • /tmp 读写访问
    • 允许绑定到端口 2222

随后应用调用 landlock_restrict_self() 进入受限域。从此以后,线程的子线程和子进程将永久受限;限制不可撤销。

  • 分层 – 最多 16 层。子层可以进一步降低访问权限,但不能重新引入父层已移除的权限。
  • 无特权 – 任意应用都可以自行沙箱化。
  • ABI 版本化 – 程序即使在旧内核上也能尽力进行沙箱化。
  • 可堆叠 LSM – 可与 SELinux 或 AppArmor 组合使用。

为什么要使用它?

当一个应用拥有可预测的文件或目录集合时,Landlock 的优势尤为明显。例如:一个 Web 服务器可以将自己限制在 /var/www/html/tmp

  • 不需要管理员介入或系统范围的配置。
  • 策略直接嵌入应用代码。
  • 不需要特殊权限,采纳门槛低。
  • 已有 RustGoHaskell 等语言绑定(尚未有官方 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 成为更加通用、用户友好的沙箱解决方案。

Back to Blog

相关文章

阅读更多 »

NextJS 安全漏洞

请提供您希望翻译的具体摘录或摘要文本,我才能为您进行翻译。