Přeskočit na obsah
Magazín Chatujme.cz
Bezpečnost · aktualizováno 30. 7. 2026 · čtení na 4 min

npm 12 přestal spouštět instalační skripty, útočníci se přesunuli k importu

GitHub vydal 8. července npm 12. Instalace balíčku už sama od sebe nespustí žádný cizí skript, což zavírá nejčastěji zneužívanou cestu k počítači vývojáře. Dva útoky ze stejného týdne ale ukázaly, kam obrana nedosáhne: škodlivý kód se v obou případech spouštěl až ve chvíli, kdy program napadený balíček načetl.

Kontejnerové depo s vyrovnanými přepravními kontejnery
Dodavatelský řetězec softwaru funguje podobně jako ten nákladní: kdo podstrčí obsah do jednoho kontejneru, doveze ho všem odběratelům. Foto: TrainLearnGrow, Wikimedia Commons (CC BY-SA 4.0)

Balíčkovací nástroj npm, přes který si vývojáři v JavaScriptu stahují cizí knihovny, vydal 8. července verzi 12. Hlavní změnu nejde přehlédnout: příkaz npm install už sám od sebe nespustí žádný skript, který si přinesla stažená závislost. Doteď to dělal u každého balíčku, který si o to řekl.

Tři výchozí hodnoty, které se otočily

Změny jsou tři a všechny posouvají výchozí chování od „důvěřuj“ k „zeptej se“.

  • Volba allowScripts je nově vypnutá. Skripty preinstall, installpostinstall ze závislostí neběží. Netýká se to jen skriptů zapsaných v balíčku – přeskočí se i implicitní překlad přes node-gyp, kterým se sestavují nativní části knihoven.
  • Přepínač --allow-git má nově výchozí hodnotu none. Závislosti odkazující rovnou na git repozitář, ať přímé nebo tranzitivní (tedy závislosti závislostí), se bez svolení vůbec nestáhnou.
  • --allow-remote je na tom stejně. Balíčky tahané z libovolné adresy, typicky archivy přes HTTPS, potřebují také výslovné povolení.

Neschválený skript se jen přeskočí a vypíše se varování, instalace doběhne. Kdo chce v průběžné integraci tvrdé selhání, zapne volbu strict-allow-scripts. Seznam povolených balíčků sestaví příkaz npm approve-scripts --allow-scripts-pending a uloží ho do souboru package.json, takže ho celý tým sdílí přes repozitář. Vyzkoušet si totéž chování šlo už od verze 11.16.0, kde se zapínalo ručně.

Proč zrovna teď

Odpověď dal stejný týden, kdy npm 12 vyšlo. Jedenáctého července se v registru objevila podvržená verze balíčku jscrambler, nástroje na znepřehledňování JavaScriptu. Firma Socket, která registr sleduje, zachytila verzi 8.14.0 šest minut po zveřejnění; balíček má zhruba 15 800 stažení týdně. Následovaly další škodlivé verze 8.16.0, 8.17.0, 8.18.0 a 8.20.0, čistá je až 8.22.0. Jscrambler potvrdil, že útočník získal platné publikační přihlašovací údaje, a zneplatnil je.

Zajímavé je, co ten kód sbíral: peněženky kryptoměn, přihlašovací údaje ke cloudovým službám Amazonu, Googlu a Microsoftu, data prohlížečů, tokeny Discordu a Slacku – a nově i konfigurační soubory asistentů pro psaní kódu, jmenovitě Claude Desktop a Cursoru. Vývojářský počítač je dnes svazek klíčů k cizí infrastruktuře.

Podstatná je ale změna uprostřed té série. Verze 8.14.0 až 8.17.0 spouštěly škodlivý kód přes hák preinstall, tedy přesně tou cestou, kterou npm 12 zavírá. Od verze 8.18.0 se kód přesunul do souborů, které se načtou při běžném použití knihovny. Instalace už s tím neměla nic společného.

Útok, který se instalaci vyhnul úplně

O tři dny později, 14. července, přišel na řadu projekt AsyncAPI, sada nástrojů pro popis rozhraní. Útočník podle rozboru firmy StepSecurity neukradl žádný token do registru. Získal právo zapisovat do vývojové větve repozitáře a publikování nechal na skutečné automatizované lince projektu. Škodlivé balíčky proto vyšly s platným potvrzením původu, takzvanou provenience.

Za necelou hodinu a půl takto vyšlo pět verzí ve čtyřech balíčcích: @asyncapi/generator 3.3.1, @asyncapi/generator-helpers 1.1.1, @asyncapi/generator-components 0.7.1 a @asyncapi/specs ve verzích 6.11.2-alpha.1 a 6.11.2. Než začala náprava, uplynuly asi čtyři hodiny.

