用途
Dependency Lockfile Audit 用于在依赖进入应用之前,检测恶意、仿冒(typosquatted)和有漏洞的依赖包。资料指出供应链攻击日益常见,单个恶意包就可能在安装时窃取全部环境变量。该技能的核心规则是:始终提交 lockfile、安装前始终审计、绝不忽略安全警告。
覆盖的攻击向量
资料列出了以下攻击类型及其原理与示例:
- 仿冒包(Typosquatting):包名与流行包相似,例如用 expresss 冒充 express。
- 依赖混淆(Dependency confusion):私有包名被攻击者在公共 registry 上抢注,例如 @company/utils 被攻击者发布到 npm。
- 恶意 postinstall:脚本在 npm install 时运行,窃取 .env、SSH 密钥并发送给攻击者。
- Protestware:维护者在更新中加入破坏性代码,例如删除文件、显示政治信息。
- 废弃包接管(Abandoned takeover):攻击者取得无人维护包的控制权,注入加密货币挖矿程序。
主要能力与审计命令
npm(Node.js)
- npm audit:检查已知漏洞。
- npm audit --omit=dev:仅检查生产依赖的已知漏洞。
- npm audit fix:尽可能自动修复。
- npm query ':attr(scripts, [postinstall])' | jq '.[].name':列出所有带安装脚本(潜在风险)的包。
- npm ci:检查 lockfile 完整性,若 lockfile 与 package.json 不匹配则失败。
pip(Python)
- pip-audit:检查已知漏洞。
- safety check --full-report:使用 safety 检查。
- pip freeze > requirements.txt:固定所有依赖。
composer(PHP/Laravel)
- composer audit:检查已知漏洞。
- composer validate --strict:验证 lockfile 完整性。
仿冒包检测
资料给出需要留意的常见模式:
- 字符替换:lodash → 1odash(L 与 1)、express → expresss(重复字母)、react → reacct。
- 作用域混淆:@babel/core → @bable/core、@types/node → @typs/node。
- 连字符/下划线技巧:cross-env → crossenv、node-fetch → nodefetch。
资料还提供了一个自动化检查脚本 check-suspicious-deps.sh,用于标记下载量极低或发布时间很近的包。脚本读取 package.json 中的 dependencies 与 devDependencies,通过 registry.npmjs.org 查询包信息,若包在 registry 上不存在则告警;再通过 api.npmjs.org 查询最近一周下载量,若低于 100 则提示可能为仿冒包。
Lockfile 完整性
资料解释了 lockfile 的重要性:没有 lockfile 时,npm install 在不同机器上可能解析出不同版本;攻击者发布恶意补丁版本后,会影响所有没有 lockfile 的用户。相关规则包括:
- 始终提交 lockfile(package-lock.json、yarn.lock、pnpm-lock.yaml、composer.lock、Pipfile.lock)。
- 在 CI/CD 中使用 npm ci(而非 npm install),lockfile 不同步时会失败。
- 在 PR 中审查 lockfile 差异,意外变更可能意味着供应链攻击。
- 对关键依赖固定精确版本,例如 stripe 固定为 14.5.0、jsonwebtoken 固定为 9.0.2。
检测 lockfile 篡改的方式:在 CI 流水线中先执行 npm ci --ignore-scripts(安装但不运行脚本),验证后再执行 npm rebuild 显式运行脚本。
CI/CD 集成
资料提供了一个 GitHub Actions 示例,触发条件为 pull_request 且路径涉及 package.json、package-lock.json、requirements.txt、Pipfile.lock。步骤包括:检出代码;检查 lockfile 是否存在(若不存在则报错退出);使用 npm ci --ignore-scripts 进行带完整性校验的安装;运行 npm audit --audit-level=high;检查安装脚本,列出带 postinstall 脚本的包并提示审查其恶意行为。
安全依赖实践
资料列出的实践包括:尽量减少依赖以缩小攻击面;优先选择知名包,检查下载量与维护者声誉;生产环境锁定版本,使用精确版本而非范围;更新前先审查,阅读变更日志并检查所有权变更;初次安装使用 --ignore-scripts,审计脚本后再运行;设置 Dependabot/Renovate 自动提交安全更新 PR;绝不从未受信任的 package.json 运行 npm install,先检查脚本。
危险信号
资料列出的包危险信号包括:最近 7 天内发布且名称与流行包相似;作为“工具”包但每周下载量极少(少于 100);postinstall 脚本运行混淆代码;维护者邮箱为一次性地址;仓库 URL 与包名不匹配;只发布过单个版本(无历史);包内包含压缩过的源码(用于隐藏恶意代码)。
适用场景与限制
该技能适用于使用 npm、pip、composer 的项目的依赖安全审计,尤其适合在 CI/CD 中作为供应链防护环节。资料还提到 PDPA 2024 的合规后果:取证分析发现第 7 项为可疑/未经验证的依赖;若恶意依赖从应用中窃取用户数据,依据 Seksyen 5(1) PDPA 2024,未验证供应链的一方需承担责任,法院会将依赖管理视为 langkah keselamatan yang munasabah(合理安全措施)的一部分。
关于该技能的具体安装方式、收费模式、支持平台等信息,资料中暂未提供。