V roce 2026 o 131% více nahlášených CVE denně než loni.

Dodavatelský řetězec

Co je dependency confusion?

Dependency confusion je útok, při kterém build nainstaluje veřejný balíček útočníka místo vašeho soukromého balíčku se stejným názvem. Nikdo se přitom nepřepíše. Útočníkovi stačí zjistit název interního balíčku a zveřejnit ho ve veřejném registru s vysokým číslem verze. Zbytek obstará špatně nakonfigurovaný build.

Aktualizováno

Jak útok dependency confusion funguje

  1. Najít interní název. Názvy soukromých balíčků unikají přes veřejný kód, JavaScriptové bundly, chybové hlášky a manifesty ponechané v repozitářích.
  2. Zveřejnit stejný název. Útočník ho zaregistruje v npm, PyPI nebo jiném veřejném registru s velmi vysokým číslem verze.
  3. Počkat na build. Správce balíčků nastavený tak, aby prohledával interní i veřejný registr, najde dva kandidáty a dá přednost vyšší verzi.
  4. Spustit se uvnitř firmy. Instalační skript balíčku se spustí na počítači vývojáře nebo na CI runneru a má přístup ke všemu, co tam je.

Výzkum, který útok pojmenoval

V únoru 2021 techniku zveřejnil bezpečnostní výzkumník Alex Birsan. Díky ní spustil kód ve více než 35 organizacích, mimo jiné v Apple, Microsoft a PayPal, v rámci programů bug bounty nebo se svolením. Fungovala ve všech třech jazycích, které testoval, a útočníci ji začali kopírovat během několika dní od zveřejnění.

Proč k tomu dochází

Základní příčinou je správce balíčků, který považuje několik registrů za rovnocenné. Klasickým příkladem je Python: --extra-index-url v pipu přidá vedle PyPI druhý zdroj a pip může nainstalovat veřejný balíček, pokud najde nějaký se stejným názvem.

# 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 má stejný problém s interními názvy bez scope, zatímco scope navázaný na váš registr mu předchází.

# .npmrc: everything under @acme comes only from your registry
@acme:registry=https://npm.internal.example/

Jak dependency confusion předejít

  • Používejte jeden zdroj pravdy. Nasměrujte buildy na jediný interní registr, který funguje jako proxy pro veřejné balíčky, a nastavte ho tak, aby se interní názvy nikdy nevyhledávaly veřejně.
  • Používejte scopes nebo jmenné prostory. Vlastněte ve veřejném registru scope, například @acme, a namapujte ho na svůj soukromý registr.
  • Rezervujte si své názvy. Zaregistrujte názvy interních balíčků ve veřejných registrech, aby je nemohl použít nikdo jiný.
  • Zamykejte a ověřujte. Commitujte lockfile a používejte kontrolu hashů, například --require-hashes v pipu, aby instalace jiného balíčku selhala. Viz co lockfile dělá a co ne.
  • Omezte, kam se buildy mohou připojit. Pokud build dosáhne jen na váš registr, balíček útočníka vůbec nestáhne. Viz egress policy pro GitHub Actions.
  • Zjistěte, co vám uniká. Prohledejte veřejný kód a klientské bundly, zda neobsahují názvy vašich interních balíčků.

Dependency confusion vs typosquatting

Typosquatting spoléhá na to, že se člověk při psaní názvu veřejného balíčku přepíše. Dependency confusion používá přesný název soukromého balíčku a spoléhá na to, jak je build nakonfigurován. Obojí vede ke stejnému cíli: kód útočníka běžící ve vašem buildu. Jak zapadají mezi další útoky, se dozvíte v článku co je útok na dodavatelský řetězec.

Jak zjistit, zda jste byli zasaženi

Hledejte interní názvy balíčků, které se vyřešily z veřejného registru, nebo verze, které ve vašem interním registru neexistují. Ze samotného lockfilu se to zjišťuje těžko, protože jde o to, odkud balíček během buildu skutečně pocházel.

Jak pomáhá CRACI

CRACI působí v místě, kde se balíček stahuje. Jako váš runner pro GitHub Actions vynucuje egress policy s typovanými zdroji pro registry, takže build lze omezit na registry, které povolíte. Navíc zaznamenává každý balíček, který každý job stáhl, do SBOM, takže vidíte, co do buildu vstoupilo. CRACI nerozpozná, že je balíček škodlivý, proto ponechte konfiguraci registrů jako první linii obrany. Viz osvědčené postupy bezpečnosti softwarového dodavatelského řetězce.

Dependency confusion: časté dotazy

Co je útok dependency confusion?

Útok, při kterém se omylem nainstaluje veřejný balíček se stejným názvem jako soukromý, protože správce balíčků prohledává oba registry a dává přednost vyšší verzi.

Čím se dependency confusion liší od typosquattingu?

Typosquatting spoléhá na to, že se někdo přepíše v názvu veřejného balíčku. Dependency confusion používá přesný název soukromého balíčku a spoléhá na konfiguraci buildu, která prohledává veřejné registry.

Jak dependency confusion předejít?

Používejte jediný interní registr, názvy balíčků se scope, lockfily s kontrolou hashů a pravidla, která omezují, na které registry vaše buildy dosáhnou. Pomáhá také veřejně si rezervovat interní názvy.

Je --extra-index-url bezpečný?

Pro soukromé balíčky ne. Z obou indexů dělá kandidáty, takže se může nainstalovat veřejný balíček se stejným názvem. Použijte --index-url s jedním indexem, který máte pod kontrolou.

Kdo dependency confusion objevil?

Bezpečnostní výzkumník Alex Birsan techniku zveřejnil v únoru 2021 poté, co ji použil proti více než 35 organizacím v rámci programů bug bounty nebo se svolením.

Omezte, odkud mohou vaše buildy stahovat

Povolte jen registry, které job v GitHub Actions potřebuje, a podívejte se na každý balíček, který stáhl.

Rezervujte si demo