使用 Landlock 实现更高安全性

发布: (2025年12月7日 GMT+8 01:25)
3 min read
原文: Dev.to

Source: Dev.to

特权工具的问题

网络抓包工具需要提升的权限。在 Linux 上,CAP_NET_RAW 允许创建原始套接字来捕获数据包。但一旦拥有了这个能力,通常会在整个进程生命周期内保留它——即使你只在初始化阶段需要它。

# 传统做法:以提升的权限运行
sudo ./network-tool --interface eth0
# 工具现在在整个生命周期内拥有 CAP_NET_RAW

这会产生比必要更大的攻击面。如果深度包检测(DPI)代码中的漏洞被利用,攻击者将继承进程拥有的所有权限。

引入 Landlock

Landlock 是一种 Linux 安全模块(LSM),允许在非特权下进行沙箱。与过滤系统调用的 seccomp 或需要特权才能设置的 namespaces 不同,Landlock 让进程自行限制自己。它自内核 5.13 起已加入(文件系统),网络限制在 6.4 中加入。

关键洞察:在初始化后而不是之前进行沙箱。我们可以:

  • 打开数据包捕获句柄(需要 CAP_NET_RAW
  • 加载 eBPF 程序(需要 CAP_BPF
  • 创建日志文件(需要文件系统写入权限)

然后 应用 Landlock 限制

放弃 CAP_NET_RAW

已有的 pcap 句柄仍然有效——内核不会撤销它。但新的原始套接字会被阻止。

实现

Landlock API 包括创建规则集、添加规则以及强制执行:

pub fn apply_sandbox(config: &SandboxConfig) -> Result {
    // Check kernel support
    let abi_version = landlock_create_ruleset(
        ptr::null(),
        0,
        LANDLOCK_CREATE_RULESET_VERSION,
    );

    if abi_version  Result {
    let mut caps = CapSet::empty();

    // Read current capabilities
    capget(&mut header, &mut caps)?;

    // Clear CAP_NET_RAW from all sets
    caps.effective &= !(1  info!("Sandbox fully applied"),
    SandboxStatus::PartiallyEnforced => warn!("Partial sandbox: {}", result.details),
    SandboxStatus::NotAvailable => warn!("Sandboxing unavailable: {}", result.reason),
}

// Continue running either way—don't fail on missing sandbox

对于高安全性环境,--sandbox-strict 标志会在无法完全强制时使工具退出。

UI 反馈循环

RustNet 的 TUI 现在清晰地显示沙箱状态:

┌─Security────────────────────────────────────────┐
│ Landlock: Fully enforced [kernel supported]     │
│ CAP_NET_RAW dropped, FS restricted, Net blocked│
└─────────────────────────────────────────────────┘
Back to Blog

相关文章

阅读更多 »

Landlock 在 Linux 中

抱歉,我无法直接访问外部链接来获取文章内容。请您提供需要翻译的具体文本,我将为您进行翻译。

内核 Rust 实验的结束

抱歉,我无法访问外部链接。请提供您希望翻译的具体摘录或摘要文本,我将为您翻译成简体中文。