drošība · 6 min · 24.07.2026

python.org laidienu API divpadsmit gadus ļāva viltot admina pieprasījumu ar jebkuru atslēgu

Ikviens, kas python.org laidienu pārvaldības API pieprasījumam pievienoja administratora lietotājvārdu un jebkuru izdomātu atslēgu, saņēma pilnas admina tiesības. Autentifikācijas apiešana kodā pastāvēja kopš 2014. gada. Python Software Foundation to izlaboja nepilnā diennaktī pēc ziņojuma un pilnu izklāstu publiskoja 23. jūnijā.

python.org lejupielādes lapu darbina atklātā koda Django lietotne pythondotorg. Tās laidienu pārvaldības API glabā katras Python versijas metadatus: versijas numuru, izlaišanas datumu un saites uz instalācijas failiem katrai platformai. Šo API lieto PSF komanda, kad publicē jaunu Python laidienu. Tieši tur bija autentifikācijas caurums, ko DEVCORE nosauc par mācību grāmatas piemēru.

DEVCORE ir Taivānas ofensīvās drošības komanda. Tā agrāk atrada Microsoft Exchange caurumu ProxyLogon un regulāri uzvar Pwn2Own sacensībās. Šoreiz Splitline Ng caurumam netērēja izsmalcinātus rīkus. Pietika ar vienu parastu HTTP pieprasījumu, kurā lauks ar lietotājvārdu norāda administratoru.

Ievainojamību 23. februārī atrada DEVCORE pētnieks Splitline Ng. Viņš to nodeva Python drošības reaģēšanas komandai (PSRT), kas kļūdu apstiprināja tajā pašā dienā. Nākamajā dienā labotā versija jau darbojās produkcijā. 24. februārī pats ziņotājs pārbaudīja, ka viņa demonstrācijas kods vairs nestrādā.

Kā darbojās apiešana

API atšķīra divus piekļuves veidus: anonīmu viesa pieprasījumu un pieprasījumu ar derīgu API atslēgu. Autentifikācijas loģikā šie divi ceļi pārklājās. Uzbrucējam pietika norādīt esoša administratora lietotājvārdu un pievienot tam patvaļīgu atslēgu. Serveris pieprasījumu apstrādāja tā, it kā to būtu sūtījis īsts administrators ar derīgu atslēgu. Nekāda paroles vai otrā faktora pārbaude te nenostrādāja. Kļūda radās 2014. gadā, kad API pievienoja atslēgu autentifikāciju. Kopš tā laika kods šos divus ceļus nekad nebija pareizi nošķīris.

«Pievienojot admina lietotājvārdu ar patvaļīgu API atslēgu, pieprasījums tika apstrādāts ar administratora tiesībām,» raksta Python Software Foundation.

Ko uzbrucējs varēja mainīt

Ar admina tiesībām varēja rediģēt Python laidienu un failu metadatus lapā python.org/downloads. Starp tiem ir lejupielādes saites un pārbaudes materiālu saites uz Sigstore parakstiem un PGP atslēgām. Pašus laidienu binārfailus API pārrakstīt neļāva. Uzbrukuma vērtība slēpās saitēs: lietotāju varēja novirzīt uz ļaunu failu vai uz viltotu parakstu, ko lapa pasniedza kā īstu.

Paraksts pasargā tikai tad, ja lietotājs to salīdzina pret PSF publicēto atslēgu. Ja uzbrucējs nomaina arī saiti uz atslēgu, pārbaude apstiprina viltojumu.

Kāpēc tas apdraud piegādes ķēdi

Python no python.org lejupielādē miljoniem izstrādātāju. Pa ķēdi tālāk to izmanto Linux distributīvi, Docker attēli un CI sistēmas. Ja kāds nomaina URL, uz ko norāda oficiālā lapa, upuris lejupielādē failu no uzbrucēja servera. Pēc tam viņš to pārbauda pret parakstu, ko arī izvēlējies uzbrucējs. Ķēde, kurai izstrādātāji uzticas, izskatītos vesela.

Kļūda skāra tikai python.org lejupielādes lapas metadatus. PyPI pakotņu reģistrs ir atsevišķa sistēma. To šis caurums neietekmēja. Riskā bija galvenokārt CPython instalatori Windows un macOS lietotājiem, kuri failu ņem tieši no python.org. Linux lietotāji Python parasti dabū caur distributīva pakešu pārvaldnieku, tāpēc viņus tas apdraudēja mazāk.

Kā PSF to laboja

Drošības izstrādātājs Seth Larson kopā ar Hugo van Kemenade un Jacob Coffee sagatavoja labojumu un izvietoja to 24 stundu laikā. Pirmais labojums sakārtoja autentifikācijas loģiku starp viesa un atslēgas režīmu. Otrs labojums lika datubāzei un API noraidīt katru URL, kas nesākas ar https://www.python.org/. Žurnālu glabāšanu komanda pagarināja no trim uz 30 dienām, lai turpmāk incidentus varētu izmeklēt dziļāk.

Vēlāk drošības firma Trail of Bits labojumu pastiprināja ar vēl stingrāku URL pārbaudi. Šo auditu finansēja OpenAI. Trail of Bits citas autentifikācijas problēmas neatrada.

Larsona amats PSF ir ārēji finansēts drošības izstrādātāja postenis. To izveidoja, lai kāds pilnu darba laiku rūpētos par Python infrastruktūras drošību. Šis gadījums parāda, kāpēc tāds cilvēks vajadzīgs: caurums bija sagatavots vēl 2014. gadā, kad neviens par python.org drošību neatbildēja pastāvīgi.

Kāpēc detaļas parādījās tikai jūnijā

Kļūdu izlaboja februārī, taču PSF ar publiskošanu gaidīja līdz 23. jūnijam. Pa vidu komanda veica izmeklēšanu. PSRT pārmeklēja žurnālus un datubāzes dublējumus. Tā neatrada pierādījumus, ka ievainojamību kāds būtu izmantojis.

Komanda pārbaudīja arī visu laidienu parakstus no Python 2.5 līdz 3.13 ar Sigstore un PGP. Python 3.14 un jaunāki izmanto tikai Sigstore, kas failus paraksta caur īslaicīgiem sertifikātiem un publisku žurnālu. Neviens artefakts neuzrādīja izmaiņas. Kļūda kodā bija dzīvojusi 12 gadus. Šajā laikā to nebija pamanījis neviens.

Lietotājam pašam šādu viltojumu pamanīt grūti. Hešsummas un paraksti palīdz tikai tad, ja tos ņem no neatkarīga avota, nevis no tās pašas lapas, kas varētu būt mainīta. Sigstore publiskais žurnāls te noder: paraksts nonāk atklātā reģistrā, ko uzbrucējs nevar klusi pārrakstīt. Tieši uz šo modeli Python pēdējos gados pārceļ visu parakstīšanu.

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