Leveranskedja
Vad är dependency confusion?
Dependency confusion är en attack där ett bygge installerar en angripares publika paket i stället för ditt privata paket med samma namn. Ingen skriver fel. Angriparen behöver bara ta reda på ett internt paketnamn och publicera det i ett publikt register med ett högt versionsnummer, så gör ett felkonfigurerat bygge resten.
Uppdaterad
Så fungerar en dependency confusion-attack
- Hitta ett internt namn. Privata paketnamn läcker genom publik kod, JavaScript-buntar, felmeddelanden och manifest som lämnats kvar i repon.
- Publicera samma namn publikt. Angriparen registrerar det på npm, PyPI eller ett annat publikt register, med ett mycket högt versionsnummer.
- Vänta på ett bygge. En pakethanterare som är konfigurerad att kontrollera både det interna och det publika registret hittar två kandidater och föredrar den högre versionen.
- Kör inne i företaget. Paketets installationsskript körs på en utvecklares dator eller en CI-runner, med åtkomst till allt som finns där.
Forskningen som gav det dess namn
I februari 2021 publicerade säkerhetsforskaren Alex Birsan tekniken. Han hade använt den för att få kod att köras i fler än 35 organisationer, däribland Apple, Microsoft och PayPal, inom bug bounty-program eller med tillstånd. Den fungerade med alla tre språken han testade, och angripare började kopiera den inom några dagar efter publiceringen.
Varför det händer
Grundorsaken är en pakethanterare som behandlar flera register som likvärdiga. Det klassiska exemplet är Python: pips
--extra-index-url lägger till en andra källa bredvid PyPI, och pip kan installera det publika paketet om det hittar
ett med samma namn.
# Unsafe for private packages: both indexes are candidates
pip install --extra-index-url https://pypi.internal.example/simple my-internal-lib
# Safer: one index you control, which proxies public packages
pip install --index-url https://pypi.internal.example/simple my-internal-lib
npm har samma problem med interna namn utan scope, medan ett scope som är knutet till ditt register undviker det.
# .npmrc: everything under @acme comes only from your registry
@acme:registry=https://npm.internal.example/
Så förhindrar du dependency confusion
- Använd en enda sanningskälla. Peka byggen mot ett enda internt register som fungerar som proxy för publika paket, och konfigurera det så att interna namn aldrig löses publikt.
-
Använd scope eller namnrymder. Äg ett scope som
@acmei det publika registret, och mappa det till ditt privata. - Reservera dina namn. Registrera interna paketnamn i publika register, så att ingen annan kan göra det.
-
Lås och verifiera. Checka in en lockfile och använd hashkontroll, till exempel pips
--require-hashes, så att ett annat paket får installationen att misslyckas. Se vad en lockfile gör och inte gör. - Begränsa vart byggen kan ansluta. Om ett bygge bara kan nå ditt register kan det inte hämta angriparens paket över huvud taget. Se egress-policy för GitHub Actions.
- Kontrollera vad du läcker. Sök i publik kod och klientbuntar efter dina interna paketnamn.
Dependency confusion vs typosquatting
Typosquatting bygger på att en person skriver fel namn på ett publikt paket. Dependency confusion använder det exakta namnet på ett privat paket och bygger på hur bygget är konfigurerat. Båda leder till samma sak: angriparens kod körs i ditt bygge. Se vad är en attack mot leveranskedjan för hur de hänger ihop med andra attacker.
Så ser du om du har drabbats
Leta efter interna paketnamn som lösts från ett publikt register, eller versioner som inte finns i ditt interna register. Det är svårt att göra med bara en lockfile, eftersom frågan är varifrån ett paket faktiskt kom under bygget.
Så hjälper CRACI
CRACI arbetar i det ögonblick paketet hämtas. Som din GitHub Actions-runner upprätthåller CRACI en egress-policy med typade källor för register, så ett bygge kan begränsas till de register du tillåter. CRACI registrerar också varje paket som varje jobb hämtade i en SBOM, så du kan se vad som kom in i ett bygge. CRACI upptäcker inte att ett paket är skadligt, så behåll din registerkonfiguration som första försvarslinje. Se bästa praxis för säkerhet i mjukvarans leveranskedja.
Dependency confusion: vanliga frågor
Vad är en dependency confusion-attack?
En attack där ett publikt paket med samma namn som ett privat installeras av misstag, eftersom pakethanteraren kontrollerar båda registren och föredrar den högre versionen.
Hur skiljer sig dependency confusion från typosquatting?
Typosquatting bygger på att någon skriver fel namn på ett publikt paket. Dependency confusion använder det exakta namnet på ett privat paket och bygger på en byggkonfiguration som kontrollerar publika register.
Hur förhindrar du dependency confusion?
Använd ett enda internt register, paketnamn med scope, lockfiler med hashkontroll och regler som begränsar vilka register dina byggen kan nå. Det hjälper också att reservera dina interna namn publikt.
Är --extra-index-url säkert?
Inte för privata paket. Det gör båda indexen till kandidater, så ett publikt paket med samma namn kan installeras. Använd --index-url med ett index som du kontrollerar.
Vem upptäckte dependency confusion?
Säkerhetsforskaren Alex Birsan publicerade tekniken i februari 2021, efter att ha använt den mot fler än 35 organisationer inom bug bounty-program eller med tillstånd.
Begränsa varifrån dina byggen kan hämta
Tillåt bara de register som ett GitHub Actions-jobb behöver, och se varje paket det drog in.
Boka en demo