用途
js-security-audit 用于对 JS/TS 项目执行一次覆盖 5 个领域的安全审计,支持 npm、yarn 或 pnpm。审计结果按领域生成通过/失败报告,并附带 file:line 引用。
适用场景包括:
- 新仓库加固——核查 .npmrc、lockfile、2FA、精确版本锁定
- 审查新增或升级依赖的 PR
- 搭建 CI 安全门禁(npm ci --ignore-scripts、lockfile-lint、audit gate)
- 供应链攻击新闻出现后(如 Axios March 2026、Shai-Hulud 等)
- 生产部署前的定期安全审查
主要能力
技能会先通过检查存在的 lockfile 判断包管理器:package-lock.json(npm)、yarn.lock(yarn)、pnpm-lock.yaml(pnpm),然后使用对应的命令。
审计覆盖以下 5 个领域:
- 项目配置:检查 .npmrc、lockfile 是否存在、版本锁定、.gitignore、scoped packages。
- 依赖卫生:运行 audit,扫描 lockfile diff 中意外出现的包,检查 latest 标签与琐碎依赖。
- CI/CD 流水线:验证使用 npm ci 而非 npm install、--ignore-scripts 配合选择性重建白名单、audit gate、lockfile-lint、SHA 固定的 actions、SBOM、ESLint 安全配置。
- Dependabot:检查 .github/dependabot.yml、告警路由、critical/high 的 P1 SLA、分组配置。
- 事件响应准备:验证团队是否有文档化的 playbook、IOC 监控、凭据轮换 runbook。
技能还引用以下文档:audit-checklist.md(完整 MUST/SHOULD/SHOULDN'T 清单)、eslint-security.md(SAST ESLint 模板与规则表)、incident-playbook.md(5 步受损依赖响应)、package-manager.md(npm/yarn/pnpm 命令等价与工具)。
使用方式
技能需要 Bash 来运行 npm audit 等命令。为避免每次审计都弹出提示,可在 ~/.claude/settings.json(或项目 .claude/settings.json)中添加权限白名单:
{
"permissions": {
"allow": [
"Bash(npm audit:*)",
"Bash(npm outdated:*)",
"Bash(npm explain:*)",
"Bash(npm list:*)",
"Bash(npm view:*)",
"Bash(yarn npm audit:*)",
"Bash(yarn outdated:*)",
"Bash(yarn why:*)",
"Bash(pnpm audit:*)",
"Bash(pnpm outdated:*)",
"Bash(pnpm why:*)",
"Bash(npx lockfile-lint:*)",
"Bash(npx npq:*)"
]
}
}
这样审计命令可静默执行,其他操作(写入、删除等)仍需确认。
交互风格
- 从 lockfile 检测包管理器,不默认假设 npm
- 优先标记关键发现(受损包、缺失 audit gate、仓库中的密钥),再列警告
- 每条发现都引用文件路径或配置键
- 每条发现都附带修复片段,而不只是“去修”
- 区分 MUST(阻止合并)、SHOULD(下个迭代)与 SHOULDN'T(反模式)
规则分级
- Critical:仓库中存在密钥、缺失 lockfile、生产依赖使用 latest 标签、CI 中无 npm audit gate、发布者未启用 2FA
- Warning:缺失 .npmrc 加固、无 Dependabot 配置、无 SBOM 生成、缺失 ESLint 安全配置
- Info:无 npq 安装前审查、无 Socket.dev/Snyk 集成
注意事项
- AI 幻觉包名:LLM 有时会建议 npm 上不存在的包,攻击者会注册这些名称并植入恶意软件。安装前务必在 npmjs.com 核实,尤其是聊天建议中不常见的名称。
- CI 中 npm install 与 npm ci 的区别:npm install 在 lockfile 与 package.json 不一致时会重写 lockfile,静默拉取新版本;npm ci 则会让构建失败。CI 必须使用 ci。
- --ignore-scripts 也会阻止合法包:esbuild、sharp、prisma、bcrypt 需要 postinstall 脚本下载二进制或生成客户端。应使用 --ignore-scripts 后 npm rebuild <allowlist>,并记录每个包进入白名单的原因。
- GitHub Actions 按 SHA 固定,而非 tag:actions/checkout@v4 跟随 tag,tag 可被重新指向恶意代码。应使用完整 40 位 SHA 并附注释说明 tag。
- Lockfile diff 是供应链金丝雀:一个为修错别字而新增 200 个传递依赖的 PR,或把已有包的 resolved URL 从 registry.npmjs.org 改走他处,都是危险信号,合并前需调查。
- min-release-age 是 npm v11+:在旧版 npm 上作为 SHOULD 提及,但不因此判定审计失败。
- 认证代码中的 Math.random() 是 critical 而非 warning:用 Math.random() 生成的验证码、会话令牌、密码重置令牌可被预测,应强制使用 crypto.randomInt()。
- 不允许以“减少噪音”为由禁用 Dependabot:正确做法是对 minor/patch 更新分组,而不是静默告警。
输出
生成审计报告,包含总体 Pass/Fail、按领域的状态表(Critical/Warnings/Info 计数)、Critical Findings、Warnings 与 Remediation Priority(先修 critical 再合并,下个迭代处理 warnings,Info 视时间处理)。
限制
资料未提供该技能的安装命令、收费方式、支持平台或运行环境要求,这些信息暂未提供。