很多人问我最近在折腾什么,我说在给 AI 助手“配技能”,对方一脸茫然——直到我提到 security-audit-skill,做安全审计的朋友才恍然大悟:原来是把安全审计的经验固化成 AI 能直接调用的技能包。这个方向很有意思,我把整个设计和踩坑过程完整记录下来,希望能给同样在搞 AI 安全、Agent 技能开发的朋友一些可复用的思路。
先说结论:security-audit-skill 是一个面向 AI 编程助手的“安全审计技能包”,把代码审计、依赖安全检查、敏感信息识别这些经验写成结构化的 skill 文件,让 Claude Code、Codex、OpenCode 这类 Agent 工具在遇到审计类任务时,能像调用一个资深安全工程师的“大脑”一样,按规范流程执行检查,而不是靠模型临场发挥。它解决的问题很直接:大模型虽然懂安全知识,但审计时常常漏项、误报、流程混乱,尤其是面对大型代码库时不知道从哪里下手。这个技能包就是给 AI 的“审计作业指导书”。
它适合谁?三类人最值得关注:一是做安全研发的工程师,想把团队审计规范沉淀成可复用资产;二是用 AI 辅助写代码但担心引入漏洞的开发者;三是对 Agent 技能(skill)开发感兴趣的玩家,想看看一个生产级 skill 是怎么设计出来的。
1. 项目整体设计与思路拆解
1.1 为什么安全审计要“技能化”,而不是靠写 Prompt
很多人一开始不理解:安全审计不就是给 AI 一段 Prompt 让它查漏洞吗?为什么非要做一个 skill?我最初也这么想,直到在实际项目里试了几轮才发现,Prompt 和 skill 的差距非常大。
普通 Prompt 是一次性的,模型只能在当前对话上下文里“临时发挥”,审计逻辑全指望模型自己的安全意识。但模型对“审计”的理解飘忽不定——你让它查 SQL 注入,它可能只盯着字符串拼接,忘了参数化查询的边界情况;你让它做依赖检查,它甚至不知道要先读 package-lock.json 还是 requirements.txt。这些都是靠模型“自由发挥”带来的不可控。
skill 不一样,它本质上是把审计流程、检查规则、输出格式、工具调用方式全部结构化打包。模型加载 skill 后,等于拿到一份“操作手册”,先做什么后做什么、每个环节怎么判断、结果怎么输出,全都有明确指令。实测下来,同样的审计任务,用 skill 比用普通 Prompt 的漏洞检出率明显更高,误报率也更低。
另一个关键差异是可维护性。安全审计规则更新频繁——新漏洞类型、新框架特性、新的不良实践,都需要持续补充。如果写成 Prompt,每次更新都要改一大段文本,还容易在复制粘贴中出错。skill 做成目录结构后,审计规则可以拆分成独立文件,改一个文件就行,其他部分完全不受影响。
1.2 skill 的能力边界:哪些审计能交给 AI,哪些不能
我在设计这个项目时有很清晰的边界意识。AI 审计目前可靠的是“已知模式匹配”和“流程化检查”,比如:硬编码密钥识别、OWASP Top 10 中常见的注入模式、依赖版本漏洞比对、危险函数调用检测。
至于需要深入业务逻辑推理的审计——比如复杂的越权问题、多步攻击链、业务层面的设计缺陷,AI 目前只能做“提示”和“辅助分析”,不能替代人工判断。这不是模型不行,而是安全审计本身的核心就是“理解业务意图”,而 AI 对业务意图的理解始终是概率性的。
所以我给 security-audit-skill 的定位是:高效的“第一道筛子”和“审计助手”。它负责把代码库里可疑的点全部标记出来,把审计报告初稿整理好,把检查清单逐项过一遍,然后人工在它的基础上做深入验证。这种定位让 skill 的价值最大化,也避免了“AI 说没漏洞就真的没有”的风险。
设计方案上,我采用“规则目录 + 检查清单 + 报告模板 + 工具调用”的组合结构。规则目录负责定义审计面,检查清单确保不遗漏,报告模板统一输出格式,工具调用让 AI 能实际读取文件、执行命令、查询漏洞库。四层结构配合,能让审计过程既灵活又规范。
1.3 对比通用 Agent 和专用审计 Agent 的取舍
开发过程中我一度纠结:是做一个通用的“安全审计 Agent”,还是做一个轻量的“审计 skill”?前者听起来更强大,但复杂度也高得多——要考虑 Agent 的记忆管理、对话策略、多轮规划,开发成本成倍增长。
Skill 方案的优势在于轻量和可组合。它不试图接管整个对话,而是“在需要时被调用”。比如你在 Claude Code 里写代码,写完想快速过一遍安全基线,直接在对话里触发 security-audit-skill,它就开始跑审计;跑完你继续写代码,互不干扰。这种“即插即用”的体验更符合实际工作流。
另外,skill 可以被不同工具复用。同一个 skill 包,我试过在 Claude Code 和 OpenCode 里都能正常加载,只是各自的加载方式略有差异。如果做成了专用 Agent,换一个前端环境基本等于重写。对想沉淀方法论的人来说,skill 是更划算的格式。
2. 核心细节解析与实操要点
2.1 skill 的目录结构:从 SKILL.md 到规则文件
security-audit-skill 的目录结构是整个项目的地基,我最终采用这样的组织方式:
security-audit-skill/ ├── SKILL.md ├── rules/ │ ├── injection.md │ ├── auth.md │ ├── crypto.md │ ├── secrets.md │ └── supply-chain.md ├── templates/ │ ├── audit-report.md │ └── checklist.md └── scripts/ ├── scan_secrets.py └── check_dependencies.pySKILL.md 是所有 AI 工具都要优先读取的入口文件,相当于 skill 的“说明书+大脑”。里面定义了技能的名称、触发条件、执行流程、输出格式要求。rules/ 目录放细分领域的审计规则,每个文件聚焦一类安全问题;templates/ 放输出模板;scripts/ 放可执行的辅助脚本。
这个结构参考了 Anthropic 官方 Agent Skills 的最佳实践,但做了安全审计领域的定制。核心思路是:让 AI 先读 SKILL.md 建立全局认知,再根据任务类型去 rules/ 里查具体的检查项,最后用 templates/ 里的格式输出结果。三层配合,既不会让 AI 一次读太多内容导致上下文爆炸,又能保证每个环节都有据可依。
2.2 SKILL.md 编写的几个关键设计
SKILL.md 是整个 skill 的灵魂,我写了三版才基本满意。第一版全是规则罗列,AI 执行时还是抓不住重点;第二版加入了流程控制,好了一些;第三版增加了“输入-处理-输出”三段式结构,效果才真正稳定。
三段式结构是这样的:
- 输入识别:明确这个 skill 处理哪些任务——代码审计、依赖检查、密钥扫描、安全基线核查。
- 处理流程:规定审计的固定步骤——先全局统计风险面,再逐类检查,最后交叉验证。
- 输出规范:要求输出审计报告,按严重程度分级,必须包含问题位置、风险描述、修复建议、参考链接。
其中“处理流程”部分我用了强制优先级,告诉 AI 按“先做依赖扫描,再做敏感信息检查,最后做业务逻辑审计”的顺序执行。为什么这样排?因为依赖扫描和密钥检查是纯机械活,AI 完成度高、出错概率低,先做完能给后面的人工审计缩小范围。而且这两类问题通常最紧急——依赖漏洞可能被远程利用,密钥泄漏等于大门敞开。
SKILL.md 还写了“明确不做什么”,比如不执行破坏性命令、不自动修改代码、不对业务逻辑做最终裁决。把边界划清楚,AI 就不会在审计过程中“越权办事”,这是很多自定义 skill 容易忽略的点。
2.3 审计规则的编写方法论:从查案例到抽规律
rules/ 目录下的每个文件都遵循一个统一框架:问题定义、检索方法、判断标准、修复建议。以注入类检查为例,injection.md 中定义了 SQL 注入、命令注入、模板注入的常见模式,并给出了具体的检索指令——告诉 AI 要 grep 哪些关键词、关注哪些函数调用链、什么样的上下文才算真正危险。
写规则时最容易犯的错是“只给关键词,不给上下文判断逻辑”。比如让 AI 查 eval() 函数,如果只写一句“找出代码里所有 eval() 调用”,那结果必然是一堆误报。正确的做法是把判断逻辑写清楚:eval() 的参数是否来自用户输入?是否经过了白名单校验?是否在服务端执行且使用了特权上下文?只有让 AI 按这些条件层层过滤,输出才有参考价值。
规则文件里的判断标准我大量使用了“是/否/不确定”三态设计。AI 审计时如果证据不足,允许输出“不确定”而不是强行下结论。这个设计在实战中非常有用——它杜绝了模型“不懂装懂”的习惯,让人工复核时能快速聚焦到最有风险的点上。
2.4 工具链集成:让 AI “能动手”而不是“光看代码”
光靠 AI 读代码做审计,很多问题发现不了。比如依赖库的漏洞,代码里根本看不出问题,必须去查漏洞数据库;再比如硬编码密钥,需要扫描整个代码库所有文件,而不只是 AI 当前打开的那几个。
所以我在 skill 里集成了几个轻量脚本。scan_secrets.py 负责全库扫描高敏感模式——AWS Access Key、GitHub Token、私钥开头、数据库连接串等,用的是正则+熵值检测组合方案。check_dependencies.py 负责读取依赖清单文件(package.json、requirements.txt、go.mod 等),然后调用公开漏洞库的 API 做版本比对。
集成方式上,我只是在 SKILL.md 和规则文件里“告知” AI 可以调用这些脚本,并给出了调用条件——当审计任务涉及密钥扫描时自动执行 scan_secrets.py,涉及依赖检查时执行 check_dependencies.py。AI 工具本身具备执行命令的能力,只要 skill 说明清楚,它就能自主完成调用,不需要额外的插件机制。
2.5 输出报告模板:让审计结果“能落地”而不是“一堆废话”
审计报告模板我改了很多次,原因是 AI 默认的输出风格“太教科书”——大段描述性文字,关键信息藏在中间,人工复核要花大量时间找重点。
我最终把报告模板设计成紧凑的问题清单格式,每条包含:编号、风险等级、文件路径、行号、风险类型、简要描述、修复建议。同时要求 AI 在报告顶部先给出“审计摘要”,用三到五句话说明整体风险状况和优先处理建议。这种格式下,人工复核一份中等规模项目的审计报告只需要十几分钟,效率提升非常明显。
模板里还加了“通过项摘要”一节。很多审计工具只报问题,不报通过项,但实际审计中“证明某个区域是安全的”同样重要——它能让人工复核时知道哪些区域可以放心跳过,从而把精力集中在真正可疑的位置。
3. 实操过程与核心环节实现
3.1 环境准备:把这些工具装齐再动手
正式实操前,先把环境准备好。我用的组合是 Claude Code 作为主力前端,OpenCode 作为备选测试环境。两者都原生支持自定义 skill 加载,区别在于加载路径和配置方式。
Claude Code 中,我把 security-audit-skill 放在项目的.claude/skills/目录下,然后按官方规范配置了 SKILL.md 的 frontmatter。OpenCode 的加载方式稍有不同,需要在配置里指定 skill 的路径,但本质逻辑一样——让工具能找到 SKILL.md 文件。
辅助工具方面,我建议至少装好 Python 3.10+,因为扫描脚本是用 Python 写的;另外建议装一个 jq 或类似的 JSON 处理工具,方便查看依赖漏洞 API 返回的结果。Node 环境也建议留着,很多项目依赖分析需要它。
3.2 实战演练一:代码仓库安全基线审计
第一个实战是给一个 Node.js 项目做安全基线审计。项目规模不大,约 40 个源文件,但代码风格比较乱,直接人工审的话得花半天。我把任务交给了 Claude Code,在对话中触发 security-audit-skill。
触发后,AI 先读取了 SKILL.md,然后按流程开始工作。第一步是全局扫描,统计了项目结构、依赖清单、入口文件;第二步是执行 check_dependencies.py,比对出两个高危依赖版本;第三步是调用 scan_secrets.py,扫出一处疑似 AWS 密钥;第四步才是人工规则检查,逐个文件过注入点和认证逻辑。
整个过程大约 8 分钟,输出了一份 15 条问题的审计报告,其中高严重级别 4 条。我花了半小时复核,发现两处误报——一个看似危险的 eval() 调用实际上参数经过了严格的类型校验,安全性可以接受;但依赖和密钥这两个问题是实打实的,修复优先级很高。这个结果验证了 skill 的核心价值:它能快速锁定高价值问题,让人工精力花在“判断”而不是“寻找”上。
3.3 实战演练二:供应链依赖专项审计
第二个场景是供应链依赖审计,这是 security-audit-skill 里我觉得最有实用价值的一项。原因是现在开源生态事故频发——恶意包投毒、依赖漏洞被利用、许可证风险,都值得关注。
skill 的 supply-chain.md 规则里定义了依赖审计的执行流程:先列出所有直接依赖和传递依赖,再分别查询漏洞库、检测可疑版本、检查许可证兼容性。AI 在实战中的表现让我印象很深——它不只是做了版本比对,还主动分析了依赖之间的传递关系,找出了一个“间接依赖版本锁定不当”的隐患。
还有一次测试中,我故意在 package.json 里引了一个存在已知漏洞的库版本,skill 准确地标记出来了,并给出了升级到修复版本的建议。最让我满意的是,AI 能区分“直接依赖的安全责任”和“传递依赖的缓解措施”——这是很多初学审计的人都不一定能理清楚的概念。
3.4 从零编写一个最小可用的 security-audit-skill
如果你也想自己动手,我建议从最小可用版本开始,不要一上来就搞几十个规则文件。下面是一个能在 Claude Code 类工具里直接跑起来的最小 SKILL.md 骨架:
--- name: security-audit-skill description: 对项目代码进行快速安全审计,检查常见漏洞、敏感信息和依赖风险。在用户要求安全审查、代码审计、漏洞排查时使用。 metadata: version: 0.1.0 author: your-name tags: [security, audit, code-review] --- # Security Audit Skill ## 工作流程 1. 先分析项目结构和依赖清单,确认技术栈。 2. 检查所有代码文件中的注入类风险(SQL注入、命令注入、模板注入)。 3. 检查硬编码密钥、Token、私钥等敏感信息。 4. 检查认证授权相关逻辑(登录、权限校验、会话管理)。 5. 检查依赖文件版本,标记存在已知漏洞的依赖。 6. 输出审计报告,按严重程度分级。 ## 输出格式 必须按以下格式输出,不得省略任何字段: ### 审计摘要 一句话概述整体风险状况 ### 风险问题列表 | 严重程度 | 文件路径 | 行号 | 问题类型 | 描述 | 修复建议 | |---------|---------|------|---------|------|---------| | 高/中/低 | path | line | type | desc | suggestion | ### 通过项摘要 简要说明哪些环节未发现问题,方便人工快速确认。这个骨架我故意没把规则写得特别细,目的是先让流程跑通——AI 能否正确识别触发条件、能否按步骤执行、能否输出规范报告。跑通后再逐条加规则,每加一条都要实测验证效果,而不是写完就完事。
3.5 参数调优与规则迭代中的几次重要调整
第一次用最小版本测试时,最大的问题是误报率偏高。AI 把很多“看起来危险但实际安全”的代码标成了风险。典型例子是 ORM 框架的参数绑定写法,AI 误判为 SQL 拼接。我调整了规则文件,加入了“先识别 ORM 类型再判断拼接方式”的前置步骤,误报率立刻降了下来。
第二次调整是关于输出格式的。最初模板要求 AI 输出每条问题的“完整分析过程”,导致报告冗长难读。后来我改成“结论前置+细节可追问”的策略——报告里只给关键信息,如果需要 AI 展开分析某条问题,再单独追问。这种交互方式更符合实际审计节奏。
第三次是性能优化。最初让 AI 一次性扫描所有文件,小项目还行,大项目直接上下文溢出。后来我在工作流里加了“分批扫描”逻辑——按目录或按文件类型分批处理,每批完成后把结果汇总到临时清单,最后统一输出。这个改动让 skill 可以应对更大规模的代码库。
4. 常见问题与排查技巧实录
4.1 skill 不生效或没被 AI 识别
这是最多人踩的坑。你在 Claude Code 里输入“帮我安全审计一下”,AI 却完全没有调用 skill 的迹象——要么直接把问题当普通对话处理,要么干脆说不支持。
遇到这种情况,第一先检查 SKILL.md 的 frontmatter 格式。name 和 description 字段是 AI 判断“什么时候该用这个 skill”的关键。description 写得越具体越容易触发,比如“在用户要求以下内容时使用:安全检查、代码审计、漏洞排查、密钥扫描、依赖风险评估”,比干巴巴的“安全审计”管用得多。
第二检查文件路径。不同工具对 skill 目录的约定不一样,Claude Code 认.claude/skills/,OpenCode 需要在配置里手动指定。如果路径不对,AI 再聪明也找不到文件。
第三,有些工具需要重启会话才能加载新 skill。改完 SKILL.md 后如果不生效,先重启试试,别急着怀疑是自己写错了。
4.2 上下文过长导致审计中断
处理大型项目时,AI 在审计过程中突然“失忆”——忘记前面的扫描结果,或者干脆报错退出,这通常是上下文长度达到上限。
我的解决方案是“外部化中间结果”。要求 AI 在每一步扫描完成后,把结果写入临时文件(比如audit-notes.md),后续步骤从文件里读取数据,而不是把所有内容都保留在对话上下文里。这样即使前面某些细节被截断,最终报告依然能基于已保存的中间结果生成。
另外,把 rules/ 目录里的规则文件设计成“按需读取”也有帮助。SKILL.md 里面不要一股脑列所有规则,而是给出一个“规则索引”,让 AI 根据当前审计的任务类型去读对应的文件。上下文省下来,能支撑的审计范围就大很多。
4.3 误报率高的排查思路
误报率高是安全审计 skill 最容易遇到的问题。排查时要先确认误报是哪一类——是“规则本身有问题”还是“AI 没按规则执行”。
如果是规则问题,把误报案例整理出来,反推规则里缺少哪个判断条件。比如前面提到的 ORM 误判,就是规则里没写“先识别数据访问层类型”。对照误报案例,补上前置判断条件,规则就更精确。
如果是执行问题,检查 SKILL.md 里的工作流描述是否足够强制。AI 有时候会“省步骤”,跳过了规则文件中要求的某个前置检查。这时候可以把工作流改成“必须按顺序执行,未完成上一步不得进入下一步”的表述,并在输出格式里要求 AI 汇报当前执行到第几步,方便追踪。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| skill 完全不被触发 | frontmatter 缺失或 description 不具体 | 完善 SKILL.md 元信息,明确触发场景 |
| skill 被触发但流程混乱 | 工作流描述不够强制 | 用“必须”“不得”等指令明确顺序 |
| 误报率过高 | 规则缺少上下文判断条件 | 分析误报案例,补充前置判断逻辑 |
| 漏报真实漏洞 | 规则覆盖范围不够 | 对照实际漏洞案例扩展规则库 |
| 上下文溢出审计中断 | 中间结果全部留在对话里 | 把中间结果写入外部文件 |
| 输出报告难读 | 模板设计不合理 | 改成表格化、结论前置的紧凑格式 |
| 依赖扫描报错 | 漏洞库 API 限制或网络问题 | 加异常处理,设置重试和降级逻辑 |
4.5 一个容易忽略的坑:报告中的“建议”别当真
最后分享一个重要的经验:skill 生成的审计报告里,“修复建议”这部分参考价值要高一些,但直接照抄要谨慎。AI 给出的建议通常符合安全最佳实践,但未必贴合你项目的实际情况——它可能不了解你的业务约束、性能要求、兼容性限制。
我的用法是让 skill 给出“建议方向”和“参考链接”,具体修复方案由我和团队人工确认后再落地。这样的流程既保留了 AI 的效率优势,又避免了“自动修复”带来的风险。毕竟安全审计的最终目的是保障业务安全运行,而不是为了“让报告好看”。
5. 后续可以这样扩展
5.1 增加自定义检查规则和团队规范库
如果你的团队有自己的一套编码规范或安全红线,完全可以把它们追加到 skill 的规则库里。做法很简单,在 rules/ 目录下新增一个team-policies.md,把团队的强制规范写清楚,然后在 SKILL.md 的工作流里加一步“检查是否符合团队自定义规范”。
这样 skill 就从“通用安全工具”变成了“团队安全管家”。新人写代码时让 AI 跑一遍,等于有资深安全工程师在线把关,团队的安全基线自然就能拉齐。我在两个团队里试过这个玩法,效果非常明显——新代码里引入低级安全问题的概率大幅下降。
5.2 结合 CI/CD 做自动化门禁
更进阶的玩法是把 skill 接进 CI/CD 流程。虽然现在主流做法是用现成的 SAST 工具(比如 Semgrep、CodeQL)做静态扫描,但 skill 化方案有个独特优势——它能输出“人工可读的上下文分析”,而不仅是“x 行有漏洞”这样的冷冰冰的结果。
我的设想是在代码提交时触发一个自动化流程:先跑 security-audit-skill 做基础检查,把报告存入流水线产物;同时在提交说明里附上 AI 生成的“变更影响评估”。评审人点开就能看到这次代码改动涉及了哪些风险面、AI 建议重点看哪几处,评审效率和体验都会好很多。这个扩展方向我已经在部分项目里做原型验证了,后面稳定了再单独写一篇实操细节。
根据我个人的实际体会,做 security-audit-skill 最大的收获其实不是“审计效率提升了几倍”,而是让我重新思考了人机协作的边界——AI 负责把安全审计中最耗精力的“搜索-枚举-比对”环节自动化,人专注在最核心的“判断-决策-修复”上。这种分工,才是这类 skill 真正的价值所在。踩过几次坑之后我越来越确定:未来的安全审计一定不是“全人工”或“全自动”,而是“AI辅助人决策”的混合模式,而 skill 正是这个模式最好的载体。