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

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 ya requests (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, tumia npm ci.
  • Yarn: thibitisha yarn.lock, tumia yarn 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

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