Next.js vypnul optimalizaci obrázků AVIF kvůli přetečení paměti v knihovně libheif
Rámec Next.js vydal 25. srpna 2026 opravné verze 16.3.3 a 15.5.24. Zavírají dvě chyby označené jako kritické a obě dovolují spustit na serveru cizí kód bez přihlášení. Tu první nemá na svědomí sám rámec, ale knihovna libheif, ke které se dostane přes balík sharp; než oprava projde celým řetězcem, přestal Next.js zpracovávat vstupní obrázky AVIF.

Bezpečnostní vydání ohlašuje Next.js dopředu. 20. srpna napsal, že 26. srpna vyjdou verze 16.3.3 a 15.5.24 a zavřou jednu kritickou chybu. O pět dní později přišla oprava toho oznámení: chyby jsou dvě, ta druhá se našla v cizí knihovně a vydání se posouvá o den dopředu, aby provozovatelé aktualizovali jen jednou. Balíčky se objevily 25. srpna odpoledne.
Přetečení haldy sedí v libheif
Zranitelnost vedená jako GHSA-2xp9-vwfh-vxw4 není v kódu rámce. Next.js zmenšuje obrázky balíkem sharp, ten uvnitř používá libvips a ta pro formáty rodiny HEIF sahá po knihovně libheif. Díra je až na konci téhle řady.
Autor libheif ji popsal v samostatném hlášení GHSA-g89c-p67h-r497 a ohodnotil ji 9,8 bodu z deseti. Skládá se ze čtyř kroků, z nichž ani jeden není sám o sobě chybný. Soubor HEIC, HEIF nebo AVIF smí obsahovat položku typu iden, tedy odkaz „tenhle obrázek je totožný s jiným“, a k ní vlastní alfa kanál. Dekodér pak drží v jednom obrázku dvě alfa roviny: osmibitovou z odkazovaného snímku a desetibitovou z položky iden. Funkce, která rovinu hledá podle kanálu, vrátí jen tu první, takže se paměť pro výsledek odměří podle osmi bitů na vzorek. Zvětšovací smyčka ale projde obě roviny a u té desetibitové zapisuje dva bajty tam, kde je místo na jeden.
U snímku 128 × 128 bodů to dělá 16 384 bajtů zapsaných za koncem přiděleného místa. Co se tam zapíše, řídí obsah souboru, takže útočník má nad koncem té paměti kontrolu. Hlášení k tomu přikládá celý generátor zkušebního souboru.
Číslo CVE k té chybě zatím nikdo nepřidělil. Opravená je verze libheif 1.23.2, vydaná rovněž 25. srpna; předchozí 1.23.1 byla venku od 26. června. Ve stejném vydání je i druhá kritická chyba se značkou GHSA-2jg2-4ch7-h545 a u ní poznámky k vydání píšou rovnou, že funkční exploit se spuštěním kódu se potvrdil.
Vypíná se čtení, ne zápis
Optimalizátor v Next.js si drží seznam povolených čtecích operací libvips: nejdřív zablokuje celou skupinu VipsForeignLoad a pak jmenovitě odblokuje JPEG, PNG, GIF, WebP a několik dalších. Oprava z toho seznamu vyškrtla jedinou položku, VipsForeignLoadHeif. K tomu přibyla podmínka, že požadavek na obrázek ve formátu AVIF projde optimalizátorem beze změny, jako by šlo o typ, kterému nerozumí.
Provozovatel to pozná na třech místech. Zdrojové obrázky AVIF se přestaly zmenšovat a jdou ke čtenáři v původním rozlišení. Statické importy souborů AVIF nedostanou rozmazaný náhled, protože ten se počítá z dekódovaného obrázku. A prohlížeč, který AVIF neumí, dostane AVIF: v testech rámce zastupuje tuhle skupinu starší Safari a dřív mu optimalizátor posílal obrázek převedený do JPEG.
Výstupu se zákaz netýká. Kdo má zdroje v JPEG a nechává si je převádět do AVIF, o nic nepřišel; zablokované je čtení formátu, ne zápis do něj.
Pro toho, kdo se bez optimalizace vstupních souborů AVIF neobejde, přibyl v nastavení přepínač experimental.imgOptDangerouslyAllowAVIF. Jeho popis přímo ve zdrojovém kódu říká, že zapnutím se aplikace vystavuje bezpečnostnímu riziku v nativních dekodérech obrázků.
Druhá chyba míří na Windows
Zranitelnost CVE-2026-75604 dostala 9,0 bodu a týká se aplikací, které vedle sebe používají Pages Router i App Router a nemají zapnuté Cache Components. Podmínkou je souborový systém Windows pod serverem; Linux ani macOS zasažené nejsou. Hlášení chybu řadí pod CWE-22, tedy k vadnému ošetření cest k souborům, a uvádí, že žádné obejití není známé. Jediná cesta je aktualizovat. Postižené jsou verze od 13.4 a od 16.0, obě řady zavírají 15.5.24 a 16.3.3.
V databázi NVD to číslo 28. srpna ještě žádný záznam nemělo. Popis je zatím jen v hlášení na GitHubu, kde stojí i jména dvou nálezců.
Koho se to týká
Balík next měl v týdnu od 20. do 26. srpna 54 611 955 stažení z registru npm. Není to počet zasažených serverů, jen měřítko, ve kterém se rámec pohybuje.
Rozhoduje způsob provozu. Netlify ještě v den vydání napsalo, že jeho weby zasažené nejsou. Požadavky na cestu /_next/image přepisuje už na okraji své sítě do vlastní služby na obrázky, takže se optimalizátor Next.js vůbec nespustí, a chyba kolem Windows na něj nesedí, protože jeho funkce běží na Linuxu. Aktualizovat přesto doporučuje.
Nejvíc práce zbývá na vlastní provoz, tedy tam, kde si Next.js spouští sharp sám a nikdo mu do cesty k obrázkům nevstupuje.
Řetěz se mezitím uzavřel
Důvod, proč rámec AVIF vypnul, už do velké míry pominul. Opravená libheif 1.23.2 vyšla 25. srpna dopoledne, druhý den ráno se objevila sada knihoven sharp-libvips 1.3.3, která ji obsahuje, a hodinu po ní balík sharp 0.35.4.
Vypnuté AVIF v Next.js přesto platí dál. V poznámkách k vývojovým verzím rámce se do 27. srpna o jeho návratu nepíše a je to pochopitelné: rámec nemá jak zjistit, jakou verzi sharpu má u sebe kdo nainstalovanou. Přepínač se slovem dangerously v názvu tuhle jistotu nechává na provozovateli.
Zdroje: bezpečnostní vydání Next.js z 25. srpna, jeho ohlášení z 20. srpna, hlášení GHSA-2xp9-vwfh-vxw4, GHSA-p293-qw3h-jr36 a GHSA-g89c-p67h-r497, poznámky k vydání libheif 1.23.2, soupis knihoven v sharp-libvips 1.3.3 a stanovisko Netlify.