🔒 Agent Skills 安全审计指南

AI Agent 安全最佳实践 — 16项安全检查清单,防患于未然

为什么 Agent 安全如此重要?

AI Agent 拥有执行代码、访问文件系统、调用 API 的能力。一旦被恶意利用,可能导致:

🚨 真实案例:2026年6月,NVIDIA SkillSpector 扫描发现 ClawHub 上 67,453 个 Skills 中,约 3.2% 存在不同程度的安全问题,其中 0.5% 被标记为高风险。

威胁模型

威胁类型描述风险等级
Prompt Injection通过恶意输入诱导 Agent 执行非预期操作🔴 高
TOCTOU 竞态检查和使用之间的状态变化被利用🔴 高
供应链攻击恶意 Skill/MCP Server 伪装成合法工具🔴 高
权限提升Agent 被诱导执行超出权限的操作🟡 中
数据泄露敏感信息被意外暴露到日志或输出中🟡 中
拒绝服务Agent 被诱导执行无限循环或资源耗尽操作🟡 中

16 项安全检查清单

A. 命令安全

B. 凭证安全

C. 网络安全

D. 权限控制

TOCTOU 竞态条件防护

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 安全审计

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 "=== 审计完成 ==="

SkillSpector 扫描

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低风险/信息评估后决定

安全编码最佳实践

1. 输入验证

// ✅ 验证所有外部输入
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);
}

2. 最小权限原则

// ✅ 只请求必需的权限
{
  "name": "my-skill",
  "permissions": ["read:files"],  // 只读
  "paths": ["/home/user/docs"]    // 限定目录
}

// ❌ 过度授权
{
  "name": "my-skill",
  "permissions": ["read:files", "write:files", "exec:commands"],
  "paths": ["/"]  // 整个文件系统
}

3. 日志脱敏

// ✅ 日志中不包含敏感信息
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
⚠️ 安全提醒:
  • 不要在公开仓库中存储 API Key 或 Token
  • 定期轮换凭证(至少每90天)
  • 启用 GitHub 的 Dependabot 和 Secret Scanning
  • 监控 Agent 的异常行为模式

📖 相关术语

🛡️ AI Guardrails⚔️ 攻击面分析💉 Prompt注入

📚 相关踩坑实录

😅 AI Agent踩坑大全😱 运维噩梦📖 更多踩坑实录