seccomp策略收紧之前,先检查你到底允许了什么

本文探讨seccomp-bpf系统调用过滤策略的实际有效性验证方法,强调策略需覆盖真实负载路径(如动态加载、线程、DNS等),指出其非完整沙箱的局限性——不替代文件权限、网络策略或进程树清理。提出离线审查简化策略对象、区分加载成功与业务可用性、记录被拒调用及错误路径行为等关键实践,并提醒内核侧日志与生命周期管理的重要性。

seccomp策略收紧之前,先检查你到底允许了什么

把系统调用列表压到几十个,看起来很有说服力。真正的问题是这份列表是否覆盖正常负载,以及过滤器在目标内核上是否按预期加载。

过滤器不是完整沙箱

seccomp-bpf能够依据系统调用号和部分参数作决策。它不替代文件权限、资源配额、网络策略或容器身份。KILL_PROCESS终止的是当前进程线程组,不能直接写成整棵子进程树都被清理。

默认拒绝需要经过负载采样和异常路径测试。只测一次Python启动,会漏掉动态加载、线程、DNS、字体和异常处理。反过来,全盘允许clone等调用也可能扩大范围,应按架构和运行时分析参数。

10月23日OpenAI的隔离说明采用多层边界思路。这里借用的是职责分离原则,不把它的内部部署效果当作自己的测试结果。

seccomp策略收紧之前,先检查你到底允许了什么的边界与处理流程

图只说明调用进入规则后分支,底部明确进程组与子进程树的区别。

离线审查一个简化策略对象

以下是可离线运行的最小示例,使用Python标准库。输入均为教学构造,不连接业务系统。

def audit(profile):
    if profile.get("defaultAction") != "SCMP_ACT_ERRNO":
        return False
    allowed = set()
    for rule in profile.get("syscalls", []):
        if rule.get("action") != "SCMP_ACT_ALLOW":
            return False
        allowed.update(rule.get("names", []))
    forbidden = {"ptrace", "mount", "bpf"}
    return bool(allowed) and not (allowed & forbidden)

p = {"defaultAction": "SCMP_ACT_ERRNO", "syscalls": [
    {"names": ["read", "write"], "action": "SCMP_ACT_ALLOW"}
]}
assert audit(p)
assert not audit(dict(p, defaultAction="SCMP_ACT_ALLOW"))
assert not audit({"defaultAction": "SCMP_ACT_ERRNO", "syscalls": [
    {"names": ["bpf"], "action": "SCMP_ACT_ALLOW"}
]})
print("3 policy audit cases passed; policy was not loaded")

代码仅审查本文约定的简化配置。允许read/write的示例不足以运行Python,不应直接作为部署策略。实际OCI规范和体系结构也未由这个字典审查器验证。

加载成功与业务可用分别记录

Linux侧需要记录过滤器是否生效、被拒系统调用的返回值,以及正常任务在错误路径是否还能完成。清理残留进程要使用运行时生命周期和资源组管理,不依赖一句“已发送信号”。

本机为macOS,未加载seccomp、AppArmor或容器策略。没有内核实测、攻击面减少百分比或逃逸防护保证。

参考资料

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值