GitHub 8. jūlijā izlaida npm 12 un iestatīja to kā noklusējuma versiju reģistrā. Lielākā izmaiņa attiecas uz atkarību instalācijas skriptiem: preinstall, install un postinstall pēc noklusējuma vairs nepalaižas. Līdz šim tie izpildījās automātiski katrā npm install. Tieši tos pēdējā gada laikā izmantoja lielākie piegādes ķēdes uzbrukumi npm ekosistēmā.
GitHub šos skriptus sauc par lielāko koda izpildes virsmu visā npm reģistrā. Kad ļaundabīga pakotne tos papildina ar savu kodu, tas nostrādā uz izstrādātāja datora vai CI servera tajā pašā brīdī, kad atkarība tiek uzstādīta. npm 12 šo automātisko izpildi aptur un prasa, lai izstrādātājs pats apstiprina, kuriem skriptiem drīkst uzticēties. Detaļas apraksta drošības uzņēmuma Socket analīze.
Kas tieši mainās
Trīs noklusējuma iestatījumi tagad ir izslēgti. Pirmais ir allowScripts, kas iestatīts uz off, tāpēc atkarību dzīves cikla skripti un netiešā node-gyp kompilācija nepalaižas bez atļaujas. Otrais ir --allow-git ar vērtību none, tāpēc Git atkarības, tiešas vai caur citām pakotnēm, netiek atrisinātas. Trešais ir --allow-remote, arī ar vērtību none, tāpēc pakotnes no attāliem URL, piemēram, HTTPS tarball failiem, vairs netiek lejupielādētas.
GitHub dzīves cikla skriptus nosauc par «vienīgo lielāko koda izpildes virsmu npm ekosistēmā».
Praktiskā nozīme ir tāda, ka npm no modeļa «uzticies pēc noklusējuma» pāriet uz modeli, kurā katra svešā koda izpilde prasa skaidru piekrišanu. Agrāk pietika ar vienu ļaundabīgi papildinātu atkarību dziļi atkarību kokā, lai postinstall skripts nostrādātu pat tad, ja izstrādātājs to pakotni tieši nekad neizsauca. Tagad šāds skripts pēc noklusējuma vienkārši nepalaižas.
Git un attālo URL bloķēšana aizver blakus vektoru. Uzbrucēji dažkārt norādīja atkarību uz kompromitētu Git repozitoriju vai tarball failu ārpus reģistra, kur npm audita rīki to neredzēja. Ar --allow-git none un --allow-remote none šādas atkarības npm 12 vairs neatrisina bez atsevišķas atļaujas.
Ko darīt izstrādātājam
Vairums projektu bez skriptiem kaut ko nepalaidīs pareizi. Native moduļi kā sharp, better-sqlite3, bcrypt un node-sass instalācijas laikā kompilē kodu. Rīki kā Cypress, Playwright, Puppeteer un Electron lejupielādē bināros failus tieši ar postinstall skriptu. Visiem tiem tagad vajag atļauju.
Lai atļautu skriptus, jāpalaiž npm approve-scripts. Komanda parāda pakotnes ar skriptiem un to komandas. Izstrādātājs izvēlas, kurām uzticēties. Rezultātā izveidojas atļauto skriptu saraksts, ko pievieno package.json failam un iekomitē repozitorijā, lai visa komanda strādā ar vienādu sarakstu. Bez šī soļa pirmais build pēc jaunināšanas var izgāzties tur, kur agrāk viss gāja cauri pats no sevis.
Ja skripts nav apstiprināts, npm 12 pēc noklusējuma tikai parāda brīdinājumu, bet instalācija turpinās. CI vidēm ir atsevišķs iestatījums strict-allow-scripts, kas brīdinājumus pārvērš par kļūdām. Tad neapstiprināts skripts aptur būvējumu, nevis paslīd cauri klusi.
Kāpēc tagad
Izmaiņa nāk pēc gada, kurā piegādes ķēdes uzbrukumi npm reģistram kļuva regulāri. Jūlijā vien uzbrucēji kompromitēja AsyncAPI pakotnes un jscrambler pakotni. Abos gadījumos ievietotais kods nostrādāja pakotnes ielādes vai instalācijas brīdī, nevis tad, kad izstrādātājs to izsauc. AsyncAPI gadījumu sīki aprakstīja Microsoft drošības komanda.
Šie divi gadījumi rāda arī to, ka tokena zādzība nav vienīgais ceļš. jscrambler pakotnes uzbrucēji publicēja ar nozagtiem publicēšanas datiem. AsyncAPI gadījumā tokens netika zagts vispār. Uzbrucējs ieguva push piekļuvi projekta paša next zaram un laida kodu cauri leģitīmajai GitHub Actions plūsmai, tāpēc pakotnes nesa derīgas npm provenance atzīmes. Instalācijas skriptu bloķēšana strādā abos gadījumos, jo tā aptur nevis publicēšanu, bet koda izpildi uz gala datora.
Skaitļi rāda mērogu. Sonatype 2026. gada pārskats saskaitīja 454 600 jaunu ļaundabīgu pakotņu 2025. gadā. Kopējais bloķēto pakotņu skaits sasniedza 1,233 miljonus, par 75 % vairāk nekā gadu iepriekš.
Kas mainās līdztekus
npm vienlaikus izbeidz atbalstu piekļuves marķieriem (GAT), kas iestatīti tā, lai apietu divfaktoru autentifikāciju. No augusta sākuma šie marķieri zaudē tiesības pārvaldīt kontu, pakotnes un organizācijas. No 2027. gada janvāra ar tiem vairs nevarēs publicēt pakotnes tieši. Paliek tikai privāto pakotņu lasīšana un laidienu sagatavošana, ko cilvēks apstiprina ar 2FA. Šo grafiku apstiprina arī The Hacker News apskats.
npm šeit seko pnpm, kas dzīves cikla skriptus bloķēja jau v10 versijā. pnpm v11 pievienoja arī 24 stundu minimālo laidiena vecumu, pirms pakotni drīkst uzstādīt, lai apturētu tikko publicētas ļaundabīgas versijas.
Izstrādātājiem, kas jauninās uz npm 12, pirmais npm install lielākajā daļā projektu tagad prasīs palaist npm approve-scripts, pirms native moduļi un testu rīki atkal strādās.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.