π Introduction
Dependency Confusionμ supply chain substitution attack μΌλ‘λ λΆλ¦¬λ©° μλΉμ€μμ μ¬μ©μ€μΈ λ΄λΆ ν¨ν€μ§μ λμΌν μ΄λ¦μ ν¨ν€μ§λ₯Ό λ±λ‘νμ¬ μ μμ μΈ ν¨ν€μ§κ° μ€μΉ λλλ‘ μ λνλ 곡격μ λλ€.
gem, pip, npm λ± ν¨ν€μ§ λ§€λμ μ λ°λΌ λ€λ₯΄μ§λ§, μ ννκ² λͺ μλμ§ μμ μνμμ μΈλΆ/λ΄λΆμ λμΌν μ΄λ¦μ ν¨ν€μ§κ° μλ κ²½μ° μΈλΆμμ ν¨ν€μ§λ₯Ό κ°μ Έμ€κΈ°λ ν©λλ€. μ΄λ₯Ό μ΄μ©ν 곡격 λ°©λ²μ λλ€.
e.g
|
|
π‘ Offensive techniques
Detect
github λ± μμ€μ½λ repositoryμμ μ§μ internal ν¨ν€μ§λ₯Ό νμΈνκ±°λ /package.json
, composer.json
λ± μΈλΆμ μλνμ§ μκ² λ
ΈμΆλλ ν¨ν€μ§ κ΄λ ¨ νμΌμ μ°Έκ³ νμ¬ ν¨ν€μ§ κ΄λ¦¬ λꡬμ λ±λ‘λμ§ μμ μ΄λ¦μ΄ μλ κ²½μ° Dependency Confusionμ κ°λ₯μ±μ΄ μ‘΄μ¬ν©λλ€.
- package.json (nodejs)
- composer.json (php)
- go.mod (go)
- Gemfile (ruby gem)
- requirements.txt (python pip)
- pom.xml (java maven)
- Etc..
μ΄λ¬ν ν¨ν€μ§ κ΄λ ¨ νμΌμ΄ μλλλΌλ dependency μ 보λ₯Ό λνλ΄μ£Όλ λͺ¨λ νμ΄μ§μμ dependency μ 보λ₯Ό μ»μ μ μλ€λ©΄ ν μ€ν ν¬μΈνΈκ° λ©λλ€.
Exploitation
npm. gem, pip λ± ν¨ν€μ§ λ§€λμ μ 곡격μ½λλ₯Ό ν¬ν¨ν ν¨ν€μ§λ₯Ό λ±λ‘νλ ννλ‘ exploitν μ μμ΅λλ€. npm ν¨ν€μ§λ₯Ό μμλ‘ λ€μ΄λ³΄λ©΄ μλμ κ°μ΅λλ€. npm ν¨ν€μ§μ νμν package.json νμΌκ³Ό main νμΌμΈ js νμΌμ νλ λ§λ ν scriptsμ μνλ 곡격μ½λλ₯Ό λ£μ΄λκ³ internal ν¨ν€μ§μ λμΌν μ΄λ¦μΌλ‘ public ν¨ν€μ§λ₯Ό μμ±νκ³ λ±λ‘νλ©΄ λ©λλ€.
index.js
|
|
package.json
|
|
π‘ Defensive techniques
Hide dependency
package.json κ°μ΄ μλΉμ€μμ μ¬μ©νλ dependencyλ₯Ό μ μ μλ νμΌμ μΈλΆμ λ ΈμΆλμ§ μλλ‘ μ ννλ κ²μ΄ μ’μ΅λλ€.
|
|
GroupID μ μ νκΈ°
npmjs.com, pypi.org λ±μ ν¨ν€μ§ λ±λ‘ μ owner(groupId)λ₯Ό λ¨Όμ μ μ νμ¬ κ³΅κ²©μ λ°©μ§ν μ μμ΅λλ€.
Scope internal package
ν¨ν€μ§ λ§€λμ μμ μ§μ internal ν¨ν€μ§λ₯Ό μν μ λκ²½λ‘λ₯Ό μ§μ ν μ μλ κ²½μ° μ΄λ₯Ό ν΅ν΄μ μμλ‘ μΈλΆ ν¨ν€μ§κ° μ€μΉλλ κ²μ λ°©μ§ν μ μμ΅λλ€.
NodeJS (npm)
npmjs.comμ λͺ
μλμ§ μμ ν¨ν€μ§λ λͺ¨λ μν₯μ λ°μ΅λλ€. λ¨ .npmrc
λ±μ registryλ₯Ό μ§μ λͺ
μνμ¬ μνν μ μμ΅λλ€. CI μμ€ν
λ±μμ μ¬μ©λλ©΄ μλν λΉλ μνμμλ μνκ° κ°λ₯ν©λλ€.
|
|
Python (pip)
pypi.orgμ λͺ μλμ§ μμ ν¨ν€μ§λ λͺ¨λ μν₯μ λ°μ΅λλ€. pipμ κ²½μ° scopeλ grouping κΈ°λ₯μ΄ μμ΄ μ§μ μ μΈ μνλ°©λ²μ μμ΅λλ€. requirements.txtκ° μΈλΆλ‘ λ ΈμΆλμ§ μλλ‘ μ κ²½μ¨μΌ νλ©° λΉλ λ¨κ³μμ dependency μ€μΉ μ internalκ³Ό externalλλ internalμ κ²½μ° μΈλΆ ν΅μ μ΄ λΆκ°λ₯ν μλλ°μ± νκ²½μμ λΉλνλ€λ©΄ internal ν¨ν€μ§ μ€μΉλ§ μ λν μ μμ΄ λλ¦λλ‘ μνκ° κ°λ₯ν©λλ€.
Java (maven/gradle)
dependency νμΌ μμ± μ λλ©μΈ κΈ°λ°μΌλ‘ μ¬μ©νμ¬ μνν μ μμ΅λλ€. μ΄μΈμλ 5κ°μ§ μ λμ λ°©λ²μ΄ λ μμ΅λλ€.
- Verifying dependencies with Gradle’s trusted-key
- Repository filtering using includeGroup, includeGroupByRegex
- Gradle Wrapper checksum verification
- Dependency Locking
- Reproducible Builds
πΉ Tools
- https://github.com/visma-prodsec/confused (package scanner)
- package.json - nuclei template
- composer.json - nuclei template
- github gemfiles - nuclei template