Python pakotņu reģistrs PyPI 8. jūlijā ieslēdza pārbaudi, kas noraida jebkuru failu, ko kāds mēģina pievienot laidienam, kas publicēts vairāk nekā 14 dienas iepriekš. Izmaiņu 22. jūlijā aprakstīja Python Software Foundation drošības izstrādātājs Sets Lārsons, kurš uzrakstīja arī pašu kodu.
Praktiskā puse ir vienkārša. Ja projekts 1. jūlijā publicēja versiju 2.4.0 ar avota arhīvu un četriem wheel failiem, tad 20. jūlijā piektais wheel tajā pašā versijā vairs neaizies cauri. Vienīgais ceļš uz priekšu ir jauna versija.
Ko maina kods
Labojums ir pull request #19727 reģistra pirmkodā Warehouse. Tas ievieš konstanti MAXIMUM_AGE_FOR_NEW_UPLOADS_DAYS ar vērtību 14 un otru to pašu robežu sekundēs, lai logu vēlāk varētu mainīt vienā vietā. Katru noraidīto augšupielādi reģistrs uzskaita ar atzīmi reason:closed-release, tāpēc PyPI komanda redzēs, cik bieži kāds tajā ieskrien. Kods apvienots 8. jūlijā, divas nedēļas pirms publiskā paziņojuma.
Formālas definīcijas stāvoklim „šis laidiens vairs nepieņem failus” pagaidām nav. Nav arī API, kur rīks varētu pajautāt, vai konkrētā versija ir slēgta. Lārsons brīdina, ka uz jauno uzvedību vēl nevajag balstīties. Semantiku noteiks pēc tam, kad PEP 694 standartizēs augšupielādes API otro versiju un tā sauktos staged previews.
Pārējās darbības ar laidieniem paliek, kā bija. Failu var atsaukt ar yank karogu. Projekta īpašnieks joprojām var laidienu vai atsevišķu failu dzēst. Ierobežojums attiecas tikai uz jaunu failu pievienošanu.
Kāpēc vecs laidiens ir ērts mērķis
Ideja apspriesta kopš 2024. gada janvāra, kad tapa PEP 740 par digitālajiem apliecinājumiem. Sarunu atsāka šā gada martā pēc diviem uzbrukumiem PyPI pakotnēm.
Nozagta publicēšanas atslēga vai pārņemta GitHub Actions plūsma uzbrucējam līdz šim deva divas iespējas. Skaļā ir publicēt jaunu versiju ar ļaunkodu; to parasti pamana dažu stundu laikā, jo lejupielāžu skaits aug un kāds ieskatās izmaiņās. Klusā bija pielikt vienu wheel failu vecai stabilai versijai, kurai vairs neviens neseko. Instalētājs failu izvēlas pēc platformas, bet versijas numurs lock failā paliek tas pats. Par šo otro variantu Lārsons raksta:
Cik zināms, to vēl neviens nav izmantojis, taču vienīgais tehniskais iemesls ir tas, ka uzbrucēji nezināja par šādu iespēju.
Marta uzbrukumi
Grupa TeamPCP martā pārrakstīja Git tagus Aqua Security repozitorijā trivy-action tā, lai tie norādītu uz ļaunu laidienu v0.69.4 ar akreditācijas datu zagli. Trivy skaneris strādāja LiteLLM CI plūsmā. No turienes uzbrucēji ieguva projekta PyPI akreditācijas datus. 24. martā reģistrā parādījās LiteLLM versijas 1.82.7 un 1.82.8 ar trīspakāpju kravu: akreditācijas datu vākšana, pārvietošanās pa Kubernetes klasteri un noturīgas aizmugures durvis. Līdz karantīnai pagāja 2 stundas 32 minūtes. Tajā laikā ļaunās versijas lejupielādēja vairāk nekā 119 000 reižu, jo aptuveni puse LiteLLM instalāciju paņem jaunāko pieejamo versiju. 27. martā tas pats atkārtojās ar pakotni telnyx, versijām 4.87.1 un 4.87.2. Kampaņu atsevišķi izsekoja Datadog Security Labs un Akamai pētnieki.
Jaunais ierobežojums šos divus gadījumus nebūtu apturējis, jo uzbrucēji publicēja jaunas versijas. Tas aizver klusāko ceļu, kas ar tām pašām nozagtajām atslēgām būtu palicis nepamanīts krietni ilgāk.
Aprīļa incidenta atskaitē PyPI komanda uzturētājiem deva trīs ieteikumus. Pirmais ir piesiet GitHub Actions darbības pie commit SHA, nevis pie taga, jo tagu var pārrakstīt tāpat kā trivy-action gadījumā. Otrais ir pāriet uz trusted publishing, kas izsniedz īslaicīgus žetonus un noņem vajadzību glabāt ilgtermiņa API atslēgu CI vidē. Trešais ir divu faktoru autentifikācija ar aparatūras atslēgu visos kontos, kas piedalās laidiena tapšanā.
Kam tas sagādā papildu darbu
Cieš viens konkrēts paradums: pēc jaunas Python versijas iznākšanas pielikt saderīgu wheel failu pie sen publicētas pakotnes versijas. Lārsons pārbaudīja 15 000 populārāko pakotņu un saskaitīja, ka cp314 wheel failu vairāk nekā 14 dienas pēc laidiena bija pievienojuši 56 projekti. Tas ir 0,37 %.
PyCon US 2026 iesaiņošanas sanāksmē klātesošie vienojās, ka prasīt versijas numura paaugstināšanu ir pieņemami. LWN komentāros vērtējums ir skarbāks. Viens lasītājs raksta, ka rudenī pēc Python 3.15 iznākšanas lietotāji atklās, ka viņu lock faili nestrādā. Uzturētājiem tas nozīmē papildu darbu.
Komandām, kas būvē wheel failus daudzām platformām, no šī brīža visi faili jāpaspēj publicēt divu nedēļu logā. Aizķēries ARM būvējums vai gara rinda pie macOS runneriem tagad nozīmē jaunu patch versiju.
PR apspriedē neviens neminēja izņēmumus kādām projektu grupām. Viens recenzents ieteica papildus pierakstīt noraidītos mēģinājumus projekta notikumu žurnālā, lai uzturētājs redzētu, ka kāds ar viņa akreditācijas datiem mēģināja papildināt gadu vecu laidienu. To atlika kā atsevišķu uzlabojumu.
Avoti
- PyPI Blog: Releases now reject new files after 14 days
- pypi/warehouse PR #19727: Restrict publishing new artifacts to releases after 14 days
- LWN.net: PyPI now rejects new files after 14 days
- PyPI Blog: Incident report on the LiteLLM/Telnyx supply-chain attacks
- Help Net Security: PyPI hardens package security with new upload restrictions
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.