我为何构建 RunSeal:别再让本地编码代理“裸奔”
内容提要
本地编码代理以普通子进程运行时,可读取SSH密钥、云凭证等敏感文件,确认提示因审批疲劳而失效。Docker等方案性能差、跨平台支持弱。RunSeal是操作系统原生沙箱,无需虚拟机即可毫秒级启动,将文件访问限制在工作区内,通过托管代理控制出站流量,能力不足时立即失败而非静默降级,并记录本地审计日志。
延伸解读
审批疲劳:安全确认为何形同虚设
文章指出,编码代理以普通子进程运行时,其权限与终端用户相同,可读取SSH密钥、云凭证等敏感文件。而频繁的[Y/n]确认提示会因审批疲劳而失效:一次复杂调试可能触发数十条命令,用户很快会无意识地狂按回车。一旦遭遇注入攻击,批准操作的可能正是用户自己,最终责任也由用户承担。这揭示了单纯依赖交互确认的安全模式存在根本缺陷。
现有隔离方案的局限与权衡
文章分析了Docker等方案的不足:在macOS上跨VM文件系统I/O缓慢,且本地工具链被隔离在外;开放出站网络又可能导致凭证泄露。基于正则的命令黑名单易被$IFS、Base64等技巧绕过。多数开源脚本仅支持Linux,在macOS和Windows上无法提供隔离。网络策略往往只有全通或全断两种极端,难以兼顾安全与开发效率。
RunSeal的设计原则:原生、遏制、可控、失败关闭
RunSeal不启动虚拟机或守护进程,直接调用操作系统原语,实现亚毫秒级启动。文件访问被限制在工作区内,内核会拒绝越界读取。网络方面,通过托管代理强制所有出站流量,支持域名白名单和凭证脱敏。若主机能力不足,RunSeal会立即失败而非静默降级,确保安全边界不被削弱。这些设计旨在平衡安全性与本地开发体验。
实践中的使用与审计
RunSeal提供简洁的CLI,可通过runseal capabilities探测主机支持的安全级别和网络模式。执行命令时可指定策略和网络模式,例如将命令限制在工作区内并禁用网络。若命令尝试越界读取,内核会直接拒绝,通过--json可获取结构化结果。每次调用都会记录不可变的本地JSONL审计日志,包含策略哈希、网络决策和退出状态,便于追溯和自动化集成。
Q&A
为什么本地编码代理以普通子进程运行会带来安全风险?
因为代理以普通子进程运行时,拥有与终端用户相同的权限,可以读取SSH密钥、云凭证等敏感文件,而操作系统的确认提示因审批疲劳而失效,无法有效阻止恶意操作。
RunSeal 是什么?它的主要目标是什么?
RunSeal 是一个操作系统原生的、策略治理的本地命令执行环境,目标是在操作系统内核层面将代理的访问严格限制在当前工作区内,无需启动虚拟机,也不牺牲本地执行速度。
RunSeal 如何实现毫秒级启动且无需虚拟化?
RunSeal 不启动虚拟机,也不运行持久后台守护进程,而是直接调用操作系统原语:Windows 使用受限令牌、作业对象和自定义 ACL;macOS 使用 Seatbelt;Linux 结合 Bubblewrap 和 Landlock。由于在操作系统层原生执行,没有虚拟化开销,启动延迟为亚毫秒级。
RunSeal 的工作区包含(workspace containment)是如何工作的?
在文件系统层,RunSeal 将访问规范为四个沙箱级别:只读、工作区写入、工作区包含和显式退出的 danger-full-access。核心级别 workspace-contained 下,进程只能看到当前工作区目录、私有临时运行时根、显式声明的只读路径和最小系统基线工具;主机其他位置(如 ~/.ssh、~/.aws)不可见或拒绝访问,即使代理被注入攻击尝试读取,内核也会立即拒绝。
RunSeal 的 network.proxy 模式有什么作用?
network.proxy 模式禁止直接连接外部公共 IP 和域名,阻止未经授权的本地回环和主机 IPC,所有出站流量强制通过指定的托管代理端点。代理可以执行域名允许列表、编辑泄露的 API 凭证并生成结构化审计记录,防止代理静默连接外部 C2 服务器。
RunSeal 的 fail-closed 策略是什么?为什么重要?
fail-closed 策略指如果调用者请求 workspace-contained 和 network.proxy,但主机环境缺乏权限或内核支持来保证边界,RunSeal 会立即失败并退出显式错误,而不是静默降级为无限制执行。这避免了假装安全而实际不安全的危险失败模式。
如何使用 RunSeal 运行一个受限命令?
使用 runseal exec 命令,指定策略和网络模式,例如:runseal exec --policy workspace-contained --network disabled --cwd /path -- python3 test_pipeline.py。如果命令尝试读取工作区外文件,内核会直接拒绝,默认模式下终端不显示错误,但通过 --json 可以查看完整结果。
RunSeal 的审计日志记录哪些信息?
每次调用都会将策略参数、规范策略哈希、网络决策和退出状态记录到不可变的本地 JSONL 审计跟踪中,每个事件还包括 execution_id、session_id、policy_epoch 等字段。