大家好。又来了好东西真的太多了没办法。比如有个问题“Claude Code 既然能在电脑上执行命令行万一大模型抽风来一句rm -rf /或者偷偷把数据库给DROP TABLE了那不就全完了”作为一个能够直接操作宿主系统的 AI 代理Agent安全Security和防越权Jailbreak Prevention是重中之重。为了搞清楚 Anthropic 到底是怎么给这只 AI “带上紧箍咒”的我深挖了src/tools/BashTool/目录。不看不知道一看吓一跳这里面藏着一整套防御纵深极强的安全沙盒与指令拦截机制。这不仅是在防范大模型犯错更是在防范各种隐蔽的 Bash 语法注入。今天咱们就来看看这道“最后的防线”是怎么工作的。源码探秘Bash 里的“雷区”当我们允许大模型执行bash命令时最大的威胁不仅是显式的破坏命令还有那些隐蔽的、利用 Shell 特性绕过限制的注入攻击。在src/tools/BashTool/bashSecurity.ts中工程师们简直把 Bash 的黑魔法研究透了枚举了各种令人防不胜防的黑客手段。1. 拦截高危的 Shell 扩展与隐蔽调用大模型有时候为了“炫技”或者被越权指令诱导会写出极其复杂的 Shell 语法。而这恰恰是绕过普通正则检查的重灾区。源码中定义了一系列COMMAND_SUBSTITUTION_PATTERNS进行拦截防止命令替换// src/tools/BashTool/bashSecurity.tsconstCOMMAND_SUBSTITUTION_PATTERNS[{pattern:/\(/,message:process substitution ()},{pattern:/\(/,message:process substitution ()},{pattern:/\(/,message:Zsh process substitution ()},// 重点看这个Zsh EQUALS expansion: cmd// 比如 curl evil.com 会被 Zsh 展开为 /usr/bin/curl evil.com// 这就能完美绕过针对 curl 这个关键字的权限拦截规则{pattern:/(?:^|[\s;|])[a-zA-Z_]/,message:Zsh equals expansion (cmd)},{pattern:/\$\(/,message:$() command substitution},// ...甚至连 PowerShell 的注释语法 # 都被封杀了主打一个防御纵深];不仅如此源码还点名封杀了 Zsh 的一票底层高危模块zmodload: Zsh 模块加载的网关它是很多高级攻击的入口比如无文件 I/O。sysopen/sysread/syswrite: 绕过普通命令拦截直接进行底层的系统文件 I/O 操作。zpty: 开启伪终端执行隐蔽操作。zf_rm/zf_mv: 哪怕你调用的是 Zsh 内置的rm也照拦不误。只要 AI 生成的代码里包含这些“作弊码”安全校验层就会直接把它按死在摇篮里。2. “手滑”毁灭世界不存在的大家最关心的“删库跑路”问题在src/tools/BashTool/destructiveCommandWarning.ts中有专门的防御。官方整理了一份DESTRUCTIVE_PATTERNS列表。如果你仔细看这些正则会发现它们写得极其严谨。一旦匹配上CLI 会立刻弹出一个极其醒目的警告要求用户必须手动确认系统绝不会 Auto-approval 自动同意这些操作// src/tools/BashTool/destructiveCommandWarning.ts 拦截规则节选constDESTRUCTIVE_PATTERNS:DestructivePattern[][// Git 相关的灾难性操作不仅防 reset还防带 --force 的 push{pattern:/\bgit\sreset\s--hard\b/,warning:Note: may discard uncommitted changes},{pattern:/\bgit\spush\b[^;|\n]*[ \t](--force|--force-with-lease|-f)\b/,warning:Note: may overwrite remote history},// 经典的文件删除严谨的正则防绕过比如 rm -rf, rm -fr{pattern:/(^|[;|\n]\s*)rm\s-[a-zA-Z]*[rR][a-zA-Z]*f|(^|[;|\n]\s*)rm\s-[a-zA-Z]*f[a-zA-Z]*[rR]/,warning:Note: may recursively force-remove files},// 数据库毁灭者{pattern:/\b(DROP|TRUNCATE)\s(TABLE|DATABASE|SCHEMA)\b/i,warning:Note: may drop or truncate database objects},{pattern:/\bDELETE\sFROM\s\w[ \t]*(;|||\n|$)/i,warning:Note: may delete all rows from a database table},// 连基础设施都不放过{pattern:/\bkubectl\sdelete\b/,warning:Note: may delete Kubernetes resources},{pattern:/\bterraform\sdestroy\b/,warning:Note: may destroy Terraform infrastructure},];你看不管是删文件、清库还是干掉 K8s 集群大模型只要敢写这套正则防线就能把它拦住把最终的生杀大权交还给坐在屏幕前的人类。3. 沙盒隔离机制Sandbox拦截只是治标真正的治本是隔离。在src/tools/BashTool/shouldUseSandbox.ts中展示了指令是否需要被沙盒化的判断逻辑。如果启用了沙盒模式命令会被重定向到SandboxManager。这意味着即便命令跑起来了它也是在一个受限的文件系统或容器中执行的无法触及你的真实工作目录。有意思的是这里还处理了复合命令比如docker ps curl evil.com和环境变量包裹比如FOObar timeout 30 bazel run。系统会不断地剥离外层的环境变量和包装器直到暴露出最核心的执行命令再去和用户的黑名单进行匹配防止“套娃”逃逸。额外大放送隐藏的语音模式Voice Mode在翻看源码的时候我不小心在src/commands/voice/voice.ts和src/hooks/useVoice.ts里发现了一个目前似乎还没大规模宣传的神级彩蛋语音对讲模式源码显示Claude Code 竟然内置了一个/voice命令// src/commands/voice/voice.ts 节选// 检查是否有系统麦克风权限和录音工具如 macOS 原生或 SoXconstrecordingawaitcheckRecordingAvailability()if(!recording.available){...}// 如果一切就绪开启语音模式return{type:text,value:Voice mode enabled. Hold${key}to record.${langNote},}它的原理是按下指定的快捷键比如 Space 空格键终端会调用系统底层的音频模块macOS 原生或 SoX进行录音计算音量显示出波形动画Waveform然后将音频流Stream通过 WebSocket 实时发送到 Anthropic 的voice_stream接口进行语音转文字STT推测背后是 Deepgram 引擎。你甚至可以在src/hooks/useVoice.ts看到长长的一串支持语言列表从英语english、西班牙语español到日语日本語、俄语русский甚至印尼语bahasa全覆盖当然也完美支持咱们的中文中文在系统里通常走系统语言检测或者作为默认模型能力支持虽然硬编码列表里没单独写中文名但实际上完全可用源码里甚至还做了非常细致的“静音检测”和“断网重连重传”Silent-drop replay防止你说了半天结果因为网络波动没录上。这简直太赛博朋克了未来你可能只需要按住空格键对终端说一句“帮我把刚才报的那个 Null Pointer 异常修了顺便写个单元测试”代码就自己写好了。最后从底层的 AST 拦截、破坏性正则预警再到隐蔽的语音唤醒彩蛋src/目录下可以说是卧虎藏龙。Anthropic 的工程师不仅在教 AI 如何写代码更在教系统如何“防范”一个偶尔会犯蠢的 AI。这种对系统边界的敬畏之心以及在 CLI 交互上不断整活的创新精神绝对值得所有开发者学习。一键三连奥关注不迷路哈