Skill 发布上架前安全自检
在将 Skill 发布上架前,必须对技能目录进行全面的敏感信息扫描和脱敏处理。
本技能提供自动化的扫描能力,覆盖四大类敏感信息。
触发场景
在以下场景主动使用本技能:
- 用户说"帮我检查这个 Skill 有没有安全问题"
- 用户准备发布/上架一个 Skill,需要预检
- 用户提到"脱敏"、"敏感信息扫描"、"安全检查"
- 用户上传了 Skill 文件,需要检查是否包含泄露风险
- 对应英文触发词:pre-publish check, security scan, sensitive data, sanitize, mask secrets
使用流程
第一步:定位技能目录
确定需要检查的 Skill 目录路径。如果用户未提供,询问用户或检测当前工作区是否存在 Skill 结构(SKILL.md 存在即可能是 Skill 目录)。
第二步:运行安全扫描
使用 scripts/security_scan.py 对目标目录进行扫描。
# 基本扫描(文本报告,最常用)
python3 scripts/security_scan.py <skill-directory>
# 生成 HTML 报告(可视化,推荐)
python3 scripts/security_scan.py <skill-directory> --format html --output scan-report.html
# 生成中文 HTML 报告
python3 scripts/security_scan.py <skill-directory> --format html --lang zh --output scan-report-zh.html
# 生成 JSON 报告(程序化处理)
python3 scripts/security_scan.py <skill-directory> --format json --output scan-report.json
# 只显示 HIGH 及以上级别的问题
python3 scripts/security_scan.py <skill-directory> --severity high
# 排除特定文件
python3 scripts/security_scan.py <skill-directory> --exclude "*.test.js" --exclude "test-data/"
# 中文报告(支持 text 和 html 格式)
python3 scripts/security_scan.py <skill-directory> --lang zh
python3 scripts/security_scan.py <skill-directory> --format html --lang zh --output report-zh.html
--lang 参数说明:
- en(默认):英文报告
- zh:中文报告(所有 UI 标签、类别名称、检测类型、修复建议均翻译为中文)
扫描输出说明:
- 退出码 0:通过(无问题或仅在阈值以下)
- 退出码 1:发现需要关注的问题
- 退出码 2:扫描器错误(路径无效等)
跳过特定行:在 skill-directory 根目录下创建 .security-scan-ignore 文件,
每行写一个正则表达式,匹配到的行将被跳过(不参与扫描)。
以 # 开头的行视为注释。
.security-scan-ignore 示例:
# 跳过包含示例 AWS Key 的行
AKIA[A-Z0-9]{16}
# 跳过包含示例手机号的中文行
1[3-9]\d{9}
第三步:解读扫描报告
报告按四个维度组织:
按严重程度(Severity):
- [!!!] CRITICAL — 必须修复,禁止上架(真实密钥、身份证号、信用卡号等)
- [!!] HIGH — 应该修复(Token、密码、Authorization 头等)
- [!] MEDIUM — 建议修复(邮箱、手机号、比特币地址等)
- [ ] LOW — 审查即可(内网 IP、Debug 标记等)
按类别(Category):
1. Developer & System Credentials — 开发者凭证
2. PII — 个人身份信息
3. Financial & Sensitive Data — 财务敏感数据
4. Runtime Logs & User Input — 运行日志与用户输入
第四步:修复问题
针对扫描报告中的每个发现,按以下方式修复:
开发者凭证类:
# 修复前(危险)
AWS_SECRET_ACCESS_KEY = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
# 修复后(安全)
AWS_SECRET_ACCESS_KEY = os.environ.get("AWS_SECRET_ACCESS_KEY")
# 或在文档中使用占位符:
# AWS_SECRET_ACCESS_KEY=<EXAMPLE-SECRET-PLACEHOLDER>
PII 类:
# 修复前(危险)
user_email = "john.doe@gmail.com"
# 修复后(安全)
user_email = "user@example.com" # example.com 域名会被过滤
phone = "138-0013-8000" # 带分隔符,不会触发检测
财务数据类:
# 修复前(危险)
credit_card = "4111111111111111"
# 修复后(安全)
credit_card = "xxxx-xxxx-xxxx-xxxx" # 明显非真实数据
运行日志类:
# 修复前(危险)
print(f"User password is: {password}")
console.log("Authorization:", token)
# 修复后(安全)
# 直接删除调试语句,或改为:
logger.info("User authentication processed") # 不输出敏感值
第五步(可选):自动脱敏
对于确认需要脱敏的文件,可以使用 --mask 模式自动处理(危险操作,先备份!):
# 务必先备份
cp -r my-skill/ my-skill-backup/
# 执行自动脱敏(会直接修改文件!)
python3 scripts/security_scan.py my-skill/ --mask
第六步:重新扫描验证
修复完成后,重新运行扫描确认所有 CRITICAL 和 HIGH 级别问题已修复:
python3 scripts/security_scan.py <skill-directory> --severity high
# 退出码为 0 且无 HIGH 及以上问题即可通过
四大类敏感信息详细说明
第一类:开发者与系统凭证
极易遗漏的硬编码风险,是最危险的一类。
检测内容包括:
- AWS Access Key ID / Secret Access Key
- Google API Key / OAuth Token
- GitHub / GitLab 访问 Token
- Slack Token / Webhook URL
- Stripe API Key
- Twilio Account SID
- 各类私钥文件内容(PEM 格式私钥块,以 -----BEGIN 开头、-----END 结尾)
- 数据库连接字符串(含用户名密码)
- JWT Secret / 各类 secret_key 赋值
- 环境变量中的真实值
常见漏检场景:
- .env / .env.production 文件中残留的真实值
- config.py / settings.py 中的硬编码
- 代码示例(SKILL.md 的 ``` 块)中包含真实 Token
- curl 命令中的真实 Authorization 头
- JSON 配置文件中的真实值
第二类:用户个人身份信息(PII)
检测内容包括:
- 邮箱地址(自动过滤 example.com 等安全域名)
- 中国手机号(1[3-9]xxxxxxxxx)
- 中国身份证号(18位,含校验位)
- 中国护照号(E/K/G/D + 8位数字)
- 美国 SSN(XXX-XX-XXXX)
- 国际电话号码
第三类:财务与高度敏感数据
检测内容包括:
- 信用卡号(13-19位数字,通过 Luhn 校验)
- CVV / CVC 安全码
- 比特币钱包地址
- 以太坊钱包地址
第四类:运行日志与用户输入数据
隐性泄露风险,通常较隐蔽但可能暴露用户信息或系统内部细节。
检测内容包括:
- console.log / print() 语句中引用了敏感变量名
- 堆栈跟踪(Stack Trace)片段
- Debug / TRACE 输出标记
- Cookie 值赋值
- Authorization 请求头中的真实 Token
- Session ID
- 硬编码的用户输入中包含真实邮箱
- 内网 IP 地址(暴露网络拓扑)
参考资料
详细介绍各类敏感信息的检测模式、常见误报场景和修复建议:
→ 读取 references/sensitive_data_patterns.md
发布前人工复查清单
即使自动化扫描通过,仍建议人工复查以下项目:
- [ ]
SKILL.md中的代码示例是否包含真实 Token / Key - [ ]
references/目录中的文档是否包含真实用户信息 - [ ]
.env.example文件中的值是否为占位符(非真实值) - [ ] 测试用例中是否使用了
example.com等安全域名 - [ ] 是否存在 Base64 编码后的敏感信息(扫描器可能无法检测编码后的数据)
- [ ] 第三方服务的 Webhook URL 是否为测试环境地址
- [ ]
scripts/目录中是否有残留的调试语句未删除
注意事项
- 先备份再
--mask:自动脱敏会直接修改文件,务必先备份 - example.com 是安全的:扫描器会自动过滤
example.com/test.org等安全域名的邮箱 - Luhn 校验:信用卡号检测会通过 Luhn 算法校验,降低误报率
- 去重逻辑:同一段文本被多个规则匹配时,扫描器会自动去重,保留优先级最高的规则结果
- 中文开发场景:特别加强了对中国身份证号、手机号、护照号、微信/腾讯云密钥等的检测
- .security-scan-ignore:在扫描目标根目录创建此文件,可跳过特定行的扫描(详见第二步)
```