我的 Skill 里躺着 5 枚明文 API Key:一次 AI 技能安全审计实录
事情的起因很日常:我攒了一堆自己用的 AI Skill(技能包),最近想在多台机器、多个 Agent 环境之间迁移它们。迁移前我让一个专门做技能审计的工具(skill-auditor)把它们扫了一遍——结果有点难看。
两个技能,判定都是「不行」。
审计抓到了什么
最严重的一条,是我的主力搜索技能 mega-research 吃了 V1 阻断项:config.json 里明文躺着 5 枚 API 密钥。
如果只是躺在那里也就算了。问题在于:这个目录是要被打包、迁移、备份的。审计报告指出,我上周做的一份技能备份里同样有这 5 枚密钥——泄露面在持续扩大。报告的建议毫不客气:尽快吊销轮换。
其余的问题虽然没那么惊悚,但清单拉出来也挺长:
- 运行时和联网需求没声明(换台机器跑不起来都不知道为什么)
- 没声明是否调用外部 LLM(审计维度 D4.1,数据安全的基本要求)
- 文档里的示例命令用了相对路径,但没写"以 skill 根目录为基准"(换个工作目录执行就出错)
- 输出目录同名已存在时是覆盖还是报错,没写死
- 缺 MANIFEST 参数清单和安装确认段
有意思的是,扫描还报了两条警告,人工复核后发现是误报——它把我归档技能里的分类桶名"99_待定"当成了没写完的 TODO 标记。这个细节挺重要:审计工具的输出是证据,不是判决,最后还得人来看。
核心矛盾:密钥怎么跟着 Skill 走
修别的问题都是体力活,真正的难题是 V1。我的需求很具体:密钥必须能跟着 skill 文件夹一起迁移——我有好几台机器、好几个 Agent 环境,不想每换一台机器就重新配一遍密钥。但"跟着走"和"安全"天然是矛盾的。
把主流处理模式摆开对比,按"迁移方便 × 安全性"排开:
| 模式 | 密钥放哪 | 迁移体验 | 安全性 | 成本 |
|---|---|---|---|---|
| ① 明文 config.json | skill 目录内 | 拷文件夹就走 | 备份/分享/上传全泄露 | 零 |
| ② 环境变量 | 系统/用户 env | 每台机器重配一遍 | 不落盘,很安全 | 每台机器手动设 |
| ③ 密钥外置文件 | skill 目录外单独放 | 拷 skill + 一个 secrets 文件 | skill 目录可安全分享 | 几乎零 |
| ④ 加密文件随行 | skill 内放加密后的 config.age | 拷文件夹 + 记一个主密码 | 备份/分享也只是密文 | 需装 age |
| ⑤ 密码管理器 CLI | 云端保险库 | 任何机器登录即取,零拷贝 | 最高 | 需账号 + 装 CLI |
但我的诉求是"迁移时一个文件夹带走所有东西",所以最终选了 模式 ④:age 加密密钥库随行。age 是个现代的文件加密工具(FiloSottile/age,就是干这个的),思路是:密钥加密成 config.age 直接放 skill 里,密文随便备份、随便传,解密只需要我脑子里的一个主密码。
落地:age 密钥库 + 三级查找链
具体方案:
- 5 枚密钥全部加密进
config.age,原config.json只留空占位结构——占位结构本身成了"这里该配什么"的自文档; - 运行时密钥加载改成三级查找链:环境变量(最高优先)→ config.age(需主密码)→ 空占位;
- 新增一个
age_vault.py管理脚本(加密/验证/更新密钥)和一个doctor.py(新机器上自检环境是否就绪); - 以后迁移 = 拷文件夹 + 新机器
pip install pyrage+ 输一次主密码,齐活。
改完之后做了三组实测:正确密码解出全部 5 枚 key ✓;错误密码被拒止 ✓;没给主密码时给出明确引导而不是诡异的报错 ✓。
最后一步也最容易被忽略:清理历史泄露。两处备份目录、审计报告的证据段、变更单里引用过的密钥,全部脱敏,然后全局 grep 确认无一处明文残留。改了新方案却留着旧备份里的明文,等于没改。
顺带把其余审计项全修了:补上运行时声明、LLM 调用声明、路径基准说明、同名覆盖策略、MANIFEST。最终扫描两个技能 BLOCK=0 / WARN=0,总判定从「不行」翻转为「行」。
一个有点meta的番外
审计过程中还有条暗线:这个审计工具本身也在被修缮。我让一个模型给它提了 P2/P3 改进建议,再让另一个模型对比新旧版本逐文件 diff、合并其中有价值的部分、修掉剩下的问题——包括一个编号冲突(D5.2 在两个文件里指不同的条款)、一类误报分级(文档里作为反面示例出现的 rm -rf 不该判阻断,但也不该静默,降级为警告并标注"文档命中")。
最后是 8 个回归测试夹具守着这些判定逻辑,防止下次改动又把误报放出来。AI 审 AI 的技能,AI 再修这个审计工具——这套协作流程跑下来意外的顺。
收个尾
如果你也在攒自己的 Skill 库,三个建议:
- 迁移前一定先审一遍。密钥、硬编码路径、未声明的依赖,这些问题在原地用时永远不发作,一迁移全爆。
- 密钥管理的选型本质是回答一个问题:你的迁移频率有多高。一年挪一次的用环境变量就好;天天在多台机器间倒腾的,age 加密随行是目前体验和安全性平衡得最好的方案。
- 工具给证据,人下判决。审计工具的误报要人工复核,它的"阻断项"也可能有上下文——但明文密钥这种,闭眼修就对了。
本文基于真实的审计与整改记录整理,密钥、路径等敏感信息均已脱敏。