8. jūlijā klusi iznāca npm v12.0.0, un ar to mainījās viena no visbiežāk izpildītajām komandām izstrādē. Kopš šīs versijas npm install vairs automātiski nepalaiž atkarību dzīves cikla skriptus — preinstall, install un postinstall. Tā arī neielādē git atkarības un pakotnes no attālām URL adresēm, ja vien tās nav skaidri atļautas.
Tā ir lielākā drošības pārbūve npm 16 gadu vēsturē. Iemesls nav teorētisks: aiz tās stāv gads, kurā uzbrucēji instalācijas skriptus pārvērta par galveno ceļu, kā iekļūt izstrādātāju mašīnās un CI konveijeros.
Kas tieši mainās
Oficiālajā GitHub izmaiņu žurnālā aprakstītas trīs izmaiņas, kas visas pēc noklusējuma ir izslēgtas:
- allowScripts = off. Instalācija vairs neizpilda pakotņu dzīves cikla skriptus. Būtiski: tas attiecas arī uz vietējiem
node-gypbūvējumiem — pakotne arbinding.gypfailu tiek bloķēta, jo npm tai netieši palaižnode-gyp rebuild. - –allow-git = none. Git atkarības (gan tiešās, gan pārmantotās) netiek atrisinātas bez skaidras atļaujas. Tas aizver ceļu, kur git atkarības
.npmrcfails varēja pārrakstīt git izpildāmo failu pat ar--ignore-scripts. - –allow-remote = none. Atkarības no attālām URL adresēm, piemēram, https tarball arhīviem, vairs netiek ielādētas bez
--allow-remotekaroga.
Atļauto pakotņu saraksts tiek ierakstīts package.json, tātad nonāk versiju kontrolē un ir redzams visai komandai. Lai pārskatītu, kuras pakotnes gaida atļauju, palaiž npm approve-scripts --allow-scripts-pending; uzticamās apstiprina ar npm approve-scripts, pārējās bloķē ar npm deny-scripts.
Kāpēc — Miasma tārps un “fantoma gyp”
Skaidrākais piemērs, kāpēc vecais modelis vairs nedarbojās, notika 3. jūnijā. Vienā kampaņā, kas ilga mazāk par divām stundām, tika kompromitētas 57 npm pakotnes 286 versijās. Lielākais upuris bija @vapi-ai/server-sdk ar vairāk nekā 408 000 lejupielādēm mēnesī, kā arī ai-sdk-ollama ar 120 000 lejupielādēm.
Uzbrukuma triks bija smalks. Tā vietā, lai izmantotu viegli pamanāmus postinstall skriptus, uzbrucēji ievietoja tikai 157 baitus lielu binding.gyp failu. Tajā tika ļaunprātīgi izmantota gyp komandu aizstāšanas sintakse, lai kodu izpildītu tieši instalācijas laikā, apejot skenerus, kas meklē vienīgi klasiskos dzīves cikla skriptus. StepSecurity analīze šo paņēmienu nosauca par “fantoma gyp”.
Kravnesība bija četrpakāpju un ļoti agresīva. Tā zaga akreditācijas datus no AWS, GCP, Azure, Vault un GitHub Actions, izsūca nemaskētus noslēpumus no CI konveijeru atmiņas, kā arī rakstīja aizmugures durvis izstrādes rīku konfigurācijās — .claude/, .cursor/ un .vscode/ mapēs.
Uzbrukums parādīja, ka vietējās būvēšanas sistēmas apiet instalācijas skriptu uzraudzību. Tieši tāpēc aizsardzībai jāsniedzas tālāk par dzīves cikla skriptu atklāšanu.
Vēl nepatīkamāk: tārps mēģināja izplatīties tālāk, viltojot Sigstore izcelsmes apliecinājumus npm un RubyGems pakotnēm. Tas nozīmē, ka pat kriptogrāfiskais “pierādījums” par pakotnes izcelsmi vairs nebija droši uzticams.
Skaitļi, kas piespieda rīkoties
Viena kampaņa nav statistika. Tāpēc svarīgāks ir plašāks aina. Pēc Sonatype 2026. gada piegādes ķēdes ziņojuma tikai 2025. gadā tika publicētas gandrīz 455 000 ļaunprātīgu atklātā koda pakotņu. Kopējais bloķēto pakotņu skaits pārsniedza 1,233 miljonus — par 75% vairāk nekā gadu iepriekš.
Pie tā jāpieskaita mērķtiecīgas kampaņas, kuras drošības pētnieki piedēvēja Ziemeļkorejas grupējumiem un kuras skāra tādas plaši lietotas bibliotēkas kā Axios un Mastra AI ekosistēmu. Kad uzbrukumi kļust rūpnieciski, punktveida labojumi vairs nelīdz — jāmaina pati noklusējuma uzvedība.
Ko darīt jau tagad
Labā ziņa ir tā, ka pāreja nav pēkšņa. Visas trīs izmaiņas jau ir pieejamas ar brīdinājumiem npm versijās, sākot no 11.16.0. Praktiskais ceļš izskatās šādi:
- Atjaunini uz npm 11.16.0 vai jaunāku, palaid parasto instalāciju un izlasi brīdinājumus — tā redzēsi, kuras pakotnes tavā projektā paļaujas uz skriptiem.
- Ar
npm approve-scriptsizveido atļauto pakotņu sarakstu un iekļauj to versiju kontrolē, lai komanda zina, kas drīkst izpildīt kodu. - Pārbaudi CI konveijerus. Ja tie balstās uz vietējiem būvējumiem (piemēram,
node-gyp), tos vajadzēs skaidri atļaut, citādi būvējums klusi salūzīs pēc atjaunināšanas uz v12.
Tieši CI ir vieta, kur šī izmaiņa sāp visvairāk. Automātiskie konveijeri parasti darbojas bez cilvēka uzraudzības, tāpēc bloķēts skripts tur izpaužas kā neizskaidrojama kļūda, nevis brīdinājums uz ekrāna.
Ko tas nozīmē ilgtermiņā
Būtiskākā pārmaiņa nav tehniska, bet filozofiska. npm pāriet no principa “atļauts viss, ko neaizliedz” uz “aizliegts viss, ko neatļauj”. Izstrādātājiem tas nozīmē mazliet vairāk berzes — dažas pakotnes būs jāapstiprina manuāli. Toties uzbrucējam vairs nepietiek publicēt ļaunu versiju; tai vēl jātiek cauri komandas apzinātam lēmumam.
npm nav pirmais, kas iet šo ceļu — līdzīgu default-deny loģiku jau izmanto citas ekosistēmas. Bet, ņemot vērā, ka npm ir lielākais pakotņu reģistrs pasaulē, šī noklusējuma maiņa ietekmēs miljoniem projektu. Ja tavs būvējums pēc atjaunināšanas pēkšņi kaut ko neatrod vai neizpilda, visticamāk, tā nav kļūda — tā ir jaunā aizsardzība, kas dara savu darbu.
Avoti
- GitHub Changelog — Upcoming breaking changes for npm v12
- StepSecurity — Miasma npm Supply Chain Attack: Self-Spreading Worm via Phantom Gyp
- The Hacker News — GitHub to Disable npm Install Scripts by Default
- GitHub Community — Preparing for npm v12: install scripts and non-registry sources become opt-in
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.