Kad tu palaid npm install, dators lejupielādē pakotni un uzreiz to uzstāda — arī tad, ja tieši šī versija satur zināmu ievainojamību. Jauns atvērtā koda rīks refuse šo soli pārtver: tas nostājas starp komandu un reģistru, pārbauda pieprasīto pakotni pret vairāk nekā 362 000 zināmu ievainojamību un bloķē versijas ar CVE atzīmi, pirms tās nonāk diskā. Tīrās pakotnes iet cauri bez aiztures.
refuse strādā ar npm, pip, cargo, gem, go un vēl 13 pakotņu pārvaldniekiem — kopā 21 ekosistēma. Kad kāda versija tiek noraidīta, rīks parāda, kuru drošu versiju uzstādīt tās vietā. To var palaist lokāli uz sava datora vai lietot kā pārvaldītu servisu.
Kāpēc rīks parādījās tieši tagad
Autori norāda konkrētu iemeslu: AI kodēšanas aģenti. Claude Code un Cursor palaiž instalācijas komandas no rīka izsaukuma iekšpuses un bieži piespraudē versijas no apmācības datiem. Tās ir versijas, kas bija aktuālas modeļa apmācības brīdī, bet kopš tā laika ieguvušas CVE. Cilvēks, rakstot komandu, dažreiz vēl pamana brīdinājumu vai vecu datumu. Aģents to nepamana — tas izpilda komandu un turpina uzdevumu.
Instalācija iet caur refuse neatkarīgi no tā, kas komandu palaida — tu, tavs aģents vai CI konveijers. Tieši šī vienādā attieksme pret visiem trim ir rīka jēga: aģents un automātiskais konveijers pakotnes uzstāda biežāk nekā cilvēks un bez acu kontroles.
Šī nav tā pati problēma, par ko iepriekš rakstīts saistībā ar izdomātiem pakotņu nosaukumiem, ko aģents pieprasa un uzbrucējs jau iepriekš reģistrējis. Šeit pakotne ir īsta, nosaukums pareizs, uzturētājs likumīgs — kaite ir versijā. Aģents pieprasa, teiksim, versiju, kas bija svaiga pirms gada, un tieši tajā versijā kopš tā laika atrasts un publiskots caurums. refuse skatās uz versiju, ne uz nosaukumu.
Kā notiek pārbaude
Kad tu palaid instalācijas komandu, refuse vispirms sameklē pieprasīto pakotni un versiju zināmo ievainojamību datubāzē. Ja tur ir atbilstība ar CVE, komanda apstājas, un rīks izvada, kura versija ir tīra. Ja atbilstības nav, instalācija turpinās kā parasti. Solis notiek pirms lejupielādes nonākšanas diskā, tāpēc ievainojamā versija natīvos āķus nepaspēj palaist.
Lokālā uzstādīšana tur advisory datus tuvāk datoram un neaizsūta pieprasījumus uz svešu serveri; pārvaldītais serviss ietaupa uzturēšanu, bet katrs instalācijas mēģinājums iziet caur trešās puses infrastruktūru. Komandām, kas strādā slēgtos tīklos, izvēle starp abiem variantiem ir tehniska, ar reālām sekām veiktspējai un datu plūsmai.
Instalācija palaiž kodu
Problēma ir dziļāka par vienu ievainojamu pakotni. Andrew Nesbitt savā pakotņu pārvaldnieku draudu modeļu apskatā raksta, ka lielākais dizaina lēmums katrā pārvaldniekā ir tas, vai instalācijas laikā drīkst izpildīties kods. npm palaiž postinstall āķus, pip izpilda setup.py, Cargo kompilē un palaiž build.rs, gem būvē natīvos paplašinājumus. Katrs no šiem mehānismiem ir domāts likumīgam mērķim, piemēram, C koda kompilēšanai, bet katrs arī ļauj svešam kodam izpildīties brīdī, kad tu tikai gribēji lejupielādēt bibliotēku.
Go un Deno izvēlējās pretējo ceļu.
Tie atbildēja “nekas neizpildās” un uz šī ierobežojuma uzbūvēja pārējo dizainu.
Nesbitt secina, ka neviens no izplatītajiem pārvaldniekiem ar iebūvētu mehānismu nebloķē ievainojamas instalācijas — drošība balstās uz vēlāku atklāšanu un uzturētāja modrību. refuse mēģina aizpildīt tieši šo robu: pārbaude notiek pirms instalācijas, kamēr āķi vēl nav palaisti.
Skaitļi aiz problēmas
Cik liela ir slodze, rāda Sonatype 2026. gada otrā ceturkšņa ziņojums par ļaunprātīgām atvērtā koda pakotnēm. Līdz ceturkšņa beigām uzņēmums kopumā bija fiksējis 1,8 miljonus ļaunprātīgu pakotņu. npm veidoja 96,6% no visiem ceturkšņa gadījumiem. Ārpus npm slodze koncentrējās PyPI (48,5% no pārējiem gadījumiem) un NuGet (38,0%), aiz tiem Hugging Face modeļi ar 6,8% un RubyGems ar 3,0%.
Ziņojums izceļ vairākas kampaņas. Shai-Hulud Miasma jūnija sākumā skāra simtiem npm pakotņu un instalācijas laikā izpildījās caur binding.gyp failiem. CanisterSprawl pats izplatījās tālāk, zogot akreditācijas datus, lai publicētu jaunas kompromitētas pakotnes. Vēl viena kampaņa izmantoja atkarību sajaukšanu (dependency confusion) 176 npm pakotnēs ar mākslīgi augstiem versiju numuriem. Sonatype šo modeli sauc par gadījumu, kad uzticamie ceļi kļūst par uzbrukuma ceļiem. Uzbrucēji arvien biežāk pārņem uzturētāju kontus un atkarību saites. Atsevišķu ļaunu pakotņu iemešana reģistrā vairs nav galvenā metode.
Ko refuse neatrisina
refuse pārbauda pakotnes pret zināmu ievainojamību sarakstu. Tas nozīmē, ka rīks bloķē to, kas jau ir kāda datubāzē. Nulles dienas pakotne un tikko publicēta ļaunprātīga versija tur vēl nav — tieši tāda bija Shai-Hulud vilnis, kas izplatījās ātrāk, nekā to paspēja kataloģizēt. Pret svaigu uzbrukumu refuse pirmajās stundās nepalīdz.
Tāpēc rīks der pret zināmu slikto. Praktiskais ieguvums ir šaurs un konkrēts: refuse neļauj aģentam vai CI klusi uzstādīt pakotni, par kuras ievainojamību visi jau zina. Ņemot vērā, ka aģenti versijas piespraudē no vecas atmiņas, tieši šī kļūda notiek biežāk nekā uzbrukums ar tikko publicētu pakotni.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.