关于 dependency-audit
dependency-audit 是一项安全技能,用于检查依赖项、框架、运行时、开发工具和 CI/CD 配置中的已知漏洞与供应链风险。它结合技术栈盘点、自动化审计指导、框架专项检查及修复报告。
主要功能
- 01完整盘点依赖与技术栈
- 02提供自动化漏洞审计指导
- 03检查框架特有安全问题
- 04审查供应链风险
- 05检查开发工具与 CI/CD
- 06列出发现及修复步骤
适用场景
- 01检查项目依赖版本是否存在 CVE
- 02审查锁文件与包安装方式
- 03核查框架特有的安全模式
- 04评估 CI/CD 与容器配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ briiirussell/ cybersecurity-skills --skill dependency-audit安装后在 Claude Code 中输入/dependency-audit确认已加载。
详细介绍
依赖项审计——框架、软件包与工具链安全
审计项目依赖项、框架、语言运行时和开发工具,检查已知漏洞(CVE)、安全反模式和供应链风险。
方法
步骤 1:盘点技术栈
识别所有正在使用的内容——不仅是直接依赖项,还包括完整依赖链:
软件包清单——阅读并记录:
Node/JS: package.json, package-lock.json, yarn.lock, pnpm-lock.yaml
Python: requirements.txt, Pipfile.lock, pyproject.toml, poetry.lock
Ruby: Gemfile, Gemfile.lock
Go: go.mod, go.sum
Rust: Cargo.toml, Cargo.lock
Java: pom.xml, build.gradle
PHP: composer.json, composer.lock
.NET: *.csproj, packages.config
框架和运行时版本:
- 检查框架版本(Next.js、Django、Rails、Spring、Laravel、Express 等)
- 检查语言/运行时版本(Node.js、Python、Ruby、Go、Java、PHP、.NET)
- 检查基础设施工具(Docker 基础映像、Terraform 提供程序、Kubernetes 版本)
开发工具和 CI/CD:
- 检查 CI/CD 流水线配置(.github/workflows、.gitlab-ci.yml、Jenkinsfile)
- 检查提交前钩子、代码检查工具、格式化工具
- 检查容器基础映像及其更新状态
- 检查 IaC 工具版本(Terraform、Pulumi、CDK)
软件包清单中的边缘情况:
optionalDependencies——虽会安装,但默认不会审计peerDependencies——版本范围可能与实际安装的版本不匹配overrides/ yarnresolutions/ pnpmoverrides——检查它们是否被用于掩盖公告,而非修复问题- Monorepo:读取每个
packages/*/package.json和apps/*/package.json,而不只是根目录下的文件 engines字段——Node 版本早于 LTS 会让其他审计失去意义
步骤 2:运行自动化审计工具
根据项目运行相应的审计命令:
# Node.js
npm audit --json # full structured output
npm audit --omit=dev --json # production-only: filters dev/build-time vulns
# Compare the two — vulns only in dev/build tooling do not ship to users
# and should be triaged as lower priority. Don't bury this in the report.
# Python
pip audit # If pip-audit installed
safety check # If safety installed
# Ruby
bundle audit
# Go
govulncheck ./...
# Rust
cargo audit
# PHP
composer audit
# .NET
dotnet list package --vulnerable
# Docker
docker scout cves <image>
trivy image <image>
# General (if Trivy is available)
trivy fs .
应用修复——使用 --force 前请先阅读:
npm audit fix # safe: upgrades within stated ranges
npm audit fix --dry-run --force # ALWAYS dry-run first
npm audit fix --force # only after reviewing the dry-run
npm audit fix --force 可能会通过将软件包降级到较旧版本来解决公告,因为该版本不会触发审计特征码。这几乎总是错误的做法(例如,将 next@16 降级到 next@9,以“修复”传递依赖 postcss 的 CVE)。检查试运行输出中的 "Will install X@Y, which is a breaking change"——这表示工具正试图降级。
当 npm audit fix 无法解决公告时(上游软件包锁定了传递依赖):
- 确定可达性——你的用法是否实际调用了存在漏洞的代码路径?使用
npm ls <package>并阅读父级软件包的源代码,可以判断该路径是否不可达。 - 考虑在
package.json中使用overrides固定到已修补的版本(彻底测试——overrides可能会导致父级软件包出错)。 - 考虑完全替换父级提供程序。
- **如果以上方法都不适用:**明确记录问题、跟踪上游进展,并在审计报告中注明,而不是悄悄删除该项发现。
步骤 3:研究框架特定的已知问题
除了软件包中的 CVE,还要检查所用框架特有的已知漏洞模式。搜索近期安全公告和常见的错误配置问题。
对于每个直接依赖项,将已安装版本与以下来源交叉核对:
https://github.com/advisories?ecosystem=npm&query=<package>https://github.com/<org>/<repo>/security/advisories
以下框架特定模式涵盖了长期存在的反模式(批量赋值、在生产环境启用调试等)。近期 CVE 需要重新核查,因为硬编码的公告列表很快就会过时,而大模型的训练数据通常比最新信息滞后 6 个月以上。 Next.js / React:
- 暴露内部端点的 Server Actions(14.1.1 之前的中间件绕过 CVE-2025-29927)
- 未经清理的
dangerouslySetInnerHTML - 通过图像优化进行 SSRF(
next/image使用不受限制的域名) public目录或客户端包中暴露的.env文件(NEXT_PUBLIC_前缀导致密钥泄露)- 中间件认证绕过模式——检查 middleware.ts 是否匹配所有受保护的路由
- Server Component / Client Component 边界泄露仅限服务器端的数据:
- 任何读取
process.env.SECRET或实例化数据库客户端的模块都应以import "server-only";开头——如果在 Client Component 中导入,该模块会导致构建失败 - 搜索:
lib/中访问process.env.[A-Z_]+但未导入server-only的文件 - 反向检查:任何包含
"use client"的文件若从此类模块导入内容,即构成泄露
- 任何读取
- 过时的
next.config.js安全标头
Django:
- 生产环境中设置了 DEBUG=True
- ALLOWED_HOSTS 配置错误(通配符
*) - 缺少 CSRF 中间件,或在会改变状态的视图上使用
@csrf_exempt - 使用
extra()、raw()或RawSQL执行未经参数化的原始 SQL - 在会话中使用 Pickle 反序列化(改用 JSON 序列化器)
- 密钥提交到了源代码管理中
Rails:
- 未使用强参数的批量赋值
- 通过
where("column = '#{input}'")进行 SQL 注入 - Action Pack、Action View 或 Active Record 存在未修补的 CVE
- Cookie 中存在不安全的反序列化(验证 secret_key_base 是否轮换)
- 仅 API 模式下绕过 CSRF 令牌
Express / Node.js:
- 通过
Object.assign、lodash.merge、deep-extend导致原型污染 - 验证模式中存在 ReDoS(正则表达式拒绝服务)
- 文件服务路由中通过
req.params导致路径遍历 - 认证端点缺少速率限制
- 使用用户输入调用
eval()或Function() - 使用同步操作阻塞事件循环
无服务器 / 边缘运行时(Vercel、Lambda、Cloud Run、Workers):
- 内存状态 ≠ 速率限制。 模块作用域中的
Map或Set用于速率限制、会话或缓存时,状态仅限于单个实例。冷启动会重置状态;负载会分散到多个实例;攻击者可以轻易绕过。- 搜索:Server Action / API 路由文件中的
const rateLimitMap = new Map、const cache = new Map - 修复:使用共享存储——Vercel KV、Upstash Ratelimit、Redis、DynamoDB
- 搜索:Server Action / API 路由文件中的
- 无界的内存集合会在流量下导致内存泄漏。限制集合大小并淘汰条目(LRU 或 FIFO)。
x-forwarded-for信任问题: 只有边缘节点会覆盖此标头时,它才可信。在配置错误的代理链后,它可被攻击者伪造。回退到单个"unknown"分组会让所有匿名流量一起受到限流;随机回退则会悄悄禁用限流。
Spring / Java:
- Spring4Shell 及相关 RCE 漏洞
- 反序列化攻击(Java 原生序列化、Jackson 多态类型)
- Spring Expression Language 中的 SpEL 注入
- 会改变状态的端点缺少 CSRF 保护
- Actuator 端点暴露且未经过身份验证
Laravel / PHP:
- 生产环境中 APP_DEBUG=true(错误页面会泄露环境变量)
- 通过不带绑定参数的原始数据库查询进行 SQL 注入
- 未使用
$fillable/$guarded的批量赋值 - 上传文件未进行类型验证(上传的 .php 文件可能被执行)
- 队列任务中存在不安全的反序列化
WordPress:
- 核心、主题或插件版本过时(最常见的攻击途径)
- wp-admin 中启用了文件编辑器(管理员账号遭入侵后可被用于注入代码)
- 启用了 XML-RPC(可放大暴力破解攻击、导致 SSRF)
- 使用默认管理员用户名、弱密码
- 插件漏洞未修补(查看 WPScan 数据库)
步骤 4:检查供应链风险
除了已知的 CVE,还要查找供应链攻击迹象:
依赖混淆/替换:
- 可在公共注册表中被他人注册的私有包名称
- 缺少
.npmrc或pip.conf对私有注册表的范围限定 - 未验证锁文件完整性
仿冒包:
- 与热门包名称相近、容易混淆的包
- 最近发布且下载量极少的包
- 所有权近期发生变更的包
恶意包:
- 会发起网络请求或执行代码的安装后脚本(
package.json中的scripts.postinstall) - 含有混淆代码的包
- 相对于其功能而言,请求了过多权限的包
维护风险:
- 无人维护的包(2 年以上没有提交记录、仓库已归档)
- 关键功能依赖由单个维护者维护的包
- 存在已知但未修补漏洞的包(维护者未响应)
锁文件完整性:
- 是否已提交锁文件?
git ls-files | grep -E 'package-lock\.json|yarn\.lock|pnpm-lock\.yaml|Gemfile\.lock|poetry\.lock|composer\.lock|Cargo\.lock|go\.sum' - CI 是否从锁文件安装?
- 检查
.github/workflows/*.yml、.gitlab-ci.yml、Jenkinsfile、vercel.json、netlify.toml、Dockerfile npm install(不佳)与npm ci(良好);yarn install(不佳)与yarn install --immutable(良好);pip install -r(不佳)与pip install --require-hashes -r(良好)
- 检查
- 锁文件中是否包含
integrity哈希?(现代版 npm/pnpm 默认包含)
步骤 5:检查开发工具和 CI/CD 安全性
GitHub Actions:
- 使用
pull_request_target触发器并检出 PR 代码(存在代码注入风险) - 分支 PR 工作流可访问机密信息
- Action 版本未固定(
uses: actions/checkout@main与@v4.1.0或固定 SHA 相比) - 在
run:代码块中通过${{ github.event.issue.title }}注入脚本
Docker:
- 容器以 root 身份运行(缺少
USER指令) - 基础镜像存在已知 CVE(使用
trivy或docker scout检查) - 机密信息被写入镜像层(可通过
docker history查看) - 使用
latest标签,而非固定版本
Terraform / IaC:
.tf文件中硬编码的机密信息- Provider 版本未固定
- 状态文件未加密
- Provider 配置中的 IAM 权限过于宽泛
输出格式
# Dependency & Stack Security Audit
## Project: [name]
## Stack: [language, framework, key tools]
## Date: [date]
### Stack Inventory
| Component | Version | Latest | Status |
|-----------|---------|--------|--------|
### Known Vulnerabilities (CVEs)
| Package | Installed | Vuln | Severity | Where reachable | CVE | Fix Version |
|---------|-----------|------|----------|-----------------|-----|-------------|
Where reachable values: `runtime` / `build-only` / `dev-only`. Confirm with `npm ls --omit=dev <package>` or inspect the deployment artifact (Vercel function bundle, Docker layer). Build- and dev-only vulnerabilities should not block a release on their own; runtime-reachable ones should.
### Framework-Specific Issues
#### [SEVERITY] [Title]
**Component:** [framework/tool name and version]
**Issue:** [description]
**Evidence:** [code or config snippet]
**Remediation:** [specific fix]
### Supply Chain Risks
| Risk | Package/Component | Details | Remediation |
|------|-------------------|---------|-------------|
### Dev Tool / CI Security
| Tool | Issue | Severity | Remediation |
|------|-------|----------|-------------|
### Prioritized Action Plan
1. [Critical — actively exploited CVEs, RCE vulnerabilities]
2. [High — known CVEs with public exploits, supply chain risks]
3. [Medium — framework misconfigurations, outdated dependencies]
4. [Low — maintenance risks, best practice improvements]
边界
- 仅审计用户提供的代码和配置
- 识别 CVE 时,确认其适用于实际安装的版本
- 对每项发现都提供具体的修复版本或补救步骤
- 指出利用漏洞所需的特定条件(以降低实际严重程度)
- 拒绝协助利用已发现的漏洞攻击未经授权的目标
参考资料
- OWASP Dependency-Check
- National Vulnerability Database(NVD)
- GitHub Advisory Database
- Snyk Vulnerability Database
- npm audit / pip-audit / bundler-audit 文档
- SLSA(软件制品供应链级别)框架