Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Bezpečnost

Python zabudoval do modulu ssl seznam osmi zakázaných klíčů certifikačních autorit

Standardní knihovna Pythonu dostala tabulku osmi otisků veřejných klíčů, které modul ssl odmítne bez ohledu na nastavení programu i na to, čemu věří operační systém. Jsou to klíče mezilehlých autorit eMudhra, které se daly spočítat z certifikátu. Oprava má číslo CVE-2026-115557 a vyšla v pěti větvích naráz.

· 19 zhlédnutí

Makro snímek obrazovky se zeleným zámkem a slovem https v adresním řádku prohlížeče
Zelený zámek vedle adresy znamená, že klient ověřil řetěz certifikátů serveru. Ilustrační fotografie. Foto: Yuri Samoilov, Wikimedia Commons (CC BY 2.0)

Standardní knihovna Pythonu má od 25. října vlastní seznam zakázaných klíčů. Modul ssl, přes který v Pythonu prochází každé spojení HTTPS, odmítne řetěz certifikátů, ve kterém je některý z osmi veřejných klíčů indické autority eMudhra. Nezáleží přitom na tom, jak si program ověřování nastavil, ani na tom, jestli operační systém té autoritě pořád věří. Oprava nese číslo CVE-2026-115557.

Důvod je starý necelé dva týdny. Soukromé klíče osmi mezilehlých certifikátů eMudhra byly tak malá čísla, že je šlo dopočítat z veřejného certifikátu, a kdokoli s nimi mohl vystavit platně vypadající certifikát pro libovolnou doménu. Prohlížeče a kořenové programy Microsoftu i Applu je podle stránky k incidentu zablokovaly mezi 17. a 22. říjnem. Programy mimo prohlížeč na to ale tak rychle nedosáhnou: řada z nich si nese vlastní sadu kořenových certifikátů a odvolací seznamy nečte vůbec.

Porovnává se klíč, ne otisk certifikátu

Tabulka osmi otisků leží v souboru Modules/_ssl/distrusted_spki.h. Každý z nich je otisk SHA-256 pole SubjectPublicKeyInfo, tedy té části certifikátu, která nese veřejný klíč a označení jeho typu. Porovnává se klíč, ne celý certifikát, takže seznam zabere i na cizí certifikáty, které tentýž klíč znovu použily. Šest zablokovaných klíčů patří autoritám pro certifikáty webů, dva pro podepisování kódu.

Samotná kontrola visí na funkci, kterou CPython nově předává OpenSSL jako callback při ověřování řetězu. Projde každý certifikát, spočítá otisk jeho klíče a při shodě nastaví chybu X509_V_ERR_CERT_REJECTED, takže ověření skončí neúspěchem. Když OpenSSL u téhož certifikátu ohlásilo chybu už dřív, callback ji nepřepisuje a nechá původní hlášku projít.

Nová kontrola běží jen tam, kde program certifikáty opravdu ověřuje, tedy v režimech CERT_OPTIONAL a CERT_REQUIRED. Kdo má ověřování vypnuté na CERT_NONE, nedostane proti dřívějšku nic. Totéž platí o spojeních, která si knihovna otevírá přes jiné rozhraní než modul ssl.

Oprava vyšla v pěti větvích naráz

Návrh podal přispěvatel 21. října jako hlášení gh-160040, změna se do hlavní větve dostala 24. října ráno a do větví 3.11 až 3.15 ještě týž den. Vydání s ní vyšla 25. října:

větevposlední vydání bez seznamuprvní vydání se seznamem
3.153.15.1 (21. října)3.15.2
3.143.14.9 (21. října)3.14.10
3.133.13.17 (21. října)3.13.18
3.123.12.15 (30. září)3.12.16
3.113.11.17 (21. října)3.11.18

Do větve 3.10 oprava nešla, soubor se seznamem v ní není. Poslední vydání téhle řady, 3.10.22, je z 1. října a seznam zakázaných klíčů neobsahuje. Kdo na ní zůstává, musí spoléhat na úložiště certifikátů systému nebo na aktualizaci balíčku, který mu kořeny dodává.

Go šlo stejnou cestou o čtyři dny dřív

Python nebyl první. Autor návrhu se v hlášení odvolává na změnu v knihovně crypto/x509 jazyka Go, kterou tamní tým vyřídil 19. a 20. října jako naléhavou a označil ji CVE-2026-111943. Go řetězy s dotčenými mezilehlými certifikáty při ověřování odfiltruje, takže se k volajícímu vůbec nedostanou. Python zvolil jiný postup se stejným výsledkem: ověření selže a program dostane chybu.

Vývojáři to sami popisují jako poslední obranu

Komentář v hlavičce souboru je na poměry standardní knihovny nezvykle opatrný. V překladu říká, že jde o mimořádné opatření a poslední obrannou linii, že odebrat důvěru je především úkolem úložiště certifikátů v systému a že seznam blokuje klíče jen po dobu, než se aktualizace rozšíří do operačních systémů, obrazů kontejnerů a balíčků, které si vlastní kořeny nesou. Práh pro přidání dalšího klíče je podle téhož komentáře velmi vysoký. Stejnou větu nese i poznámka k vydání.

Rozdíl proti běžné opravě je v tom, kdo rozhoduje. Komu program věří, dosud určovalo úložiště certifikátů operačního systému nebo balíček s kořeny, který si projekt sám nainstaloval. Tabulka v hlavičce _ssl je seznam, který se přidal mezi ně a který uživatel neodstraní jinak než překladem vlastního Pythonu. Zároveň je to jediné místo, kde šlo osm kompromitovaných klíčů zastavit během několika dnů i na strojích, kam aktualizace systému dorazí za měsíc.

Oznámení poslal 24. října do konference security-announce Seth Larson, který má v Python Software Foundation na starosti bezpečnost. Text má čtyři řádky a odkazuje na záznam CVE.

Zdroje

Bezpečnost

TLS certifikáty Python

← zpět na výpis