Pět z devíti bezpečnostních oprav v zlibu 1.4 pochází z auditu Trail of Bits
Kompresní knihovna zlib vyšla po necelých devíti měsících ve verzi 1.4. Oddíl bezpečnostních oprav má jedenáct položek a devět z nich se týká samotné knihovny. U pěti stojí identifikátor auditu Trail of Bits, u jedné je jako nálezce uvedený jazykový model. Distribuce zatím rozesílají starší verze.

Kompresní knihovna zlib vyšla ve verzi 1.4. Poznámky k vydání nesou datum 4. listopadu 2026, na GitHubu se vydání objevilo 5. listopadu v 7.17 UTC. Od předchozí verze 1.3.2 uplynulo necelých devět měsíců, mezi 1.3.1 a 1.3.2 to byly dva roky.
Oddíl bezpečnostních oprav má jedenáct položek. Devět se týká samotné knihovny, desátá shrnuje nástroj minizip a jedenáctá patří doplňku infback9. U pěti z těch devíti stojí označení TOB-ZLIB, pod kterým vede své nálezy bezpečnostní firma Trail of Bits.
Co se opravilo přímo v knihovně
Všech devět oprav v jádře knihovny se týká práce s pamětí. Popis je převzatý z poznámek k vydání, stejně jako jména nálezců.
| Funkce | Co se dělo | Nálezce nebo značka |
|---|---|---|
gzwrite() v neblokujícím režimu | přetečení vyrovnávací paměti na haldě | mat-mo, TOB-ZLIB-003 |
inflateGetDictionary() | zápis až 8 MB za 32KB paměť volajícího | THM-ZLIB-001 |
inflateSync() | okno o jediném bajtu, které šlo později přepsat | TOB-ZLIB-004 |
inflatePrime() | čtení před začátkem vstupu | TOB-ZLIB-014 |
deflatePrime() opakovaně | zápis za pending buffer | TOB-ZLIB-013 |
inflateBack() | nepoznal příliš vzdálený odkaz a poslal na výstup neinicializovanou paměť | Kornel Lesiński |
gzseek() dopředu před zápisem dat | neinicializovaná paměť ve výstupním gzipu | Claude Opus 5.5 |
deflateResetKeep() uprostřed proudu | čtení mimo okno | Jason Gross |
gzdopen() | nenastavil close-on-exec správným příznakem | TOB-ZLIB-008 |
Nejdál sahá druhý řádek. Podle poznámek stačil hlavičkový údaj s neplatnou velikostí okna a knihovna pak uměla zapsat až osm megabajtů za vyrovnávací paměť, kterou jí volající podstrčil. Týká se to verze 1.3.1 i 1.3.2, tedy obou vydání, která dnes rozesílají distribuce.
Jedna chyba má číslo CVE od září
Přetečení v gzwrite() vede registr CVE pod číslem CVE-2026-85091. Záznam zveřejnila 3. září 2026 firma VulnCheck a popisuje ho jako přetečení haldy ve funkci gz_vacate() při neblokujícím zápisu; dotčené jsou verze od vývojové 1.3.1.2 po 1.3.2. VulnCheck mu dala podle metodiky CVSS 4.0 známku 8,3 z deseti. Americká databáze NVD u něj k 6. listopadu 2026 pořád uvádí stav Awaiting Analysis a vlastní známku nepřidělila. Podpora neblokujících zařízení u funkcí gz* přibyla v únoru 2026 právě s verzí 1.3.2; opravená verze vyšla o dva měsíce později než záznam v registru.
Odkud se nálezy vzaly
Firma Trail of Bits popsala 2. července 2026 v zápisu ze společné akce s OpenAI, jak si za jediný den postavila na zlib fuzzovací kampaň. Model GPT-5.5-Cyber podle ní sám usoudil, že číst zdrojový kód tak prověřené knihovny je ztráta času, a místo toho napsal testovací obálky pro zhruba tucet vstupních bodů, k tomu překlady se sanitizéry a varianty, které zpřístupní kód skrytý ve výchozím sestavení. Zápis tehdy končil tím, že nálezy procházejí koordinovaným zveřejněním a celá sada se zveřejní, až vyjde opravené vydání.
Nejúspěšnější obálka podle téhož zápisu hledala chyby ve stavech funkcí gz*, do kterých se knihovna dostane jen tehdy, když operační systém zápis přibrzdí. To je přesně situace z prvního řádku tabulky, kterou poznámky zlibu vedou i pod značkou TOB-ZLIB-003.
U opravy v gzseek() uvádějí poznámky jako nálezce rovnou jazykový model. Značku THM-ZLIB-001 u chyby v inflateGetDictionary() vede firma Theorem. Zbylé dvě opravy v knihovně nahlásili lidé pod vlastním jménem. Že se takový kód prověřuje i jinde, ukázala letos v srpnu knihovna zlib-rs, která opravila use-after-free ve vlastním kódu, přestože vznikla kvůli bezpečnosti.
O závažnosti poslední položky se prameny neshodnou
Poslední bod se týká doplňku contrib/infback9 a nese číslo CVE-2026-4738. Ten záznam vydal 24. března 2026 singapurský GovTech CSG a nevede ho proti zlibu, ale proti knihovně GDAL, která si kopii infback9 nese s sebou; známku má 9,4 z deseti, tedy kritickou. Poznámky zlibu s tím nesouhlasí a píšou, že kritické hodnocení je přehnané: ukazatele se vrátí do mezí dřív, než se použijí, a žádný známý překladač s nimi nenaloží jinak. Pád by to podle nich způsobilo na hardwaru, který meze ukazatelů hlídá sám, jako je CHERI.
Vydání má i vlastní oddíl známých problémů. Obálka contrib/iostream2 si při čtení řetězce bere délku přímo z komprimovaných dat a nekontroluje ji, takže na cizí soubory se podle poznámek používat nemá; náhradou je iostream3.
K uživatelům to teprve musí dojít
Arch Linux měl 6. listopadu v hlavním repozitáři balíček zlib ve verzi 1.3.2-4, sestavený 12. října. Za zastaralý ho někdo označil 5. listopadu v 9.03 UTC, tedy necelé dvě hodiny po vydání. Stabilní Debian (trixie) rozesílá 1.3.1, vývojová větev 1.3.2 a předchozí stabilní vydání bookworm pořád 1.2.13.
Fedora balíček se jménem zlib nemá vůbec; nahradila ho odnoží zlib-ng, která se tváří jako zlib a jmenuje se zlib-ng-compat. Vývojová větev Fedory má 2.3.3, Fedora 43 starší 2.2.5. Na GitHubu projektu zlib-ng se 5. listopadu večer objevilo hlášení, podle kterého dvě opravy z nové verze zlibu ve 2.3.3 nejsou a leží zatím jen ve vývojové větvi. Jedna z nich je ten příliš vzdálený odkaz v inflateBack().
Vedle bezpečnostních oprav mění 1.4 i věci, které si vyžádají zásah u toho, kdo knihovnu překládá sám. Nejnižší podporovaná verze CMake je 3.15 místo 3.12, na MSVC se knihovny jmenují libz místo z a typ z_off_t je zase long jako v 1.3.1, takže aplikace přeložené s hlavičkami z 1.3.2 je potřeba přeložit znovu.
Zdroje
- zlib 1.4 Release Notes, repozitář madler/zlib
- zlib Home Site, Mark Adler
- CVE-2026-85091, registr CVE (zadavatel VulnCheck)
- CVE-2026-85091, National Vulnerability Database
- CVE-2026-4738, registr CVE (zadavatel GovTech CSG)
- GPT-5.5-Cyber built a zlib fuzzing lab in a day, blog Trail of Bits
- Balíček zlib, Arch Linux
- Zdrojový balíček zlib, Debian Sources
- Balíček zlib-ng-compat, Fedora
- inflateBack still accepts a too-far distance, evidence chyb zlib-ng