Ani jeden z těch balíčků neměl v souboru package.json jediný instalační skript. Kód se spouštěl ve chvíli, kdy si ho program načetl příkazem require nebo import. Rozbor Microsoftu to říká přímo: protože spouštěčem je načtení modulu, a ne instalace, běžné opatření npm install --ignore-scripts útok nezneškodní. Následovalo stažení druhého stupně o velikosti zhruba 8,2 MB, usazení v systému na Windows, Linuxu i macOS a odesílání přihlašovacích údajů z proměnných prostředí a souborů. Microsoft to eviduje pod označením Trojan:JS/MiasmStealer.SC.

Co z toho plyne pro obranu

Nová výchozí nastavení v npm 12 jsou užitečná. Ruší celou třídu útoků, které stačilo spustit stažením závislosti, a to i u knihoven, o kterých vývojář vůbec neví, že je má. Zároveň platí, že ani jeden z popsaných dvou útoků by v poslední fázi nezastavila.

Druhé zjištění je nepříjemnější. Potvrzení původu balíčku říká, že vznikl v konkrétním repozitáři na konkrétní lince. Neříká, že jeho obsah je v pořádku. Kdo si ověřování provenience nastavil jako jedinou kontrolu, má falešný pocit jistoty.

Prakticky to znamená držet zamčené verze v souboru zámku, neaktualizovat závislosti hned v den vydání a sledovat, co proces sestavení dělá – hlavně jestli nespouští procesy navíc a nekomunikuje po síti tam, kam nemá. To je autorovo hodnocení, ne oficiální doporučení.

Utahují se i publikační tokeny

Souběžně s npm 12 oznámil GitHub konec jedné pohodlné výjimky. Podrobné přístupové tokeny nastavené tak, aby obcházely dvoufázové ověření, přijdou začátkem srpna 2026 o možnost obejít ho u citlivých operací: správa tokenů, změna hesla, e-mailu a nastavení dvoufázového ověření, změna přístupu k balíčkům a seznamu správců, správa členství v organizaci.

Zhruba v lednu 2027 pak tytéž tokeny ztratí možnost přímo publikovat. Zbude jim čtení soukromých balíčků a příprava vydání, které se zveřejní až po lidském potvrzení druhým faktorem. GitHub doporučuje přejít na publikování s ověřením přes OIDC, případně na vydávání s lidským schválením, místo dlouhodobě platných publikačních tokenů.

Tým npm chce verzi 12 dostat i do Node.js 24 a 26, čeká ale na souhlas těch, kdo tato vydání spravují.

Zdroje: oznámení npm 12 v changelogu GitHubu, rozbor útoku na balíček jscrambler od firmy Socket, rozbor kompromitace AsyncAPI od firmy StepSecurityanalýza Microsoftu ke spouštění při importu.

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

Bezpečnost

Nvidia ohlásila alianci pro bezpečnost AI. Linux Foundation uvádí jiný seznam členů

Nvidia a Linux Foundation ohlásily v pondělí 27. července Open Secure AI Alliance, sdružení, které má otevřenými nástroji hlídat bezpečnost modelů a agentů. Každý ze dvou zakladatelů ale téhož dne otiskl jiný seznam členů: jeden 52 jmen, druhý 37. Chybí v nich OpenAI, Google i Anthropic, přestože v iniciativě, na kterou se aliance odvolává, jsou všechny tři od června.

Bezpečnost

GNOME zkracuje lhůtu na zveřejnění zranitelností na 30 dní a shání nástupce

Michael Catanzaro oznámil 20. července dvě změny v tom, jak se u GNOME zachází s hlášenými zranitelnostmi. Od 1. srpna se lhůta, po které se chyba zveřejní, zkracuje z devadesáti dnů na třicet. A k 1. listopadu přestane nová hlášení evidovat – dělá to sám od listopadu 2020 a nástupce zatím není. Část přetisků obě změny slila do jedné příčiny, jenže originál je odděluje.

Bezpečnost

Červencová sada záplat Microsoftu je rekordní. Chyby hledala i umělá inteligence

Microsoft vydal 14. července nejrozsáhlejší sadu bezpečnostních záplat ve své historii – podle toho, jak se počítá, 570 nebo 622 zranitelností. Firma sama uvádí, že chyby ve zdrojovém kódu Windows nově vyhledává i systém postavený na umělé inteligenci. Dvě opravené zranitelnosti se aktivně zneužívají a americkým federálním úřadům vypršela dnes lhůta na jejich záplatování.