
把系统调用列表压到几十个,看起来很有说服力。真正的问题是这份列表是否覆盖正常负载,以及过滤器在目标内核上是否按预期加载。
过滤器不是完整沙箱
seccomp-bpf能够依据系统调用号和部分参数作决策。它不替代文件权限、资源配额、网络策略或容器身份。KILL_PROCESS终止的是当前进程线程组,不能直接写成整棵子进程树都被清理。
默认拒绝需要经过负载采样和异常路径测试。只测一次Python启动,会漏掉动态加载、线程、DNS、字体和异常处理。反过来,全盘允许clone等调用也可能扩大范围,应按架构和运行时分析参数。
10月23日OpenAI的隔离说明采用多层边界思路。这里借用的是职责分离原则,不把它的内部部署效果当作自己的测试结果。

图只说明调用进入规则后分支,底部明确进程组与子进程树的区别。
离线审查一个简化策略对象
以下是可离线运行的最小示例,使用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或容器策略。没有内核实测、攻击面减少百分比或逃逸防护保证。
本文探讨seccomp-bpf系统调用过滤策略的实际有效性验证方法,强调策略需覆盖真实负载路径(如动态加载、线程、DNS等),指出其非完整沙箱的局限性——不替代文件权限、网络策略或进程树清理。提出离线审查简化策略对象、区分加载成功与业务可用性、记录被拒调用及错误路径行为等关键实践,并提醒内核侧日志与生命周期管理的重要性。

310

被折叠的 条评论
为什么被折叠?



