Dependency Confusion
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Basic Information
Dependency Confusion (๋๋ ๋์ฒด ๊ณต๊ฒฉ)์ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์๋ํ์ง ์์, ๋ ์ ๋ขฐํ ์ ์๋ ๋ ์ง์คํธ๋ฆฌ/์์ค(๋ณดํต ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ)์์ ์์กด์ฑ ์ด๋ฆ์ ํด๊ฒฐํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ํจํค์ง๊ฐ ์ค์น๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๊ทผ๋ณธ ์์ธ:
- ํ์ดํฌ์ค์ฟผํ
/์คํ:
reqests๋ฅผ ๋์ ํ์ฌrequests๋ฅผ ๊ฐ์ ธ์ค๊ธฐ(๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์์ ํด๊ฒฐ๋จ). - ์กด์ฌํ์ง ์๊ฑฐ๋ ๋ฐฉ์น๋ ๋ด๋ถ ํจํค์ง: ๋ ์ด์ ๋ด๋ถ์ ์กด์ฌํ์ง ์๋
company-logging์ ๊ฐ์ ธ์ค๋ฉด, ํด๊ฒฐ์๊ฐ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์์ ๊ฒ์ํ์ฌ ๊ณต๊ฒฉ์์ ํจํค์ง๋ฅผ ์ฐพ์ต๋๋ค. - ์ฌ๋ฌ ๋ ์ง์คํธ๋ฆฌ ๊ฐ์ ๋ฒ์ ์ ํธ: ๋ด๋ถ
company-requests๋ฅผ ๊ฐ์ ธ์ค๋ฉด์ ํด๊ฒฐ์๊ฐ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ๋ ์ฟผ๋ฆฌํ ์ ์๊ณ ๊ณต๊ฒฉ์๊ฐ ๊ณต๊ฐ์ ์ผ๋ก ๊ฒ์ํ โ์ต๊ณ ์โ/๋ ์ต์ ๋ฒ์ ์ ์ ํธํ๋ ๊ฒฝ์ฐ.
ํต์ฌ ์์ด๋์ด: ํด๊ฒฐ์๊ฐ ๋์ผํ ํจํค์ง ์ด๋ฆ์ ๋ํด ์ฌ๋ฌ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๋ณผ ์ ์๊ณ โ์ต๊ณ โ ํ๋ณด๋ฅผ ์ ์ธ๊ณ์ ์ผ๋ก ์ ํํ ์ ์๋ค๋ฉด, ํด๊ฒฐ์ ์ ํํ์ง ์๋ ํ ์ทจ์ฝํฉ๋๋ค.
Exploitation
Warning
๋ชจ๋ ๊ฒฝ์ฐ์ ๊ณต๊ฒฉ์๋ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์์ ๋น๋๊ฐ ํด๊ฒฐํ๋ ์์กด์ฑ๊ณผ ๋์ผํ ์ด๋ฆ์ ์ ์ฑ ํจํค์ง๋ง ๊ฒ์ํ๋ฉด ๋ฉ๋๋ค. ์ค์น ์ ํํฌ(์: npm ์คํฌ๋ฆฝํธ) ๋๋ ๊ฐ์ ธ์ค๊ธฐ ์ ์ฝ๋ ๊ฒฝ๋ก๋ ์ข ์ข ์ฝ๋ ์คํ์ ์ ๊ณตํฉ๋๋ค.
Misspelled & Inexistent
ํ๋ก์ ํธ๊ฐ ๊ฐ์ธ ๋ ์ง์คํธ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ณ ๋๊ตฌ๊ฐ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ๋ก ๋๋์๊ฐ๋ฉด, ๊ณต๊ฒฉ์๋ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ํด๋น ์ด๋ฆ์ ์ ์ฑ ํจํค์ง๋ฅผ ์ฌ์ ์ ์์ต๋๋ค. ๊ทํ์ ๋ฌ๋/CI/๊ฐ๋ฐ ๋จธ์ ์ ์ด๋ฅผ ๊ฐ์ ธ์ ์คํํฉ๋๋ค.
Unspecified Version / โBest-versionโ selection across indexes
๊ฐ๋ฐ์๋ ์ข
์ข
๋ฒ์ ์ ๊ณ ์ ํ์ง ์๊ฑฐ๋ ๋์ ๋ฒ์๋ฅผ ํ์ฉํฉ๋๋ค. ํด๊ฒฐ์๊ฐ ๋ด๋ถ ๋ฐ ๊ณต๊ฐ ์ธ๋ฑ์ค ๋ชจ๋๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ, ์ถ์ฒ์ ๊ด๊ณ์์ด ์ต์ ๋ฒ์ ์ ์ ํํ ์ ์์ต๋๋ค. ๋ด๋ถ ์ด๋ฆ์ธ requests-company์ ๊ฒฝ์ฐ, ๋ด๋ถ ์ธ๋ฑ์ค์ 1.0.1์ด ์์ง๋ง ๊ณต๊ฒฉ์๊ฐ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์ 1.0.2๋ฅผ ๊ฒ์ํ๊ณ ํด๊ฒฐ์๊ฐ ๋ ๋ค ๊ณ ๋ คํ๋ฉด, ๊ณต๊ฐ ํจํค์ง๊ฐ ์ฐ์ ํ ์ ์์ต๋๋ค.
AWS Fix
์ด ์ทจ์ฝ์ ์ AWS CodeArtifact์์ ๋ฐ๊ฒฌ๋์์ต๋๋ค(์์ธํ ๋ด์ฉ์ ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ฐธ์กฐํ์ญ์์ค). AWS๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์์ โ๋ด๋ถโ ์ด๋ฆ์ ๊ฐ์ ธ์ค์ง ์๋๋ก ์์กด์ฑ/ํผ๋๋ฅผ ๋ด๋ถ์ ์ธ๋ถ๋ก ํ์ํ๋ ์ ์ด๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
Finding Vulnerable Libraries
์์กด์ฑ ํผ๋์ ๋ํ ์๋ ๊ฒ์๋ฌผ์์ ์ ์๋ ์์ฒ ๊ฐ์ ๋
ธ์ถ๋ ๋งค๋ํ์คํธ(์: package.json, requirements.txt, lockfiles)๋ฅผ ์ฐพ์ ๋ด๋ถ ํจํค์ง ์ด๋ฆ์ ์ ์ถํ ๋ค์, ๋ ๋์ ๋ฒ์ ์ ํจํค์ง๋ฅผ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์ํ์ต๋๋ค.
Practical Attacker Playbook (for red teams in authorized tests)
- ์ด๋ฆ ์ด๊ฑฐ:
- ๋งค๋ํ์คํธ/๋ฝ ํ์ผ ๋ฐ ๋ด๋ถ ๋ค์์คํ์ด์ค์ ๋ํ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฐ CI ๊ตฌ์ฑ grep.
- ์กฐ์ง ํน์ ์ ๋์ฌ ์ฐพ๊ธฐ(์:
@company/*,company-*, ๋ด๋ถ groupIds, NuGet ID ํจํด, Go์ ๊ฐ์ธ ๋ชจ๋ ๊ฒฝ๋ก ๋ฑ). - ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์์ ๊ฐ์ฉ์ฑ ํ์ธ:
- ์ด๋ฆ์ด ๊ณต๊ฐ์ ์ผ๋ก ๋ฑ๋ก๋์ง ์์ ๊ฒฝ์ฐ, ๋ฑ๋กํ์ญ์์ค; ์กด์ฌํ๋ ๊ฒฝ์ฐ, ๋ด๋ถ ์ ์ด ์ด๋ฆ์ ๋์์ผ๋ก ํ์ฌ ํ์ ์์กด์ฑ ํ์ทจ๋ฅผ ์๋ํ์ญ์์ค.
- ์ฐ์ ์์๋ก ๊ฒ์:
- โ์ด๊ธฐ๋โ ์ธ๋ฉํฑ ๋ฒ์ ์ ํ(์: ๋งค์ฐ ๋์ ๋ฒ์ ) ๋๋ ํด๊ฒฐ์ ๊ท์น์ ๋ง์ถ๊ธฐ.
- ์ ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ต์ ์ค์น ์๊ฐ ์คํ ํฌํจ(์: npm
preinstall/install/postinstall์คํฌ๋ฆฝํธ). Python์ ๊ฒฝ์ฐ, ํ ์ด ์ผ๋ฐ์ ์ผ๋ก ์ค์น ์ ์์ ์ฝ๋๋ฅผ ์คํํ์ง ์์ผ๋ฏ๋ก ๊ฐ์ ธ์ค๊ธฐ ์๊ฐ ์คํ ๊ฒฝ๋ก๋ฅผ ์ ํธํฉ๋๋ค. - ์ ์ด ์ ์ถ:
- CI์์ ๊ทํ์ ์ ์ด๋ ์๋ํฌ์ธํธ๋ก์ ์์๋ฐ์ด๋๊ฐ ํ์ฉ๋๋์ง ํ์ธํ์ญ์์ค; ๊ทธ๋ ์ง ์์ผ๋ฉด DNS ์ฟผ๋ฆฌ ๋๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ฌ์ด๋ ์ฑ๋๋ก ์ฌ์ฉํ์ฌ ์ฝ๋ ์คํ์ ์ฆ๋ช ํ์ญ์์ค.
Caution
ํญ์ ์๋ฉด ์น์ธ์ ๋ฐ๊ณ , ์ฐธ์ฌ๋ฅผ ์ํด ๊ณ ์ ํ ํจํค์ง ์ด๋ฆ/๋ฒ์ ์ ์ฌ์ฉํ๋ฉฐ, ํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ฉด ์ฆ์ ๊ฒ์ ์ทจ์ํ๊ฑฐ๋ ์ ๋ฆฌ๋ฅผ ์กฐ์ ํ์ญ์์ค.
Defender Playbook (what actually prevents confusion)
์ํ๊ณ ์ ๋ฐ์ ๊ฑธ์ณ ์๋ํ๋ ๊ณ ๊ธ ์ ๋ต:
- ๊ณ ์ ํ ๋ด๋ถ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๋จ์ผ ๋ ์ง์คํธ๋ฆฌ์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
- ํด๊ฒฐ ์๊ฐ์ ์ ๋ขฐ ์์ค ํผํฉ์ ํผํ์ญ์์ค. ์น์ธ๋ ๊ณต๊ฐ ํจํค์ง๋ฅผ ํ๋ก์ํ๋ ๋จ์ผ ๋ด๋ถ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ ํธํ๊ณ ํจํค์ง ๊ด๋ฆฌ์์๊ฒ ๋ด๋ถ ๋ฐ ๊ณต๊ฐ ์๋ํฌ์ธํธ๋ฅผ ๋ชจ๋ ์ ๊ณตํ์ง ๋ง์ญ์์ค.
- ์ง์ํ๋ ๊ด๋ฆฌ์์ ๋ํด ํจํค์ง๋ฅผ ํน์ ์์ค์ ๋งคํํ์ญ์์ค(๋ ์ง์คํธ๋ฆฌ ๊ฐ์ ์ ์ญ โ์ต๊ณ ๋ฒ์ โ ์์).
- ๊ณ ์ ๋ฐ ์ ๊ธ:
- ํด๊ฒฐ๋ ๋ ์ง์คํธ๋ฆฌ URL์ ๊ธฐ๋กํ๋ ๋ฝํ์ผ(npm/yarn/pnpm)์ ์ฌ์ฉํ๊ฑฐ๋ ํด์/์ฆ๋ช
๊ณ ์ ์ ์ฌ์ฉํ์ญ์์ค(pip
--require-hashes, Gradle ์์กด์ฑ ๊ฒ์ฆ). - ๋ ์ง์คํธ๋ฆฌ/๋คํธ์ํฌ ๊ณ์ธต์์ ๋ด๋ถ ์ด๋ฆ์ ๋ํ ๊ณต๊ฐ ๋์ฒด๋ฅผ ์ฐจ๋จํ์ญ์์ค.
- ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์์ ๋ด๋ถ ์ด๋ฆ์ ์์ฝํ์ฌ ํฅํ ์ค์ฟผํธ๋ฅผ ๋ฐฉ์งํ์ญ์์ค.
Ecosystem Notes and Secure Config Snippets
๋ค์์ ์์กด์ฑ ํผ๋์ ์ค์ด๊ฑฐ๋ ์ ๊ฑฐํ๊ธฐ ์ํ ์ค์ฉ์ ์ด๊ณ ์ต์ํ์ ๊ตฌ์ฑ์ ๋๋ค. CI ๋ฐ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ด๋ฅผ ์ํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
JavaScript/TypeScript (npm, Yarn, pnpm)
- ๋ชจ๋ ๋ด๋ถ ์ฝ๋์ ๋ํด ๋ฒ์๊ฐ ์ง์ ๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ณ ๋ฒ์๋ฅผ ๊ฐ์ธ ๋ ์ง์คํธ๋ฆฌ์ ๊ณ ์ ํฉ๋๋ค.
- CI์์ ์ค์น๋ฅผ ๋ถ๋ณ์ผ๋ก ์ ์งํฉ๋๋ค(npm lockfile,
yarn install --immutable).
.npmrc (ํ๋ก์ ํธ ์์ค)
# Bind internal scope to private registry; do not allow public fallback for @company/*
@company:registry=https://registry.corp.example/npm/
# Always authenticate to the private registry
//registry.corp.example/npm/:_authToken=${NPM_TOKEN}
strict-ssl=true
package.json (๋ด๋ถ ํจํค์ง์ฉ)
{
"name": "@company/api-client",
"version": "1.2.3",
"private": false,
"publishConfig": {
"registry": "https://registry.corp.example/npm/",
"access": "restricted"
}
}
Yarn Berry (.yarnrc.yml)
npmScopes:
company:
npmRegistryServer: "https://registry.corp.example/npm/"
npmAlwaysAuth: true
# CI should fail if lockfile would change
enableImmutableInstalls: true
์ด์ ํ:
@company๋ฒ์ ๋ด์์๋ง ๋ด๋ถ ํจํค์ง๋ฅผ ๊ฒ์ํ์ธ์.- ์๋ํํฐ ํจํค์ง์ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ์์ ์ง์ ๊ฐ ์๋ ๊ฐ์ธ ํ๋ก์/๋ฏธ๋ฌ๋ฅผ ํตํด ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ํ์ฉํ์ธ์.
- ๊ฒ์ํ๋ ๊ณต๊ฐ ํจํค์ง์ ๋ํด npm ํจํค์ง ์ถ์ฒ๋ฅผ ํ์ฑํํ์ฌ ์ถ์ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์ (ํผ๋์ ๋ฐฉ์งํ์ง๋ ์์ต๋๋ค).
Python (pip / Poetry)
ํต์ฌ ๊ท์น: ์ ๋ขฐ ์์ค์ ํผํฉํ๊ธฐ ์ํด --extra-index-url์ ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ค์ ์ค ํ๋๋ฅผ ์ ํํ์ธ์:
- ์น์ธ๋ PyPI ํจํค์ง๋ฅผ ํ๋ก์ํ๊ณ ์บ์ํ๋ ๋จ์ผ ๋ด๋ถ ์ธ๋ฑ์ค๋ฅผ ๋ ธ์ถํ๊ฑฐ๋,
- ๋ช ์์ ์ธ๋ฑ์ค ์ ํ ๋ฐ ํด์ ๊ณ ์ ์ ์ฌ์ฉํ์ธ์.
pip.conf
[global]
index-url = https://pypi.corp.example/simple
# Disallow source distributions when possible
only-binary = :all:
# Lock with hashes generated via pip-tools
require-hashes = true
pip-tools๋ก ํด์๋ ์๊ตฌ ์ฌํญ ์์ฑํ๊ธฐ:
# From pyproject.toml or requirements.in
pip-compile --generate-hashes -o requirements.txt
pip install --require-hashes -r requirements.txt
๊ณต์ PyPI์ ์ ๊ทผํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ด๋ถ ํ๋ก์๋ฅผ ํตํด ์ ๊ทผํ๊ณ ๋ช
์์ ์ธ ํ์ฉ ๋ชฉ๋ก์ ์ ์งํ์ญ์์ค. CI์์ --extra-index-url ์ฌ์ฉ์ ํผํ์ญ์์ค.
.NET (NuGet)
ํจํค์ง ID ํจํด์ ๋ช ์์ ์ธ ์์ค์ ์ฐ๊ฒฐํ๊ณ ์์์น ๋ชปํ ํผ๋์์์ ํด์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํจํค์ง ์์ค ๋งคํ์ ์ฌ์ฉํ์ญ์์ค.
nuget.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="corp" value="https://nuget.corp.example/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
<packageSource key="corp">
<package pattern="Company.*" />
<package pattern="Internal.Utilities" />
</packageSource>
</packageSourceMapping>
</configuration>
Java (Maven/Gradle)
Maven settings.xml (๋ชจ๋ ๊ฒ์ ๋ด๋ถ๋ก ๋ฏธ๋ฌ๋ง; Enforcer๋ฅผ ํตํด POM์์ ์์ ๋ฆฌํฌ์งํ ๋ฆฌ ํ์ฉ ๊ธ์ง):
<settings>
<mirrors>
<mirror>
<id>internal-mirror</id>
<mirrorOf>*</mirrorOf>
<url>https://maven.corp.example/repository/group</url>
</mirror>
</mirrors>
</settings>
Enforcer๋ฅผ ์ถ๊ฐํ์ฌ POM์ ์ ์ธ๋ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฐจ๋จํ๊ณ ๋ฏธ๋ฌ ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.6.1</version>
<executions>
<execution>
<id>enforce-no-repositories</id>
<goals><goal>enforce</goal></goals>
<configuration>
<rules>
<requireNoRepositories />
</rules>
</configuration>
</execution>
</executions>
</plugin>
Gradle: ์์กด์ฑ์ ์ค์ ์ง์คํํ๊ณ ์ ๊ธ.
settings.gradle(.kts)์์๋ง ๋ฆฌํฌ์งํ ๋ฆฌ ๊ฐ์ ์ ์ฉ:
dependencyResolutionManagement {
repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS
repositories {
maven { url = uri("https://maven.corp.example/repository/group") }
}
}
- ์ข
์์ฑ ๊ฒ์ฆ(์ฒดํฌ์ฌ/์๋ช
)์ ํ์ฑํํ๊ณ
gradle/verification-metadata.xml์ ์ปค๋ฐํฉ๋๋ค.
Go Modules
๊ณต์ฉ ํ๋ก์์ ์ฒดํฌ์ฌ DB๊ฐ ์ฌ์ฉ๋์ง ์๋๋ก ๊ฐ์ธ ๋ชจ๋์ ๊ตฌ์ฑํฉ๋๋ค.
# Use corporate proxy first, then public proxy as fallback
export GOPROXY=https://goproxy.corp.example,https://proxy.golang.org
# Mark private paths to skip proxy and checksum db
export GOPRIVATE=*.corp.example.com,github.com/your-org/*
export GONOSUMDB=*.corp.example.com,github.com/your-org/*
Rust (Cargo)
์น์ธ๋ ๋ด๋ถ ๋ฏธ๋ฌ ๋๋ ๊ณต๊ธ์ ์ฒด ๋๋ ํ ๋ฆฌ๋ก crates.io๋ฅผ ๊ต์ฒดํ์ฌ ๋น๋๋ฅผ ์ํํ๊ณ , ์์์ ๊ณต๊ฐ ๋์ฒด๋ฅผ ํ์ฉํ์ง ๋ง์ญ์์ค.
.cargo/config.toml
[source.crates-io]
replace-with = "corp-mirror"
[source.corp-mirror]
registry = "https://crates-mirror.corp.example/index"
๊ฒ์๋ฅผ ์ํด --registry๋ฅผ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๊ฒฉ ์ฆ๋ช
์ ๋์ ๋ ์ง์คํธ๋ฆฌ๋ก ์ ํํ์ญ์์ค.
Ruby (Bundler)
์์ค ๋ธ๋ก์ ์ฌ์ฉํ๊ณ ๋ค์ค ์์ค Gemfile์ ๋นํ์ฑํํ์ฌ gem์ด ์๋๋ ๋ฆฌํฌ์งํ ๋ฆฌ์์๋ง ์ค๋๋ก ํ์ญ์์ค.
Gemfile
source "https://gems.corp.example"
source "https://rubygems.org" do
gem "rails"
gem "pg"
end
source "https://gems.corp.example" do
gem "company-logging"
end
๊ตฌ์ฑ ์์ค์์ ์ํ:
bundle config set disable_multisource true
CI/CD ๋ฐ ๋ ์ง์คํธ๋ฆฌ ์ ์ด
- ๋จ์ผ ์ง์ ์ ์ผ๋ก์์ ๊ฐ์ธ ๋ ์ง์คํธ๋ฆฌ:
- ๊ฐ๋ฐ์/CI๊ฐ ์ ๊ทผํ ์ ์๋ ์ ์ผํ ์๋ํฌ์ธํธ๋ก Artifactory/Nexus/CodeArtifact/GitHub Packages/Azure Artifacts๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ด๋ถ ๋ค์์คํ์ด์ค๊ฐ ํญ์ ์ ์คํธ๋ฆผ ๊ณต๊ฐ ์์ค์์ ํด๊ฒฐ๋์ง ์๋๋ก ์ฐจ๋จ/ํ์ฉ ๊ท์น์ ๊ตฌํํฉ๋๋ค.
- CI์์ ์ ๊ธ ํ์ผ์ ๋ถ๋ณ์ ๋๋ค:
- npm:
package-lock.json์ ์ปค๋ฐํ๊ณ ,npm ci๋ฅผ ์ฌ์ฉํฉ๋๋ค. - Yarn:
yarn.lock์ ์ปค๋ฐํ๊ณ ,yarn install --immutable์ ์ฌ์ฉํฉ๋๋ค. - Python: ํด์๋
requirements.txt๋ฅผ ์ปค๋ฐํ๊ณ ,--require-hashes๋ฅผ ๊ฐ์ ํฉ๋๋ค. - Gradle:
verification-metadata.xml์ ์ปค๋ฐํ๊ณ , ์ ์ ์๋ ์ํฐํฉํธ์์ ์คํจํฉ๋๋ค. - ์์๋ฐ์ด๋ ์ด๊ทธ๋ ์ค ์ ์ด: ์น์ธ๋ ํ๋ก์๋ฅผ ํตํด์๋ง CI์์ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ์ง์ ์ ๊ทผ์ ์ฐจ๋จํฉ๋๋ค.
- ์ด๋ฆ ์์ฝ: ์ง์๋๋ ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์์ ๋ด๋ถ ์ด๋ฆ/๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ ๋ฑ๋กํฉ๋๋ค.
- ํจํค์ง ์ถ์ฒ/์ฆ๋ช : ๊ณต๊ฐ ํจํค์ง๋ฅผ ๊ฒ์ํ ๋, ๋ณ์กฐ๋ฅผ ๋ ์ฝ๊ฒ ๊ฐ์งํ ์ ์๋๋ก ์ถ์ฒ/์ฆ๋ช ์ ํ์ฑํํฉ๋๋ค.
์ฐธ๊ณ ๋ฌธํ
- https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610
- https://zego.engineering/dependency-confusion-in-aws-codeartifact-86b9ff68963d
- https://learn.microsoft.com/en-us/nuget/consume-packages/package-source-mapping
- https://yarnpkg.com/configuration/yarnrc/
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


