Rustls dva roky přijímal nešifrované zprávy uprostřed navazování spojení TLS 1.3
Knihovna rustls od verze 0.23.13 propouštěla zprávy handshaku TLS 1.3, které měly dorazit zašifrované a dorazily v otevřeném textu. Opravu přineslo vydání 0.23.45 ze 14. září 2026 a funkčně tutéž chybu mělo do letošního ledna i Go.
Knihovna rustls, kterou programy psané v Rustu používají k šifrovanému spojení, vydala 14. září 2026 verzi 0.23.45. Opravuje v ní chybu, kvůli které dva roky přijímala zprávy handshaku TLS 1.3 poslané v otevřeném textu tam, kde měly být zašifrované. Hlášení je vedené jako GHSA-2mjx-qc3c-rqvc.

Zpráva, která měla být zašifrovaná
Spojení TLS 1.3 začíná nešifrovaně. Klient pošle ClientHello, server odpoví ServerHello a teprve z údajů v těchhle dvou zprávách si obě strany spočítají klíče pro zbytek handshaku. Všechno další, počínaje zprávou EncryptedExtensions, už jde přes šifru.
Rustls ale EncryptedExtensions vzal, i když přišly v otevřeném textu. Stačilo je nacpat do téhož záznamu TLS jako ServerHello. Knihovna nejdřív zpracovala ServerHello, nasadila klíče handshaku a pak si z vyrovnávací paměti vytáhla zprávu, která tam od začátku ležela nezašifrovaná. Podle hlášení může takhle útočník na trase podstrčit zprávy, které spojení přijme.
RFC 8446 to zakazuje jednou větou
Norma TLS 1.3 na tenhle případ myslí výslovně. RFC 8446 v oddílu 5.1 říká:
Zprávy handshaku nesmějí přesahovat přes změnu klíčů. Implementace musí ověřit, že všechny zprávy bezprostředně předcházející změně klíčů končí na hranici záznamu; pokud ne, musí spojení ukončit výstrahou
unexpected_message.
Překlad je náš, originál normy je anglicky. Právě tahle kontrola v rustlsu chyběla, takže se spojení místo ukončení klidně dopočítalo dál.
Oprava má deset řádků, test dvě stě padesát šest
Zarovnání hlídala metoda HandshakeDeframer::is_aligned(). Za zarovnané považovala spojení tehdy, když ve vyrovnávací paměti nezůstal nedokončený úlomek zprávy. To je málo: celá, dokončená zpráva, která čeká na zpracování, je přesně ten případ, o který tu jde, a kontrolou prošla.
V pull requestu 3265, sloučeném 14. září, hlásí metoda zarovnání jen tehdy, když v paměti nečeká žádná zpráva handshaku, celá ani rozdělaná. Druhá půlka opravy je v souboru conn.rs, kde se stav zarovnání nově přečte i po každé vyzvednuté zprávě, ne jen před ní. V těch dvou souborech je to dohromady deset přidaných a sedm odebraných řádků. Do souboru s testy k tomu přibylo 256 řádků a nový případ přeskládá první dávku zpráv od serveru přesně tak, jak to popisuje hlášení.
Nálezce hledal přesně tohle
Chybu nahlásil Jack Lloyd, na GitHubu randombit. V hlášení píše, že ji našla rozestavěná testovací sada pro TLS a DTLS a že konkrétní testovací případ vznikl podle chyby v Go. Botan, OpenSSL, BoringSSL, Go i wolfSSL ten průběh podle téhož hlášení odmítnou.
U Go to ale platí teprve od letošního ledna. Balík crypto/tls měl funkčně touž chybu, vedenou jako GO-2026-4340 a CVE-2025-61730. Záznam vyšel 28. ledna 2026 a opravu nesou verze 1.24.12 a 1.25.6. Go ji popisuje slovy, že se při handshaku TLS 1.3 můžou následující zprávy zpracovat dřív, než se změní úroveň šifrování, a že z toho plyne drobný únik informace.
Michael Larabel na Phoronixu k vydání napsal, že OpenSSL, BoringSSL a další zasažené nejsou. Sedí to, ale Go je na seznamu implementací, které průběh odmítnou, právě proto, že tutéž chybu opravilo o víc než sedm měsíců dřív.
Paměťová bezpečnost sem nedosáhne
Rustls je knihovna TLS psaná v Rustu, tedy v jazyce, jehož hlavním lákadlem je paměťová bezpečnost. Tenhle přehmat ale o paměť vůbec nejde. Je to vynechaná kontrola ve stavovém automatu protokolu a na tu nemá jazyk vliv. Nakonec to dokládá i Go, které je na paměť stejně opatrné a spletlo se v tomtéž místě.
Dopad je malý. Rustový bezpečnostní rejstřík vede záznam jako RUSTSEC-2026-0285 se známkou CVSS 3.1 ve výši 5,3, tedy střední. Vektor se dotýká jen důvěrnosti, a to nízkou měrou. Přepis handshaku zůstává ověřený, takže útočník na trase nemůže spojení změnit ani dokončit. Vlastní číslo CVE k chybě nikdo nepřidělil. Zasažené jsou verze 0.23.13 z 10. září 2024 až 0.23.44 včetně.
Kolik systémů se toho týká, přesně říct nejde. Crates.io u rustlsu napočítal od srpna 2016 přes 918 milionů stažení, jenže do toho čísla se počítají i sestavovací stroje, takže neříká, na kolika serverech knihovna běží. Sada, ze které nález vzešel, je podle hlášení pořád rozestavěná.
Zdroje: poznámky k vydání rustls 0.23.45 a hlášení GHSA-2mjx-qc3c-rqvc, obojí ze 14. září 2026, pull request 3265, RFC 8446, záznam RUSTSEC-2026-0285, záznam GO-2026-4340 z 28. ledna 2026 a Phoronix ze 14. září 2026.