news 2026/9/25 3:23:48

just-bash威胁模型深度拆解:AI Agent沙盒的3类攻击者与5道信任边界

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
just-bash威胁模型深度拆解:AI Agent沙盒的3类攻击者与5道信任边界

just-bash威胁模型深度拆解:AI Agent沙盒的3类攻击者与5道信任边界

【免费下载链接】just-bashBash for Agents项目地址: https://gitcode.com/gh_mirrors/ju/just-bash

just-bash 是一个为 AI Agent 打造的沙盒 Bash 解释器——用 TypeScript 实现、内置内存虚拟文件系统,让 AI 可以安全地执行 shell 命令而不触碰真实系统。它的 THREAT_MODEL.md 完整定义了这套 AI Agent 沙盒的威胁模型:3 类攻击者、5 道信任边界,以及层层设防的防御纵深。下面带你快速读懂这份安全设计。

一、先认识 just-bash:为什么 AI Agent 需要沙盒 Bash

让 AI Agent 直接在你的机器上跑 bash 是危险的:一条rm -rf /、一次意外的路径穿越,就可能造成不可逆损失。

just-bash 的思路很直接:把 bash 整个"虚拟化"掉。它用 TypeScript 重写了解析器、解释器和约 79 个内置命令,运行在一个只存在于内存中的 Unix 风格文件系统里(默认提供/home/user、/bin、/tmp等目录结构),整个代码库中没有任何一处导入child_process——也就是说,不存在从脚本到宿主进程的路径。这一点可以从 THREAT_MODEL.md 的架构图直观看到:沙盒与宿主之间的网络、文件系统、子进程通道全部被切断。

核心入口在 packages/just-bash/src/Bash.ts,安全相关的默认值(如虚拟化的 pid/uid、资源上限)也在这里注入。

二、威胁模型第一步:识别 3 类攻击者 🎯

官方威胁模型把攻击者划分为三类,信任级别全部为零:

1️⃣ 不受信任的脚本作者(主要攻击者)

这是最核心的威胁:提交任意 bash 脚本的 AI Agent 或用户。它可以构造任何合法(甚至非法)的 bash 语法,目标是逃逸沙盒、读取宿主文件、窃取密钥、执行任意代码或发起拒绝服务攻击。

2️⃣ 恶意数据源

攻击不一定来自脚本本身,也可能来自脚本消费的数据——HTTP 响应、文件内容、stdin。这类数据会流经变量展开、变量赋值和命令参数,可能被精心构造以触发原型链污染(prototype pollution)、IFS 注入、文件名路径穿越等漏洞。

3️⃣ 被入侵的依赖(供应链攻击者)

修改 npm 依赖的供应链攻击者可以在 import 时执行任意代码。威胁模型明确将其列为"运行时防御之外"的问题——它属于部署层面的关注点,靠 lockfile、依赖审计等手段解决,而非沙盒本身。

这个三分法很实用:它告诉你哪些要防、哪些要隔离、哪些要外包给供应链安全流程。

三、5 道信任边界:攻击者必须在哪儿"过关卡" 🔒

