Dependency Confusion
Reading time: 9 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Basic Information
Dependency Confusion (piafya ya uhamasishaji) hutokea wakati meneja wa kifurushi anapotatua jina la utegemezi kutoka kwenye rejista/chanzo kisichokusudiwa, kisichotegemewa (kawaida ni rejista ya umma) badala ya ile ya kibinafsi/ndani. Hii kwa kawaida inasababisha usakinishaji wa kifurushi kinachodhibitiwa na mshambuliaji.
Sababu kuu za msingi:
- Typosquatting/makosa ya tahajia: Kuagiza
reqests
badala yarequests
(hutatuliwa kutoka rejista ya umma). - Kifurushi cha ndani kisichopo/kilichotelekezwa: Kuagiza
company-logging
ambacho hakipo tena ndani, hivyo mhamasishaji anatazama kwenye rejista za umma na kupata kifurushi cha mshambuliaji. - Upendeleo wa toleo kati ya rejista nyingi: Kuagiza
company-requests
ya ndani wakati mhamasishaji anaruhusiwa pia kuuliza rejista za umma na anapendelea toleo "bora"/jipya lililochapishwa hadharani na mshambuliaji.
Wazo kuu: Ikiwa mhamasishaji anaweza kuona rejista nyingi kwa jina moja la kifurushi na anaruhusiwa kuchagua mgombea "bora" kimataifa, uko hatarini isipokuwa ukizuia utatuzi.
Exploitation
warning
Katika hali zote, mshambuliaji anahitaji tu kuchapisha kifurushi kibaya chenye jina sawa na utegemezi ambao ujenzi wako unapata kutoka kwenye rejista ya umma. Vifungo vya wakati wa usakinishaji (kwa mfano, npm scripts) au njia za msimbo wa wakati wa kuagiza mara nyingi hutoa utekelezaji wa msimbo.
Misspelled & Inexistent
Ikiwa mradi wako unarejelea maktaba ambayo haipatikani katika rejista ya kibinafsi, na zana zako zinarejelea kwenye rejista ya umma, mshambuliaji anaweza kuanzisha kifurushi kibaya chenye jina hilo katika rejista ya umma. Mashine zako za kuendesha/CI/dev zitaipata na kuitekeleza.
Unspecified Version / “Best-version” selection across indexes
Wakuu wa maendeleo mara nyingi wanaacha toleo bila kufunga au kuruhusu mipaka pana. Wakati mhamasishaji amewekwa na viashiria vya ndani na vya umma, inaweza kuchagua toleo jipya bila kujali chanzo. Kwa majina ya ndani kama requests-company
, ikiwa kiashiria cha ndani kina 1.0.1
lakini mshambuliaji anachapisha 1.0.2
kwenye rejista ya umma na mhamasishaji wako unachukulia vyote, kifurushi cha umma kinaweza kushinda.
AWS Fix
Uthibitisho huu ulipatikana katika AWS CodeArtifact (soma maelezo katika chapisho hili la blog). AWS iliongeza udhibiti ili kuashiria utegemezi/makundi kama ya ndani dhidi ya ya nje ili mteja asipate majina "ya ndani" kutoka kwenye rejista za umma.
Finding Vulnerable Libraries
Katika chapisho la awali kuhusu mkanganyiko wa utegemezi, mwandishi alitafuta maelfu ya orodha zilizofichuliwa (kwa mfano, package.json
, requirements.txt
, lockfiles) ili kudhani majina ya kifurushi cha ndani na kisha kuchapisha kifurushi chenye toleo kubwa kwenye rejista za umma.
Practical Attacker Playbook (for red teams in authorized tests)
- Enumerate names:
- Grep repos and CI configs for manifest/lock files and internal namespaces.
- Look for organization-specific prefixes (kwa mfano,
@company/*
,company-*
, internal groupIds, NuGet ID patterns, private module paths for Go, nk.). - Check public registries for availability:
- Ikiwa jina halijajiandikisha hadharani, jiandikishe; ikiwa lipo, jaribu kuiba utegemezi kwa kulenga majina ya ndani ya transitive.
- Publish with precedence:
- Chagua semver inayoshinda (kwa mfano, toleo la juu sana) au inalingana na sheria za mhamasishaji.
- Jumuisha utekelezaji wa wakati wa usakinishaji ambapo inafaa (kwa mfano, npm
preinstall
/install
/postinstall
scripts). Kwa Python, pendelea njia za utekelezaji wa wakati wa kuagiza, kwani magurudumu kwa kawaida hayatekelezi msimbo wa kawaida wakati wa usakinishaji. - Exfil control:
- Hakikisha kwamba outbound inaruhusiwa kutoka CI hadi mwisho wako ulio na udhibiti; vinginevyo tumia maswali ya DNS au ujumbe wa makosa kama njia ya pembeni kuthibitisha utekelezaji wa msimbo.
caution
Daima pata idhini ya maandishi, tumia majina/majaribio ya kifurushi maalum kwa ushirikiano, na mara moja futa au kuratibu usafi wakati majaribio yanapokamilika.
Defender Playbook (what actually prevents confusion)
Mikakati ya juu inayofanya kazi katika mifumo mbalimbali:
- Tumia majina ya ndani ya kipekee na uunganishe na rejista moja.
- Epuka kuchanganya viwango vya kuaminika wakati wa utatuzi. Pendelea rejista moja ya ndani ambayo inachuja kifurushi kilichothibitishwa badala ya kuwapa wasimamizi wa kifurushi viungo vya ndani na vya umma.
- Kwa wasimamizi wanaounga mkono, ramani kifurushi kwa vyanzo maalum (hakuna "best-version" ya kimataifa kati ya rejista).
- Pin and lock:
- Tumia lockfiles ambazo zinaandika URLs za rejista zilizotatuliwa (npm/yarn/pnpm) au tumia pinning ya hash/uthibitisho (pip
--require-hashes
, uthibitisho wa utegemezi wa Gradle). - Zuia kurudi kwa umma kwa majina ya ndani kwenye safu ya rejista/mtandao.
- Hifadhi majina yako ya ndani katika rejista za umma inapowezekana ili kuzuia squat ya baadaye.
Ecosystem Notes and Secure Config Snippets
Hapa chini kuna mipangilio ya vitendo, ya chini ili kupunguza au kuondoa mkanganyiko wa utegemezi. Pendelea kutekeleza haya katika mazingira ya CI na ya maendeleo.
JavaScript/TypeScript (npm, Yarn, pnpm)
- Tumia kifurushi kilichopangwa kwa ajili ya msimbo wote wa ndani na uweke kiwango kwenye rejista yako ya kibinafsi.
- Hifadhi usakinishaji kuwa usiobadilika katika CI (npm lockfile,
yarn install --immutable
).
.npmrc (project-level)
# 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 (kwa kifurushi cha ndani)
{
"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
Operational tips:
- Chapisha tu pakiti za ndani ndani ya
@company
scope. - Kwa pakiti za upande wa tatu, ruhusu rejista ya umma kupitia proxy/mirror yako ya kibinafsi, si moja kwa moja kutoka kwa wateja.
- Fikiria kuwezesha npm package provenance kwa pakiti za umma unazochapisha ili kuongeza ufuatiliaji (haizuia mkanganyiko yenyewe).
Python (pip / Poetry)
Kanuni kuu: Usitumie --extra-index-url
kuchanganya viwango vya kuaminika. Ama:
- Funua index moja ya ndani inayopitisha na kuhifadhi pakiti za PyPI zilizothibitishwa, au
- Tumia uchaguzi wa index wazi na hash pinning.
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
Zalisha mahitaji yaliyopangwa na pip-tools:
# From pyproject.toml or requirements.in
pip-compile --generate-hashes -o requirements.txt
pip install --require-hashes -r requirements.txt
Ikiwa lazima ufikie PyPI ya umma, fanya hivyo kupitia proxy yako ya ndani na uweke orodha ya ruhusa wazi hapo. Epuka --extra-index-url
katika CI.
.NET (NuGet)
Tumia Ramani ya Chanzo cha Kifurushi kuunganisha mifumo ya ID ya kifurushi na vyanzo wazi na kuzuia ufumbuzi kutoka kwa vyanzo visivyotarajiwa.
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 (mirror all to internal; disallow ad-hoc repos in POMs via Enforcer):
<settings>
<mirrors>
<mirror>
<id>internal-mirror</id>
<mirrorOf>*</mirrorOf>
<url>https://maven.corp.example/repository/group</url>
</mirror>
</mirrors>
</settings>
Ongeza Enforcer ili kupiga marufuku hifadhidata zilizotangazwa katika POMs na kulazimisha matumizi ya kioo chako:
<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: Kamilisha na kufunga utegemezi.
- Lazimisha hifadhi katika
settings.gradle(.kts)
pekee:
dependencyResolutionManagement {
repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS
repositories {
maven { url = uri("https://maven.corp.example/repository/group") }
}
}
- Wezesha uthibitisho wa utegemezi (checksums/saini) na uweke
gradle/verification-metadata.xml
.
Go Modules
Sanidi moduli za kibinafsi ili proxy ya umma na DB ya checksum zisitumike kwa ajili yao.
# 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)
Badilisha crates.io na kioo cha ndani kilichothibitishwa au directory ya muuzaji kwa ajili ya ujenzi; usiruhusu kurudi kwa umma bila mpangilio.
.cargo/config.toml
[source.crates-io]
replace-with = "corp-mirror"
[source.corp-mirror]
registry = "https://crates-mirror.corp.example/index"
Kwa kuchapisha, kuwa wazi na --registry
na kuweka akidi za kuingia kwenye usajili wa lengo.
Ruby (Bundler)
Tumia vizuizi vya chanzo na uzuie Gemfiles za multisource ili gem ziweze kuja tu kutoka kwenye hifadhi iliyokusudiwa.
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
Tekeleza katika ngazi ya usanidi:
bundle config set disable_multisource true
CI/CD na Udhibiti wa Rejista Zinazosaidia
- Rejista binafsi kama ingizo moja:
- Tumia Artifactory/Nexus/CodeArtifact/GitHub Packages/Azure Artifacts kama kiunganishi pekee ambacho waendelezaji/CI wanaweza kufikia.
- Tekeleza sheria za kuzuia/ruhusu ili majina ya ndani yasitatuliwe kutoka vyanzo vya umma vya juu.
- Faili za kufunga hazibadilishwi katika CI:
- npm: thibitisha
package-lock.json
, tumianpm ci
. - Yarn: thibitisha
yarn.lock
, tumiayarn install --immutable
. - Python: thibitisha
requirements.txt
iliyohashishwa, lazimisha--require-hashes
. - Gradle: thibitisha
verification-metadata.xml
na ufele kwenye vitu visivyojulikana. - Udhibiti wa kutoka nje: zuia ufikiaji wa moja kwa moja kutoka CI kwenda kwenye rejista za umma isipokuwa kupitia proxy iliyoidhinishwa.
- Hifadhi majina: sajili majina yako ya ndani/majina ya nafasi katika rejista za umma ambapo inasaidiwa.
- Uthibitisho wa kifurushi / uthibitisho: unapochapisha vifurushi vya umma, wezesha uthibitisho/uthibitisho ili kufanya udanganyifu kuwa rahisi kugundulika chini.
Marejeo
- 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
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.