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

Ray se před prohlížeči bránil hlavičkou User-Agent a CISA chybu vede jako zneužívanou

Výpočetní engine Ray odmítal požadavky z prohlížeče podle toho, jestli hlavička User-Agent začíná slovem Mozilla. Ve Firefoxu a Safari jde ta hlavička přepsat ze skriptu, takže spolu s útokem DNS rebinding stačilo k převzetí vývojářského stroje otevřít cizí stránku. CISA zranitelnost CVE-2025-62593 zapsala 17. srpna 2026 do katalogu známých zneužívaných chyb.

· aktualizováno 1. 9. 2026 · 189 zhlédnutí

Okno prohlížeče Firefox ve Windows s prázdným novým panelem v tmavém motivu
Prázdný nový panel prohlížeče Firefox ve Windows. Útok na Ray začíná tím, že vývojář v takovém okně otevře cizí stránku. Foto: Drstrange85, Wikimedia Commons (CC BY-SA 4.0)

Americká agentura CISA přidala 17. srpna 2026 do katalogu známých zneužívaných zranitelností jedinou položku, chybu CVE-2025-62593 ve frameworku Ray. Ray je výpočetní engine pro umělou inteligenci: rozděluje trénování a obsluhu modelů mezi mnoho strojů a jeho repozitář má přes 43 tisíc hvězd. Federální úřady dostaly na vyřízení tři dny, do 20. srpna.

Zajímavější než lhůta je ale to, co chybu roky drželo pod pokličkou. Jediné, co bránilo cizí webové stránce spustit na vývojářově počítači libovolný příkaz, bylo jméno prohlížeče v hlavičce požadavku.

Ovládací panel Ray spouští kód a nikoho se neptá

Ray má webový panel, který mimo jiné nabízí rozhraní /api/jobs/. Poslat mu úlohu znamená nechat na clusteru spustit příkaz, a žádné přihlášení k tomu nikdy potřeba nebylo. Tvůrci to nepovažovali za vadu: podle nich se Ray provozuje v uzavřené síti, kam se nikdo nepovolaný nedostane.

Aby se k tomu rozhraní nedostala webová stránka otevřená na témže počítači, přibyl v panelu jednoduchý filtr. Požadavky metodami POST a PUT se zahodí, pokud hlavička User-Agent začíná řetězcem Mozilla, protože tak se hlásí každý běžný prohlížeč. Komentář v kódu si přitom byl vědom, na jak tenkém ledě stojí. Volně přeloženo: tahle heuristika je hodně slabá, ale prohlížeč ji obejde těžko, protože fetch a spřízněná rozhraní User-Agent změnit neumějí.

Ta druhá polovina věty neplatí. Specifikace fetch přepsání hlavičky User-Agent dovoluje a Firefox se Safari se jí drží. Chrome zranitelný podle oznámení projektu není, ale jen shodou okolností: vlastní chybou se od specifikace odchyluje a hlavičku přepsat nenechá.

DNS rebinding dostane cizí stránku na místní adresu

Samotné přepsání hlavičky útočníkovi nestačí. Prohlížeč hlídá pravidlo stejného původu: stránka ze serveru útočníka nesmí číst odpovědi z adresy 127.0.0.1:8265, kde panel Ray poslouchá. Tuhle zeď obchází DNS rebinding.

Funguje na jednoduchém principu. Útočníkova doména se poprvé přeloží na jeho vlastní server, odkud si prohlížeč stáhne stránku se skriptem. Záznam má ale nastavenou velmi krátkou dobu platnosti, takže se za pár vteřin přeloží znovu, tentokrát na 127.0.0.1. Prohlížeč pořád vidí tutéž doménu, a tedy tentýž původ, jenže požadavky už míří na místní port. Oznámení uvádí, že si s tím poradí běžně dostupný nástroj, konkrétně jmenuje singularity od NCC Group.

Zbytek je krátký. Skript pošle na /api/jobs/ úlohu s vlastní hlavičkou User-Agent, filtr ji propustí a Ray příkaz spustí. Ukázka útoku přiložená k oznámení jen otevře kalkulačku, aby bylo vidět, že kód opravdu běží. Autoři popisují i druhé využití: prohlížeč vývojáře se dá stejným způsobem použít jako prostředník k útoku na instance Ray uvnitř firemní sítě, kam se útočník zvenčí nedostane.

