drošība · 5 min · 20.07.2026

uv 0.11.28 noraida ZIP arhīvus, ko agrāk pieņēma: 15 labojumi pret parsēšanas atšķirībām

Python pakotņu pārvaldnieks uv 7. jūlijā izlaida versiju 0.11.28, un tā ienesa izmaiņu, kas dažiem lietotājiem salauzīs būvējumus: uv tagad noraida ZIP arhīvus ar neviennozīmīgu vai bojātu saturu, ko agrākās versijas atvēra bez ierunām. Aiz šī soļa ir 15 labojumi bibliotēkā astral-async-zip (versija 0.0.20), un tie visi vērsti pret vienu problēmu — parsēšanas atšķirībām jeb parser differentials.

Parsēšanas atšķirība rodas, kad divi rīki vienu un to pašu failu izlasa dažādi. Ar ZIP formātu tas notiek pārsteidzoši viegli, un uzbrucēji to izmanto, lai vienam rīkam parādītu nekaitīgu saturu, bet otram — ļaunkodu.

Kā viens ZIP fails var saturēt divas patiesības

ZIP arhīvs glabā vienu un to pašu failu sarakstu divās vietās. Faila sākumā ir lokālie failu ieraksti (local file headers), pa vienam katram failam, ko var lasīt secīgi no priekšas. Faila beigās ir centrālais katalogs (central directory) — rādītājs ar nobīdēm uz katru failu — un aiz tā End of Central Directory ieraksts, kas norāda, kur katalogs sākas.

No tā izriet divi veidi, kā izlasīt arhīvu. Var straumēt no priekšas un ticēt lokālajiem ierakstiem, vai arī lēkt uz beigām un ticēt centrālajam katalogam. Kad abas kopijas nesakrīt, parsētāji nonāk pie atšķirīgiem rezultātiem. ZIP specifikācija dažus no šiem gadījumiem apraksta neviennozīmīgi, tāpēc katrs rīks izvēlas pats.

uv jau vienreiz uz tā paklupa

Šī nav teorija. 2025. gada augustā Astral publicēja drošības brīdinājumu CVE-2025-54368, kas aprakstīja tieši divas šādas atšķirības uv ZIP parsētājā.

Pirmā bija dēvēta par «karājošos failiem». Lokālie failu ieraksti bez atbilstoša ieraksta centrālajā katalogā pēc specifikācijas ir nederīgi, bet straumējošs parsētājs tos vienalga apstrādā. Otrā bija «dubultie ZIP». Specifikācija neviennozīmīgi nosaka, vai nobīdes lauki mērāmi no arhīva sākuma vai no End of Central Directory ieraksta pozīcijas. Python bibliotēka zipfile tos lasa kā relatīvus, bet uv toreiz lasīja kā absolūtus.

Rezultāts abos gadījumos bija viens. Uzbrucējs varēja uzbūvēt arhīvu, ko uv un pip izpako dažādi — mērķa pārvaldniekam ļaunu saturu, otram nekaitīgu.

«Uzbrucējs var izveidot ZIP failu, kas uv un pip izpakojas atšķirīgi (vai otrādi), dodot ļaunu rezultātu mērķētajam instalatoram un nekaitīgu — otram.»

Brīdinājums skāra visas versijas līdz 0.8.5 ieskaitot; labojums nāca ar 0.8.6. Kopš tā laika uv salīdzina lokālos failu ierakstus ar centrālo katalogu un noraida neatbilstības, kā arī straumēšanas laikā izlasa katalogu un End of Central Directory ierakstu līdz galam, lai aiz tā nepaliktu dati sekundāram arhīvam.

Tā pati dubultā nozīme apmāna antivīrusus

Pakotņu pārvaldnieki nav vienīgie, kas uz šī paklūp. To pašu ZIP neviennozīmību uzbrucēji izmanto, lai ļaunkodu izlaistu garām antivīrusiem. Metode saucas ZIP konkatenācija: vairākus arhīvus vienkārši saliek vienā failā.

Triks strādā, jo izpakotāji atrod dažādus centrālos katalogus. 7-Zip parāda pirmo katalogu, WinRAR — otro. Ļaunkods, kas paslēpts otrajā katalogā, paliek neredzams tam, kurš failu atver ar 7-Zip. Drošības pētnieki šo desinhronizāciju nosauca par «Zombie ZIP» un parādīja, ka tā apiet antivīrusu skenerus lielā mērogā.

Reāls piemērs ir GootLoader kampaņa, ko analītiķi izpētīja 2026. gada janvārī. Tā vienā failā sakonkatenēja no 500 līdz 1000 ZIP arhīvu un ar nolūku noīsināja End of Central Directory ierakstu par diviem baitiem, lai daļa parsētāju vispār atteiktos to lasīt korekti. Kad skeneris paklūp jau uz arhīva formas, tam nekad nesanāk aizdomīgo saturu.

Ko konkrēti maina 0.11.28

Jaunā versija ieved astral-async-zip 0.0.20 ar 15 augšpusē veiktām izmaiņām, kas pastiprina to pašu principu: lokālie ieraksti un centrālais katalogs jāsakrīt, citādi arhīvs tiek noraidīts. Laidiena piezīmes tieši brīdina, ka uv tagad var noraidīt ZIP arhīvus ar bojātu vai neviennozīmīgu saturu, ko iepriekšējās versijas pieņēma.

Praksē tas nozīmē, ka pēc atjaunināšanas kāds instalēšanas solis var pēkšņi apstāties ar kļūdu par nederīgu arhīvu. Ja tas notiek ar leģitīmu pakotni, vaina visdrīzāk ir wheel failā, kuru kāds rīks uzbūvējis, neievērojot formātu stingri. Pareizā reakcija ir salabot vai pārbūvēt to pakotni, nevis atgriezties vecajā uv — vecā uzvedība ir tieši tā, ko atslēdza.

Kam uv ir pieejamā pakotņu pārvaldnieka lomā CI cauruļvados, ir vērts pārbaudīt būvējumus pirms 0.11.28 nonāk produkcijā. Stingrāks parsētājs var atklāt gadu vecu, klusi bojātu artefaktu, ko līdz šim neviens nebija pamanījis.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no drošībasaistītie