使用 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│
└─────────────────────────────────────────────────┘