just-bash 把沙盒内部划分为 5 道关键信任边界(详见 THREAT_MODEL.md#L81-L90),每道边界都有明确的数据流和强制规则:

边界数据流攻击面核心防御
TB1脚本输入 → 解析器词法炸弹、深层嵌套、超大脚本10 万 token 上限、解析深度 200、输入 1MB 封顶(src/parser/types.ts)
TB2解释器 → 文件系统路径穿越、符号链接逃逸、写入宿主OverlayFs 内存写入、allowSymlinks默认拒绝、isPathWithinRoot()根目录校验
TB3解释器 → 网络任意外联、SSRF、响应炸弹网络默认关闭;开启后 URL 必须过前缀允许列表,每次跳转逐一校验
TB4解释器 → 宿主进程派生子进程、读环境变量、触达 Node 内部 API架构层面"零路径":无child_process,process.*、eval等被纵深防御拦截
TB5数据 → 变量/键空间原型链污染(__proto__作键名)环境变量用Map,AWK/关联数组用 null-prototype 对象,杜绝constructor注入

其中 TB1 的资源限额集中在 packages/just-bash/src/limits.ts,而 TB2 的根目录校验与符号链接策略实现在 packages/just-bash/src/fs/ 下(如 overlay-fs、real-fs-utils.ts)。

四、防御纵深:这些经典攻击会撞在哪层墙上 🛡️

THREAT_MODEL.md 第 6 节用 23 个具体攻击场景做了"攻防推演"(见 THREAT_MODEL.md#L354-L380),几个典型判例:

  • cat /etc/passwd→ OverlayFs 判定路径不在沙盒根内 →ENOENT,被文件系统层拦截
  • ln -s /etc/passwd x符号链接逃逸→ 符号链接默认拒绝 →EPERM,被链接策略拦截
  • while true; do :; done死循环→ 循环迭代上限 10K → 抛错,被执行限额拦截
  • arr[__proto__]=evil原型链污染→ 键空间使用 Map/null-prototype → 无效,被数据守卫拦截
  • import('data:text/javascript,...')动态导入→ 上下文感知的 loader hook 拦截 →纵深防御拦截
  • [[ $str =~ evil_regex ]]正则拒绝服务→ re2js 线性时间正则引擎(src/regex/user-regex.ts)无灾难性回溯,被引擎特性拦截

特别值得一提的是 TB4 的设计哲学:主防御是"架构上不存在从 bash 解释到 JS 执行的路径",而Function、eval、process.binding、WebAssembly、Proxy等全局对象的拦截(blocked-globals.ts、defense-in-depth-box.ts)只是次级纵深防御——官方坦承 monkey-patch 本身可被绕过,所以它被明确定位为"第二道墙"而非"唯一一道墙"。

五、诚实披露:已知残余风险 ⚠️

真正专业的威胁模型会承认自己的缺口,THREAT_MODEL.md 第 4 节也不例外:

  • 动态import()的防御强度随运行时能力变化:它是语言级关键字,无法被 Proxy 拦截,需依赖node:module.registerHooks()上下文感知 hook;部署时应调用getStatus()确认level: "full"
  • 提前捕获的引用:若代码在纵深防御激活前就持有Function引用,可绕过代理——再次印证"主防御靠架构,不靠 patch"
  • Python WASM 执行面(可选开启,风险 MEDIUM):默认关闭;开启后通过全新 Worker、30 秒超时、移除ctypes/动态链接等编译期裁剪实现"构造上隔离"
  • 信号与作业控制(trap、&/fg/bg):安全测试覆盖有限;因不派生真实进程,信号仅在虚拟模型内运作
  • Unicode 边界情况:无效 UTF-8、RTL 覆盖字符属展示/混淆攻击,非执行逃逸向量

这些"已知但可控"的取舍,正是评估一个沙盒能否用于生产的重要参考。

六、延伸阅读:跟着源码读懂这套安全体系 📚

  • 威胁模型全文(本文底稿):THREAT_MODEL.md
  • 安全防御实现:packages/just-bash/src/security/(含attacks/攻击样本、fuzzing/模糊测试、prototype-pollution/污染用例)
  • 资源限额配置:packages/just-bash/src/limits.ts
  • 安全模型使用文档:packages/just-bash/README.md("Security Model" 章节)
  • 实战参考:examples/bash-agent/ 展示了用 just-bash 搭建 AI Agent 终端,examples/executor-tools/ 演示了将 bash 能力暴露为 Agent 工具

一句话总结:just-bash 的威胁模型把"AI Agent 能干什么坏事"拆成了 3 类攻击者 × 5 道信任边界的矩阵,用"架构无路径 + 虚拟文件系统 + 资源限额 + 纵深防御"四层防线逐一收口,并诚实地标注了残余风险——这就是把它交给 AI 跑命令时,你可以放心的理由。

【免费下载链接】just-bashBash for Agents项目地址: https://gitcode.com/gh_mirrors/ju/just-bash

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 3:20:01

Oceanology_FluidNinja水体波纹交互条件

插件:Oceanology_Plugin、WaterInteractionPlugin、FluidNinjaLive一、可以实现水体波纹交互的条件1.必须是蓝图 2.蓝图轴心也可产生交互,要不想要轴心交互需将模型体碰撞复杂度改为“将复杂碰撞改为简单碰撞” 3.必须是UE自带的几何体才会产生交互&…

作者头像 李华