Poslední požadavek v dávce dostal ve vLLM odpověď toho prvního
Hlášení CVE-2026-73558 z 8. září popisuje přetečení 32bitového indexu ve výpočetním jádře serveru vLLM. Sejde-li se v jedné dávce dost tokenů, sáhne výpočet pro poslední požadavek na data toho prvního a cizí odpověď skončí v odpovědi útočníka. Opravené vydání je 0.27.0 z 10. srpna; sama oprava leží ve veřejném repozitáři od konce července jako obyčejná oprava chyby.

Server vLLM obsluhuje jazykové modely tak, že požadavky víc uživatelů poskládá do jedné dávky a pustí je grafickou kartou naráz. Hlášení CVE-2026-73558, zveřejněné 8. září 2026, popisuje případ, kdy se ta dávka rozpadne špatným směrem: výpočet pro poslední požadavek začne číst data prvního a jeho odpověď se objeví v cizím výstupu. Známka je 5,3 z deseti, tedy střední závažnost, a týká se to všech verzí před 0.27.0.
Ukazatel do paměti se počítá ve 32 bitech
Chyba sedí v jádře act_and_mul_kernel, které počítá aktivační funkci mezi dvěma vrstvami sítě. Každý blok vláken si nejdřív spočítá, kde v paměti jeho data začínají:
const scalar_t* x_ptr = input + blockIdx.x * 2 * d;
blockIdx.x je pořadí tokenu v dávce, d šířka mezivrstvy modelu. Obě čísla jsou 32bitová, takže se i jejich součin počítá ve 32 bitech. Jakmile přeroste 4 294 967 296, začne se počítat znovu od nuly a ukazatel pak míří na začátek dávky místo na její konec.
Kdy k tomu dojde, se dá dopočítat. Model Llama 3.2 s miliardou parametrů, na kterém autor hlášení chybu předvedl, má d rovno 8 192, takže 2 × d je 16 384. Rozsah se vyčerpá po 262 144 tokenech. Dávka v předvedení měla sedmnáct požadavků po 16 384 tokenech, dohromady 278 528 – přesně o jednu sekvenci víc, než se do rozsahu vejde. Poslední požadavek proto nedostal pomíchaná čísla, ale doslovnou kopii odpovědi toho prvního. Vstupní čísla jsou z hlášení, dělení je náš dopočet.
Ve veřejném tiketu chyba ležela od května
Bezpečnostní hlášení není první veřejná zmínka. Tiket #42860 vznikl už 17. května 2026 a popisoval totéž místo v kódu jako numerickou chybu při dlouhých sekvencích. Doložený byl na jiném modelu: royokong/e5-v má podle tiketu d rovno 14 336, a při 7 890 tokenech v devatenácti požadavcích vyjde 149 910 tokenů proti prahu 149 796. Přebytek 114 tokenů zamíchá výsledky, celou cizí odpověď z něj ale nevydoluje nikdo.
Že jde o víc než o pokažená čísla, napsal do téhož tiketu 5. června další čtenář: jeho tým podle něj předvedl, že se tak dá získat odpověď jiného uživatele ze stejné dávky, a požádal o rychlou opravu. Od té věty do vydání opravy uplynulo osm týdnů a do přidělení čísla CVE víc než tři měsíce.
Oprava je jeden datový typ navíc
Návrh #49660 otevřel 24. července nový přispěvatel a sloučený byl o šest dní později. Pořadí tokenu se v něm ukládá do 64bitové proměnné a teprve ta jde do výpočtu:
const int64_t token_idx = blockIdx.x;
const scalar_t* x_ptr = input + token_idx * 2 * d;
Totéž na třech místech souboru, celkem devět přidaných a šest odebraných řádků. Ven se to dostalo ve vLLM 0.27.0 z 10. srpna 2026, tedy v tomtéž vydání, které přeskočilo dvě verze PyTorche. V poznámkách k tomu vydání stojí ten návrh jedině v seznamu nových přispěvatelů; mezi vypsanými změnami není a jeho vlastní nadpis mluví o přetečení celého čísla, ne o úniku dat.
Veřejná oprava před číslem CVE je záměr
Není to opomenutí. Bezpečnostní politika projektu dělí nálezy do čtyř stupňů a u dvou nižších předepisuje opak embarga: oprava se vyvíjí jako běžný veřejný návrh, protože podle ní veřejná viditelnost urychlí kontrolu i nasazení. Soukromá větev a předběžné upozornění provozovatelů jsou vyhrazené vysoké a kritické závažnosti.
Tentýž dokument ovšem popisuje střední stupeň jako nálezy, které nedovolí spuštění cizího kódu ani významný únik dat – a únik dat mezi uživateli tohle je. Známku srazila obtížnost: podle vektoru CVSS musí útočník trefit dávku, ve které je oběť, a potřebuje, aby v tu chvíli sama něco poslala.
Koho se to týká
Rozhoduje, kolik lidí na jednu instanci chodí. Kde běží model pro jednoho uživatele nebo jednu úlohu, zůstává z chyby početní kaz na dlouhých vstupech. Ve víceuživatelském provozu je to únik textu, který nikdo nemusí poznat, protože odpověď dorazí celá, jen patří někomu jinému. Práh závisí na šířce mezivrstvy modelu: čím širší, tím míň tokenů stačí.
Řešení je aktualizace na 0.27.0 nebo novější. Kdo sleduje jen bezpečnostní kanály, měl přitom šanci se o věci dozvědět až se zpožděním: záznam na cve.org je datovaný 13. srpnem a v databázi hlášení GitHubu se objevil 8. září. Stejná mezera provázela i CVE-2026-73557, které vLLM zveřejnil o čtyři dny dřív.