妙趣导读:2026年5月18日凌晨2点33分,我突然从梦里惊醒——我写的那个Skill里,是不是把API Key硬编码进去了?那一刻的冷汗,比Debug三天三夜还多。安全不是选修课,是生死线。本文教你如何写出安全的Agent Skills。
📋 为什么Skills安全很重要?
⚠️ 真实风险场景
- 敏感信息泄露 - Skill代码中硬编码的API Key、密码被公开到GitHub
- 命令注入 - 未经验证的用户输入直接拼接到shell命令
- 权限滥用 - Skill申请了超出需求的系统权限
- 恶意依赖 - 引入了含有后门的第三方包
- 数据泄露 - Skill无意中读取并上传了用户隐私文件
🛡️ 安全风险清单
1. 敏感信息硬编码
风险:将API Key、密码等写入代码并推送到公开仓库
错误示例:
# ❌ 错误 - 硬编码敏感信息
const apiKey = "sk-8c9a771dfac5ce26a4ec12b3d7d8f7a5";
const dbPassword = "mySecretPassword123";
正确做法:
# ✅ 正确 - 使用环境变量
const apiKey = process.env.API_KEY;
const dbPassword = process.env.DB_PASSWORD;
// 并在SKILL.md中说明需要配置的环境变量
2. 命令注入漏洞
风险:用户输入未经验证直接拼接到shell命令
# ❌ 错误 - 命令注入风险
const userInput = req.body.filename;
exec(`rm -rf ${userInput}`); // 如果用户输入:"~/.ssh; cat /etc/passwd"
# ✅ 正确 - 使用参数化或验证
const path = require('path');
const safePath = path.resolve('/allowed/dir', userInput);
exec(`rm -rf ${safePath}`);
3. 过度权限申请
风险:Skill申请了不需要的权限(如读写全磁盘)
# ❌ 错误 - 过度权限
{
"permissions": ["filesystem:read", "filesystem:write", "network", "system"]
}
# ✅ 正确 - 最小权限原则
{
"permissions": ["filesystem:read:/var/www/miaoquai/tools"]
}
🔍 使用安全扫描器
妙趣AI开发了openclaw-skill-security-scanner,自动化检测Skills安全问题:
# 安装扫描器
npm install -g openclaw-skill-security-scanner
# 扫描单个Skill
openclaw-skill-security-scanner scan ./my-skill/
# 扫描整个Skills目录
openclaw-skill-security-scanner scan /path/to/skills/
# 生成详细报告
openclaw-skill-security-scanner scan ./my-skill/ --output report.json --format json
安全评分系统
A-F
扫描器会根据以下维度给出A-F的安全评分:
- A - 无安全问题(90-100分)
- B - 轻微问题(70-89分)
- C - 需要关注(50-69分)
- D - 存在风险(30-49分)
- F - 严重漏洞(0-29分)
💡 安全最佳实践
✅ 开发阶段
- 使用
.env.example模板,不要提交真实的.env文件 - 在
.gitignore中添加敏感文件规则 - 定期使用安全扫描器检查代码
- 引入依赖前检查其安全性和维护状态
✅ SKILL.md规范
- 在SKILL.md中明确声明所需权限
- 说明需要配置的环境变量及其用途
- 提供安全配置示例(不包含真实凭据)
- 添加安全相关的最佳实践提示
📋 发布前安全检查清单
- ☐ 运行openclaw-skill-security-scanner获得A/B评分
- ☐ 检查代码中没有硬编码的敏感信息
- ☐ 验证所有外部输入都经过处理
- ☐ 确认权限申请遵循最小权限原则
- ☐ 检查依赖包是否有已知漏洞(npm audit)
- ☐ 在沙箱环境中测试Skill行为
🚨 应急响应
如果发现Skill存在安全问题:
1. 立即从公开仓库删除或设为private
2. 撤销所有泄露的API Key/密码
3. 检查是否有异常