Záplata sáhla po hlavičkách, které skript nastavit nesmí

Oprava dorazila v commitu nazvaném Add denial of fetch headers. Přidává funkci has_sec_fetch_headers(), která hledá kteroukoli z hlaviček Sec-Fetch-Mode, Sec-Fetch-Dest, Sec-Fetch-SiteSec-Fetch-User. Prohlížeče je posílají u každého požadavku a skript s nimi nic nesvede: názvy začínající na Sec- patří mezi zakázané hlavičky, které rozhraní fetch nastavit odmítne.

def has_sec_fetch_headers(req: Request) -> bool:
    """Checks for the existance of any of the sec-fetch-* headers"""
    return any(
        h in req.headers
        for h in (
            "Sec-Fetch-Mode",
            "Sec-Fetch-Dest",
            "Sec-Fetch-Site",
            "Sec-Fetch-User",
        )
    )

Rozdíl proti původnímu stavu je v tom, o čem rozhoduje útočník. Dřív se odmítnutí odvíjelo od řetězce, který si volající píše sám. Nově stačí, aby požadavek nesl stopu prohlížeče, kterou prohlížeč připojuje bez ohledu na to, co si přeje stránka. Součástí commitu je i test, který se pokusí spustit úlohu s vymyšleným User-Agentem a hlavičkou Sec-Fetch-Site a čeká, že ho panel odmítne.

Ray počítá s tím, že síť je bezpečná

Bezpečnostní kapitola dokumentace je v tomhle otevřená. Volně přeloženo z ní plyne, že Ray poslušně vykoná kód, který dostane, a nerozlišuje mezi laděním modelu, instalací rootkitu a průzkumem úložiště S3. Izolaci má podle ní zajistit okolí clusteru, ne cluster sám.

Ze stejné úvahy vychází i to, že starší CVE-2023-48022, popisující spuštění kódu přes rozhraní pro odesílání úloh, je v databázi NVD vedené jako sporné. Stanovisko výrobce tam stojí černé na bílém: hlášení je podle něj bezpředmětné, protože dokumentace uzavřenou síť vyžaduje. Útok přes prohlížeč tuhle obranu obchází z druhé strany, protože uzavřenou sítí je v tomhle případě vývojářův vlastní notebook.

Vydání Ray 2.52.0 z 21. listopadu 2025, které chybu opravilo, přineslo zároveň vestavěné ověřování tokenem napříč panelem, příkazovou řádkou, klienty rozhraní i vnitřními službami. Dokumentace ho popisuje jako vrstvu navíc, ne jako náhradu síťové izolace.

Mezi opravou a zápisem do katalogu uplynulo devět měsíců

Časová osa je poučná sama o sobě. Opravená verze vyšla 21. listopadu 2025, oznámení projektu a záznam v NVD o pět dní později, zápis do katalogu CISA až 17. srpna 2026.

Co přesně agenturu k zápisu vedlo, se ze záznamu nedozvíte. Poznámky u položky odkazují jen na oznámení projektu, opravný commit, směrnici BOD 26-04 a záznam v NVD, tedy na nic, co by zneužití dokládalo. Pole o využití při vydírání je vyplněné hodnotou Unknown.

Rozcházejí se i známky závažnosti. NVD dává 8,8 bodu podle metriky CVSS ve verzi 3.1 a chybu řadí jako vysokou, GitHub 9,4 bodu podle verze 4.0 a řadí ji jako kritickou. Není to spor o fakta, ale rozdíl mezi dvěma vydáními téže stupnice; verze 4.0 započítává i dopad na okolní systém, což u útoku mířícího na pracovní stroj vývojáře přirozeně vyjde hůř.

Praktický závěr je nepříjemně obecný. Kontrola hlavičky User-Agent není bezpečnostní hranicí nikde, ne jenom v Ray, a vývojářských nástrojů, které si na místním portu otevřou rozhraní bez hesla a spoléhají na to, že jsou přece jenom na localhostu, je celá řada. Prohlížeč otevřený na témže stroji je od nich vzdálený jednu krátkou dobu platnosti záznamu DNS.

Bezpečnost

CISA zranitelnosti Python prohlížeče umělá inteligence

← zpět na výpis