返回博客

把 AI 配置当成攻击面:对 Agent 运行环境做安全扫描

我们习惯对应用代码做安全审查——检查 SQL 注入、鉴权漏洞、密钥硬编码。但当一个 AI Agent 开始拥有执行 shell 命令、读写本地文件、调用外部 API 的能力,有一块地方几乎没人审查:Agent 的运行环境配置本身

权限清单、指令文件、MCP 服务器配置、Hooks 脚本——这些文件控制着 Agent 能做什么、不能做什么。一旦写错,轻则 Agent 行为失控,重则成为提示注入或供应链攻击的入口。

配置文件是一类新的攻击面

传统应用的攻击面大致分两层:运行时代码(逻辑漏洞)和基础设施配置(权限设置、网络规则)。AI Agent 引入了第三层:指令层

这一层的特殊性在于,它以自然语言和半结构化文本为主,传统静态分析工具对它几乎无感。但危险是实实在在的:

  • 权限过宽:允许列表里写了 Bash(*),等于对 Agent 开放了无限制的 shell 访问,任何一条被注入的指令都可以执行
  • 密钥硬编码:把 API key 直接写进配置文件而非环境变量,这一条和普通应用代码的老问题一模一样,只是发生的地方换了
  • Hooks 命令注入:Hooks 脚本里用 ${file} 这类插值构造命令,如果输入来自外部(比如文件名),就是一个经典的命令注入向量
  • 提示注入入口:指令文件里包含「自动执行」类的指令,攻击者通过构造特定内容就可以劫持 Agent 的行为

这些问题不需要黑客入侵服务器,只需要一个能影响 Agent 读到的内容的人,就可以触发。

像扫代码一样扫配置

好的做法是把 Agent 配置纳入和代码同等的安全审查流程:每次修改配置后扫一次,上线前扫一次,挂进 CI 自动扫。

AgentShield 是专门针对 AI Agent 配置做静态分析的工具,覆盖:权限清单里的通配符滥用、密钥硬编码、MCP 服务器的供应链风险(比如 npx -y 自动安装未固定版本)、Hooks 里的命令注入、以及 Agent 定义文件里的工具访问范围。

它输出一个 A~F 的安全评分,并给出分级别的修复建议。关键的一点是它区分了「可以自动修复的」和「需要人工判断的」——前者包括把硬编码密钥替换为环境变量引用、把通配符权限收窄到具体范围;后者则是那些需要根据业务逻辑判断取舍的地方,工具只给出建议,不擅自改动。

把扫描挂进 CI,而不是只在「感觉有必要时」跑一次

安全检查最大的陷阱是依赖人的记忆和自觉性。把 npx ecc-agentshield scan --min-severity medium 加进 CI 流水线,每次提交配置变更时自动触发,才是真正的基线保障。单靠「我记得检查一下」,在项目快速迭代时几乎必然会有遗漏。

最小权限是 Agent 配置的第一原则

扫描工具能帮你发现问题,但更根本的是在设计 Agent 配置时就遵循最小权限原则:

权限只给刚好够用的范围,而不是「先给宽再慢慢收」——因为在实际项目里,「慢慢收」几乎不会发生。Bash(git status)Bash(git *) 更安全,后者比 Bash(*) 更安全,差异不是形式上的,是真实的攻击面大小。

拒绝列表和允许列表要同时维护。只有允许列表,等于假设自己列举完了所有需要控制的操作;加上拒绝列表,至少能兜住那些「我没想到但明显不该做」的操作。

外部来源的内容不能直接进指令。MCP 服务器、Hooks 里的变量插值、从外部读入的文件名——凡是来自「外部」的数据流入指令执行路径,都需要额外审查。这和 Web 安全里「不信任用户输入」是同一条原则,只是场景换了。

一句话心法

AI Agent 的配置文件是指令层的代码,最小权限、密钥不硬编码、外部输入不直接进执行路径——这三条老原则,在新场景里仍然成立。