Výzkumníci ze společností Netflix a Google nalezli v různých implementacích protokolu HTTP/2 osm zranitelností, které umožňují vyvolat odmítnutí služby tím, že se odešle specificky formátovaný proud síťových požadavků. Problémy v různé míře ovlivňují většinu HTTP serverů s podporou HTTP/2 a vedou k vyčerpání dostupné pracovní paměti nebo vytvářejí příliš vysoké zatížení CPU. Opravy zranitelností již byly vydány v a , ale zatím pro Apache httpd a .
Problémy byly důsledkem komplikací zavedených do protokolu HTTP/2, spojených s použitím binárních struktur, systémem omezení datových proudů v rámci spojení, mechanismem prioritizace proudů a přítomností zpráv pro správu podobných ICMP, které fungují na úrovni HTTP/2 (například operace ping, resetování a nastavení proudu). Mnohé implementace adekvátně neomezovaly tok správy zpráv, neefektivně organizovaly práci prioritních front při zpracování požadavků nebo používaly neoptimální implementace algoritmů řízení toku.
Většina identifikovaných metod útoku spočívá v odesílání specifických požadavků na server, což vede k generování velkého počtu odpovědí. Pokud klient přitom nečte data ze socketu a neukončuje spojení, fronta vyrovnávání odpovědí na straně serveru se neustále plní. Takové chování vytváří zátěž na systém řízení front zpracování síťových spojení a v závislosti na specifikách implementace může vést k vyčerpání dostupné paměti nebo zdrojů CPU.
Zjištěné zranitelnosti:
- CVE-2019-9511 (Data Dribble) — útočník žádá velké množství dat ve více tocích, manipuluje s velikostí posuvného okna a prioritou proudu, což nutí server ukládat data do fronty po blocích o 1 bajtu;
- CVE-2019-9512 (Ping Flood) — útočník neustále posílá ping zprávy prostřednictvím spojení HTTP/2, čímž iniciuje vyplnění vnitřní fronty zaslaných odpovědí na druhé straně;
- CVE-2019-9513 (Resource Loop) — útočník vytváří několik toků požadavků a neustále mění priority toků, což způsobuje promíchání prioritního stromu;
- CVE-2019-9514 (Reset Flood) — útočník vytváří několik proudů
a odesílá každý tok neplatného požadavku, což vyvolává odeslání paketů RST_STREAM serverem, ale neakceptuje je pro vyplnění fronty odpovědí; - CVE-2019-9515 (Záplava nastavení) – útočník odesílá tok prázdných rámců "SETTINGS", na které server musí potvrdit přijetí každého požadavku;
- CVE-2019-9516 (Únik záhlaví o délce 0) – útočník odesílá tok záhlaví s nulovým názvem a nulovou hodnotou, zatímco server alokuje pro každé záhlaví vyrovnávací paměť v paměti a neuvolňuje ji až do ukončení relace;
- CVE-2019-9517 (Interní vyrovnávací paměť dat) – útočník otevírá
klouzavé okno HTTP/2 pro odeslání dat serverem bez omezení, ale přitom drží okno TCP zavřené, což neumožňuje skutečně zapisovat data do soketu. Poté útočník odesílá požadavky, které vyžadují velkou odpověď; - CVE-2019-9518 (Záplava prázdných rámců) – útočník odesílá tok rámců typu DATA, HEADERS, CONTINUATION nebo PUSH_PROMISE, ale s prázdným užitečným obsahem a bez příznaku dokončení toku. Server ztrácí čas zpracováním každého rámce, nepřiměřeně odpovídající šířce pásma útočníka.
Zdroj: opennet.ru
