AI Agent 安全最佳实践 — 16项安全检查清单,防患于未然
AI Agent 拥有执行代码、访问文件系统、调用 API 的能力。一旦被恶意利用,可能导致:
| 威胁类型 | 描述 | 风险等级 |
|---|---|---|
| Prompt Injection | 通过恶意输入诱导 Agent 执行非预期操作 | 🔴 高 |
| TOCTOU 竞态 | 检查和使用之间的状态变化被利用 | 🔴 高 |
| 供应链攻击 | 恶意 Skill/MCP Server 伪装成合法工具 | 🔴 高 |
| 权限提升 | Agent 被诱导执行超出权限的操作 | 🟡 中 |
| 数据泄露 | 敏感信息被意外暴露到日志或输出中 | 🟡 中 |
| 拒绝服务 | Agent 被诱导执行无限循环或资源耗尽操作 | 🟡 中 |
exec、eval、system 等危险函数调用TOCTOU(Time of Check to Time of Use)是 Agent 安全中的独特威胁:
// TOCTOU 攻击示例
// 1. Agent 检查文件内容(安全)
content = readFile("config.json") // 此时文件是安全的
// 2. 攻击者在检查后、使用前替换文件内容
// symlink attack 或 文件替换
// 3. Agent 使用被篡改的内容(危险!)
execute(content) // 此时文件已被篡改
// ✅ 正确:原子性操作
// 使用文件锁或一次性读取+执行
const content = readFileSync("config.json") // 同步读取
validate(content) // 立即验证
execute(content) // 立即使用
// ❌ 错误:分离的检查和使用
const isSafe = checkFile("config.json") // 检查
// ... 中间可能被篡改 ...
const content = readFile("config.json") // 使用
if (isSafe) execute(content)
MCP Server 是 Agent 最大的攻击面之一。审计要点:
#!/bin/bash
# MCP Server 安全审计脚本
echo "=== MCP Server 安全审计 ==="
# 1. 检查配置中的 MCP Servers
echo "[1] 列出所有 MCP Server..."
cat ~/.openclaw/config.json | jq '.mcpServers'
# 2. 检查是否有可疑的网络连接
echo "[2] 检查网络连接..."
for server in $(cat ~/.openclaw/config.json | jq -r '.mcpServers | keys[]'); do
cmd=$(cat ~/.openclaw/config.json | jq -r ".mcpServers[\"$server\"].command")
echo " Server: $server → Command: $cmd"
done
# 3. 检查环境变量泄露
echo "[3] 检查环境变量..."
cat ~/.openclaw/config.json | jq '.mcpServers[].env' | grep -i "key\|token\|secret\|password"
# 4. 检查文件权限
echo "[4] 检查配置文件权限..."
ls -la ~/.openclaw/config.json
echo "=== 审计完成 ==="
NVIDIA 开源的 SkillSpector 是目前最全面的 Skill 安全扫描工具:
# 安装 SkillSpector
npm install -g @nvidia/skillspector
# 扫描单个 Skill
skillspector scan ./my-skill
# 扫描已安装的所有 Skills
skillspector scan ~/.openclaw/skills/
# 扫描 ClawHub 上的 Skill
skillspector scan --remote clawhub/weather
# 生成详细报告
skillspector scan ./my-skill --format html --output report.html
| 严重级别 | 说明 | 处理方式 |
|---|---|---|
| 🔴 Critical | 明确的安全漏洞 | 立即修复或删除 |
| 🟠 High | 高风险问题 | 尽快修复 |
| 🟡 Medium | 中等风险 | 计划修复 |
| 🟢 Low | 低风险/信息 | 评估后决定 |
// ✅ 验证所有外部输入
function processInput(input) {
// 类型检查
if (typeof input !== 'string') throw new Error('Invalid type');
// 长度限制
if (input.length > 10000) throw new Error('Input too long');
// 内容过滤
if (/[;&|`$()]/.test(input)) throw new Error('Invalid characters');
// 清理后使用
return sanitize(input);
}
// ✅ 只请求必需的权限
{
"name": "my-skill",
"permissions": ["read:files"], // 只读
"paths": ["/home/user/docs"] // 限定目录
}
// ❌ 过度授权
{
"name": "my-skill",
"permissions": ["read:files", "write:files", "exec:commands"],
"paths": ["/"] // 整个文件系统
}
// ✅ 日志中不包含敏感信息
logger.info(`Processing file: ${filename}`)
// ❌ 日志泄露凭证
logger.info(`API Key: ${apiKey}, Processing: ${filename}`)
将安全检查集成到 CI/CD 流程中:
# .github/workflows/security.yml
name: Skill Security Scan
on:
pull_request:
paths: ['skills/**']
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install SkillSpector
run: npm install -g @nvidia/skillspector
- name: Scan Skills
run: skillspector scan ./skills/ --fail-on high