1. 小程序安全审计为什么需要自动化 Skill小程序上线节奏快一个版本迭代可能只隔两三天但代码包里塞进去的东西一点没少硬编码的 AppSecret、写死的测试环境域名、把加密逻辑放在前端做、接口连鉴权字段都懒得校验。人工翻一遍反编译产物光是app-service.js那种几万行的混淆文件就够看半天更别说还要交叉比对接口和加密实现。我试过纯手工审计一个中等规模的小程序从反编译到出报告花了整整两天结果还漏了一个藏在utils/里的 AES 密钥。问题不在于能力而在于重复劳动太多——正则能扫出来的东西没必要靠眼睛盯。小程序全自动安全审计 Skill 解决的就是这个把反编译、资产扫描、敏感信息提取、接口梳理、加密研判、漏洞检测、报告生成串成一条流水线用脚本保证规则覆盖率用 LLM 做上下文关联和误报过滤。它适合三类人做甲方安全建设的同学想把它塞进 CI做渗透测试的同学想快速摸清目标资产还有做小程序开发的同学想在上线前自查一遍。核心检索词先明确小程序安全审计指的是对小程序代码包wxapkg和运行时行为做静态分析覆盖敏感信息泄露、接口越权、高危漏洞、加密缺陷四类风险。这套 Skill 的定位是纯静态、零网络请求、不生成攻击代码所以合规上不用担心。整个框架是 7 个 Agent 协作反编译、敏感信息扫描、接口提取、加密分析、漏洞挖掘、自定义分析、报告生成。Phase 2 阶段四个分析 Agent 并行跑Phase 2.5 在用户指定了重点接口或参数时触发定向深度分析。输出是双层报告——主报告只放关键发现独立文档保留全量数据。下面按接入到出报告的完整链路拆开讲每一步都给可复制的配置和验证动作。2. TaoToken 前置准备与 Skill 运行环境搭建这套 Skill 依赖 Claude Code CLI 环境而 Claude Code 需要配置模型接入。这里用 TaoToken 做统一入口它提供兼容 Anthropic 的 API 端点配置一次就能在 Claude Code、Cline、Codex 这些工具里复用。先拿 Key。打开 https://taotoken.net/api-keys 登录后创建一个 API Key复制出来。注意这个 Key 只在创建时完整显示一次丢了就得重建。然后配置 Claude Code 的环境变量。在 Windows 上可以用系统环境变量也可以直接在项目目录建.claude/settings.json。推荐后者因为可以跟着项目走{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }三个字段对应三件套Base URL 指向 TaoToken 的 API 端点Key 用刚才创建的Model ID 按你订阅的模型填。如果你用的是 Coding Plan模型 ID 可以在 https://taotoken.net/coding-plan 查到当前可用的列表。配置完验证一下连通性claude --version claude -p 回复 ok如果返回ok说明模型接入正常。如果报 401检查 Key 有没有复制完整如果报local proxy failed检查 Base URL 是不是写成了带路径的形式正确写法就是https://taotoken.net/api不要加/v1之类的后缀。接下来装 Skill。把项目克隆到 Claude Code 的 Skill 目录git clone https://github.com/sssmmmwww/wxmini-security-audit.git克隆后需要自己获取unveilr.exe微信小程序反编译工具放进tools/目录tools/ └── unveilr.exeunveilr是第三方开源工具从它的项目页获取即可。运行环境要求Claude Code CLI支持 Agent Teams / Skill、Python 3.x只用标准库不需要 pip install、Windows 平台当前版本依赖 unveilr.exe。Python 脚本这块不用额外装包endpoint_extractor.py和secret_scanner.py都只用标准库这也是它能在 CI 里跑起来的原因之一——不需要维护依赖树。环境搭好后目录结构大概是这样wxmini-security-audit/ ├── SKILL.md ├── agents/ │ ├── agent-01-decompile.md │ ├── agent-02-secret.md │ ├── agent-03-endpoint.md │ ├── agent-04-crypto.md │ ├── agent-05-vuln.md │ ├── agent-06-report.md │ └── agent-07-custom.md ├── scripts/ │ ├── endpoint_extractor.py │ └── secret_scanner.py └── tools/ └── unveilr.exe确认SKILL.md存在Claude Code 启动时会自动加载 Skill 目录下的定义。如果没加载检查 Skill 目录路径是不是放在了~/.claude/skills/或者项目级的.claude/skills/下。3. 可复制的审计 Skill 配置与规则清单这一节给完整的配置片段和规则清单直接抄就能用。3.1 Skill 触发配置在 Claude Code 里Skill 的触发靠自然语言指令。基础审计指令审计这个小程序 D:\wechat\miniapp\wxapkg_files指定重点接口自动触发 Phase 2.5 深度分析帮我分析这个小程序 D:\wxapp重点看一下 /api/user/login 接口携带抓包信息做关联分析分析这个小程序 D:\wxappBurp 抓包发现 /api/pay 接口的 amount 参数可以篡改指定安全关注点分析这个小程序 D:\wxapp关注支付安全和越权风险3.2 敏感信息扫描规则清单secret_scanner.py用正则做第一层扫描规则覆盖以下几类规则类型匹配目标示例模式云服务 Key阿里云/腾讯云 AccessKeyLTAI[A-Za-z0-9]{12,}微信凭证AppSecret、MchKeyappsecret[]?\s*[:]\s*[][a-f0-9]{32}数据库连接JDBC/MySQL 串jdbc:mysql://[^]加密密钥AES/DES Key、IV(aesTokenJWT、BearereyJ[A-Za-z0-9_-]\.eyJ私钥RSA/PEM-----BEGIN (RSA )?PRIVATE KEY-----内网地址10.x/172.x/192.168.x(10|172\.(1[6-9]|2\d|3[01])|192\.168)\.\d\.\dLLM 层做的是误报过滤和上下文关联。比如正则扫到一个 32 位十六进制串脚本会标成疑似 AppSecret但 LLM 会看它周围的代码——如果是在test目录下的 mock 数据里风险等级就降下来如果是在config.js里被wx.request直接引用就升级为高危。3.3 接口提取配置endpoint_extractor.py从反编译产物里提取所有 HTTP 请求路径。它扫的是wx.request、wx.uploadFile、wx.downloadFile这些 API 的调用点以及拼接 URL 的字符串常量。提取结果输出到raw_endpoints.json结构如下{ endpoints: [ { path: /api/user/login, method: POST, source_file: app-service.js, line: 12045, params: [username, password] }, { path: /api/pay/create, method: POST, source_file: pages/pay/index.js, line: 88, params: [orderId, amount] } ] }LLM 层会对每个接口做越权研判看它有没有带鉴权头、参数里有没有用户可控的 ID 字段、返回体里有没有敏感信息。比如/api/user/info?uid123这种如果 uid 是前端传的且没有服务端校验就是典型的水平越权。3.4 加密分析配置加密分析是纯 LLM 层不依赖脚本。它扫的是代码里的加密调用点判断几类问题加密算法是不是已经过时的DES、MD5 做密码哈希密钥是不是硬编码在前端IV 是不是固定值加密模式是不是 ECB签名逻辑是不是放在前端做输出到crypto_findings.json每条包含算法、位置、问题类型、风险等级。3.5 漏洞检测规则漏洞挖掘 Agent 覆盖的高危类型漏洞类型检测点风险等级硬编码凭证代码里的 Key/Secret高接口越权用户可控 ID 无校验高敏感信息泄露日志/注释里的手机号、身份证中加密缺陷ECB 模式、固定 IV中调试接口暴露/debug、/test路径中不安全的存储wx.setStorage存敏感数据低3.6 报告输出配置Phase 3 生成的文件output/ ├── security_report.md # 主报告关键发现 ├── api_endpoints_full.md # 全量接口文档 ├── secrets_full.md # 全量敏感信息 ├── findings.json # 结构化发现 ├── domains.txt # 提取的域名列表 └── endpoints_fuzz.txt # 可导入 Burp 的接口列表endpoints_fuzz.txt可以直接导入 Burp Suite 做后续测试格式是每行一个完整 URL。4. 验证请求与成功结果演示配置好之后跑一遍完整流程看输出是否符合预期。4.1 准备测试目标找一个 wxapkg 文件目录比如D:\wechat\miniapp\wxapkg_files。目录里应该有.wxapkg文件这是小程序的代码包。4.2 发起审计在 Claude Code 里输入审计这个小程序 D:\wechat\miniapp\wxapkg_files4.3 观察执行过程Phase 0 编排器解析需求提取路径创建输出目录。这一步不启动子 Agent很快。Phase 1 启动 agent-01 做反编译。它扫描子目录调用unveilr.exe反编译 wxapkg生成file_inventory.json。这一步耗时取决于包大小一般几十秒到几分钟。Phase 1.5 编排器执行 Python 脚本预扫描。endpoint_extractor.py提取接口secret_scanner.py扫敏感信息分别输出raw_endpoints.json和raw_secrets.json。Phase 2 四个 Agent 并行启动SecretScanner、EndpointMiner、CryptoAnalyzer、VulnAnalyzer。前两个在脚本结果基础上做 LLM 分析后两个是纯 LLM 分析。这一步是耗时大头但因为并行比串行快不少。Phase 2.5 条件触发。如果你在指令里指定了重点接口agent-07 会启动做定向深度分析输出custom_analysis.json。Phase 3 启动 agent-06 汇总所有结果生成主报告和独立文档。4.4 检查输出结果跑完后看output/目录。主报告security_report.md的结构大概是# 小程序安全审计报告 ## 审计概览 - 目标D:\wechat\miniapp\wxapkg_files - 文件数156 - 接口数42 - 发现数18高危 5中危 8低危 5 ## 高危发现 ### 1. 硬编码 AppSecret - 位置app-service.js:12045 - 证据appsecret a1b2c3d4e5f6... - 风险攻击者可利用该凭证调用微信接口 ### 2. 接口越权 - 接口/api/user/info - 参数uid前端可控 - 风险可遍历 uid 获取其他用户信息 ## 中危发现 ...findings.json是结构化数据方便接入 CI 做门禁{ summary: { total: 18, high: 5, medium: 8, low: 5 }, findings: [ { id: SEC-001, type: hardcoded_secret, severity: high, file: app-service.js, line: 12045, evidence: appsecret \a1b2c3d4e5f6...\, recommendation: 将 AppSecret 移至服务端前端通过临时凭证调用 } ] }4.5 验证接口提取结果看endpoints_fuzz.txt每行一个完整 URLhttps://api.example.com/api/user/login https://api.example.com/api/user/info https://api.example.com/api/pay/create这个文件可以直接导入 Burp 的 Intruder 做批量测试。4.6 验证敏感信息扫描看secrets_full.md每条包含类型、位置、证据、风险等级。重点看高危项确认是不是真的泄露。5. 本篇常见错误排查跑这套 Skill 时容易踩的坑按报错类型整理。5.1 401 Unauthorized报错Error: 401 Unauthorized原因TaoToken 的 API Key 没配或配错。检查.claude/settings.json里的ANTHROPIC_AUTH_TOKEN是不是完整的sk-开头字符串。如果用的是环境变量确认变量名是ANTHROPIC_AUTH_TOKEN而不是ANTHROPIC_API_KEY。5.2 local proxy failed报错Error: local proxy failed to connect原因Base URL 写错了。正确写法是https://taotoken.net/api不要加/v1或/chat/completions之类的后缀。TaoToken 的端点已经做了路径映射加后缀反而会 404。5.3 reading choices 报错报错Error: reading choices of undefined原因模型返回格式不匹配。检查ANTHROPIC_MODEL填的模型 ID 是不是当前订阅可用的。如果用的是 Coding Plan去 https://taotoken.net/coding-plan 确认模型列表。填了一个不存在的模型 ID返回体里就没有choices字段。5.4 OAuth 相关报错报错Error: OAuth token expired原因Claude Code 的 OAuth 缓存和 TaoToken 的 Key 冲突了。清掉 Claude Code 的本地凭证缓存重新用 Key 认证。在 Windows 上删掉%USERPROFILE%\.claude\下的credentials.json重启 Claude Code。5.5 unveilr.exe 找不到报错Error: unveilr.exe not found in tools/原因反编译工具没放对位置。确认tools/unveilr.exe存在且文件名就是unveilr.exe不要改成别的名字。如果是从 GitHub 下载的压缩包解压后可能多了一层目录把 exe 挪到tools/根下。5.6 Python 脚本执行失败报错Error: python: command not found原因系统里 Python 没加到 PATH。Windows 上可以用py代替python或者把 Python 安装目录加到环境变量。确认 Python 版本是 3.x脚本只用标准库不需要额外装包。5.7 反编译产物为空现象file_inventory.json里文件数为 0。原因wxapkg 文件路径不对或者 wxapkg 是加密的。确认传入的目录里有.wxapkg文件。如果是加密包unveilr 可能解不开需要先解密。5.8 接口提取遗漏现象raw_endpoints.json里接口数明显偏少。原因小程序用了动态拼接 URL正则匹配不到。这种情况需要 LLM 层做补充分析检查app-service.js里有没有字符串拼接的请求路径。可以在指令里指定关注点触发 Phase 2.5 深度分析。5.9 报告生成失败报错Error: findings.json not found原因Phase 2 的某个 Agent 没跑完就中断了。检查 Claude Code 的输出日志看是哪个 Agent 报错。常见的是模型调用超时重跑一次即可。5.10 CI 集成时的权限问题现象在 CI 里跑输出目录写不进去。原因Skill 的最小权限设计是只读源码目录、只写输出目录。CI 里确认输出目录有写权限且不要让它去写源码目录。如果 CI 用的是容器把输出目录挂载成可写卷。6. 把审计 Skill 接进 CI 与后续动作跑通单次审计后下一步是把它接进 CI让每次小程序发版前自动跑一遍。思路是在 CI 的构建阶段加一个步骤调用 Claude Code 执行审计指令然后解析findings.json做门禁。如果高危发现数大于 0就阻断发布。CI 脚本大概长这样#!/bin/bash set -e # 配置 TaoToken 接入 export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKEN$TAOTOKEN_KEY export ANTHROPIC_MODELclaude-sonnet-4-20250514 # 执行审计 claude -p 审计这个小程序 $WXAPKG_DIR # 解析结果做门禁 HIGH_COUNT$(jq .summary.high output/findings.json) if [ $HIGH_COUNT -gt 0 ]; then echo 发现 $HIGH_COUNT 个高危问题阻断发布 exit 1 fi echo 审计通过TAOTOKEN_KEY放在 CI 的 secrets 里不要硬编码在脚本里。门禁阈值可以按团队情况调。刚开始接入时建议只阻断高危中低危先做告警避免一下子卡住太多发布。等规则调稳了再逐步收紧。审计报告可以归档到制品库每次发版留一份方便回溯。endpoints_fuzz.txt可以同步给做渗透测试的同学他们导入 Burp 就能接着做动态测试。如果团队里用 Cline 或 CodexTaoToken 的 Key 可以复用。Cline 的 MCP 配置里填同样的 Base URL 和 KeyCodex 的auth.json里也是这三个字段。配置一次多个工具共用。长期跑的话建议关注 Coding Plan它的额度模型更适合这种高频调用的场景。模型对话入口可以用来做单次快速验证比如临时想确认某个接口的越权风险直接开对话问就行不用跑完整流程。最后给个实用技巧审计指令里把重点接口写清楚能显著提升 Phase 2.5 的命中率。比如你知道这次改动了支付模块就写「重点看 /api/pay 相关接口」agent-07 会针对性地做深度分析比泛泛扫一遍准得多。
阅读完成 · 觉得有帮助?