依赖性审计助手
这个技能有助于审计项目依赖项的安全性漏洞、过时的包和许可证合规性问题。
何时使用这个技能
- 用户请求依赖性审计或安全检查
- 在主要发布或部署之前
- 用户询问过时的包或漏洞
- 需要许可证合规性审查
- 用户提到"npm audit"、“安全”、“依赖性"或"漏洞”
指令
1. 检测包管理器
确定项目使用哪些包管理器:
JavaScript/Node.js:
- npm:
package.json+package-lock.json - Yarn:
package.json+yarn.lock - pnpm:
package.json+pnpm-lock.yaml
Python:
- pip:
requirements.txt或setup.py - Poetry:
pyproject.toml+poetry.lock - Pipenv:
Pipfile+Pipfile.lock
Ruby:
- Bundler:
Gemfile+Gemfile.lock
Java:
- Maven:
pom.xml - Gradle:
build.gradle或build.gradle.kts
Go:
- Go modules:
go.mod+go.sum
Rust:
- Cargo:
Cargo.toml+Cargo.lock
PHP:
- Composer:
composer.json+composer.lock
使用Glob查找这些文件。
2. 运行安全审计
根据包管理器执行适当的审计命令:
npm: npm audit --json 或 npm audit
Yarn: yarn audit --json 或 yarn audit
pnpm: pnpm audit --json
pip: pip-audit 或 safety check
Poetry: poetry check
Bundler: bundle audit check --update
Maven: mvn dependency:tree + OWASP Dependency Check
Go: go list -m all + govulncheck
Cargo: cargo audit
Composer: composer audit
解析输出以识别:
- 按严重性(严重、高、中等、低)的漏洞数量
- 受影响的包和版本
- 可用的修复(更新或补丁)
- CVE标识符
3. 检查过时的包
识别有新版本可用的包:
npm: npm outdated --json
Yarn: yarn outdated --json
pip: pip list --outdated
Poetry: poetry show --outdated
Bundler: bundle outdated
Cargo: cargo outdated
Go: go list -u -m all
分类更新:
- 补丁更新(1.0.0 → 1.0.1):错误修复,安全更新
- 次要更新(1.0.0 → 1.1.0):新功能,通常安全
- 主要更新(1.0.0 → 2.0.0):破坏性更改,需要测试
4. 许可证合规性检查
审查所有依赖项的许可证:
步骤:
- 从包元数据中提取许可证
- 识别许可证类型(MIT、Apache-2.0、GPL等)
- 标记潜在问题许可证(GPL、AGPL在商业项目中)
- 检查无许可证或未知许可证
- 参考
reference/licenses.md中的许可证兼容性矩阵
工具:
- npm:
npx license-checker --json或npm-license-crawler - Python:
pip-licenses - Ruby:
license_finder - Go:
go-licenses
许可证类别:
- 宽容:MIT、Apache-2.0、BSD - 通常安全
- 弱版权:LGPL、MPL - 需要审查
- 强版权:GPL、AGPL - 可能限制商业使用
- 未知:缺失或自定义许可证 - 需要调查
5. 分析依赖树
了解依赖结构:
直接与间接:
- 直接:列在package.json/requirements.txt中
- 间接:依赖项的依赖项
识别问题:
- 不同版本的重复包
- 深层依赖树(潜在冲突)
- 被遗弃的包(超过2年无更新)
- 高风险间接依赖项
命令:
- npm:
npm ls --all - Yarn:
yarn why <package> - pip:
pipdeptree - Maven:
mvn dependency:tree
6. 优先漏洞
根据以下因素确定漏洞的优先级:
严重性级别:
- 严重:远程代码执行、权限提升
- 高:SQL注入、XSS、认证绕过
- 中等:DoS、信息泄露
- 低:次要问题、边缘情况
可利用性:
- 已知野外漏洞
- PoC(概念验证)可用
- 需要特殊条件
暴露:
- 生产依赖项与开发依赖项
- 直接依赖项与深层间接依赖项
- 应用程序实际使用的代码路径
7. 生成建议
对于发现的每个问题,提供:
漏洞:
包:lodash@4.17.15
严重性:高
CVE:CVE-2020-8203
问题:原型污染
建议:升级到lodash@4.17.21或更高版本
命令:npm install lodash@4.17.21
过时的包:
包:react@16.14.0
当前:16.14.0
最新:18.2.0
类型:主要更新
建议:在升级前彻底测试(破坏性更改)
备注:在https://react.dev/blog/2022/03/08/react-18-upgrade-guide查看迁移指南
许可证问题:
包:some-gpl-library@1.0.0
许可证:GPL-3.0
问题:GPL许可证可能与专有代码冲突
建议:寻找具有宽容许可证的替代品或咨询法律
替代品:[列出具有MIT/Apache许可证的类似包]
8. 更新策略
建议更新方法:
安全更新(自动):
- 无破坏性更改的补丁更新
- 安全修复漏洞
- 更新:
npm update或npm audit fix
谨慎更新(手动测试):
- 次要版本更新
- 对维护良好的包进行主要更新
- 单独更新并测试
需要研究:
- 主要破坏性更改
- 被遗弃的包(寻找替代品)
- 许可证冲突
9. 生成摘要报告
提供全面的审计摘要:
依赖性审计报告
=======================
概览:
- 总依赖项:150(120直接,30间接)
- 漏洞:5(1高,3中等,1低)
- 过时的包:23
- 许可证问题:2
安全漏洞:
[按严重性列出,带有修复建议]
过时的包:
[按更新类型分类:补丁/次要/主要]
许可证合规性:
[带有任何问题的许可证列表]
推荐操作:
1. [立即] 修复高严重性漏洞
2. [尽快] 更新具有中等严重性的包
3. [审查] 解决许可证合规性问题
4. [可选] 更新过时的包到最新
要运行的命令:
npm audit fix # 自动修复漏洞
npm update # 更新到最新兼容版本
10. 持续监控
建议持续实践:
- 自动审计:在CI/CD管道中运行
- Dependabot/Renovate:自动创建更新的PR
- 定期审查:每月或每季度审计
- 安全警报:启用GitHub/GitLab安全警报
- 锁定文件:提交锁定文件以进行可重现的构建
最佳实践
- 及时修复漏洞:特别是高/严重性
- 测试更新:即使是补丁更新也可能导致问题
- 阅读变更日志:在更新前了解变更内容
- 使用锁定文件:确保跨环境的一致安装
- 最小化依赖项:更少的依赖项 = 更小的攻击面
- 审查新添加:在添加新依赖项前进行审计
- 保持最新:定期更新比大跳跃更容易
- 记录决策:为什么某些包被固定或不更新
安全最佳实践
- 永远不要在依赖项或环境文件中提交秘密
- 审查流行/关键包的依赖源代码
- 使用私有注册表用于内部包
- 在包注册表帐户上启用2FA
- 使用SRI(子资源完整性)用于CDN资源
- 如果使用Docker,则扫描容器映像
支持文件
scripts/check-licenses.sh:提取和检查许可证信息reference/licenses.md:许可证兼容性矩阵reference/common-vulnerabilities.md:常见漏洞模式
常见命令参考
npm:
npm audit # 显示漏洞
npm audit fix # 自动修复漏洞
npm audit fix --force # 强制主要更新
npm outdated # 检查过时的包
npm update # 更新到最新兼容
Yarn:
yarn audit # 显示漏洞
yarn upgrade-interactive # 交互式更新
yarn outdated # 检查过时
pip:
pip-audit # 审计漏洞
pip list --outdated # 检查过时
pip install --upgrade # 更新包
Poetry:
poetry check # 检查锁定文件
poetry show --outdated # 显示过时
poetry update # 更新包
Cargo:
cargo audit # 审计漏洞
cargo outdated # 检查过时
cargo update # 更新包