Tinklaraštis

HTTP/2 Rapid Reset: ataka kuri 2023 metais parklupdė internetą.

HTTP-2-Rapid-Reset
Linux

HTTP/2 Rapid Reset: ataka kuri 2023 metais parklupdė internetą.

2023 m. spalio 10 d. Cloudflare, Google ir Amazon paskelbė bendrą atskleidimą: tų pačių metų rugpjūtį jie užfiksavo DDoS atakas kelis kartus galingesnes nei visi ankstesni rekordai. Google atlaikė 398 milijonų užklausų per sekundę piką. Cloudflare — 201 milijoną. Amazon — 155 milijonus. Ankstesnis Cloudflare rekordas buvo 71 milijonas rps, nustatytas 2023 m. vasarį. Visos trys atakos buvo vykdomos per vieną HTTP/2 protokolo pažeidžiamumą.

CVE-2023-44487. CVSS 7.5 High. Ataka pavadinta Rapid Reset.

KAS YRA HTTP/2 IR KAM JAM REIKIA SRAUTŲ

HTTP/1.1 veikė paprastai: viena užklausa — vienas atsakymas, nuosekliai. Puslapiui su dešimčia paveikslėlių įkelti naršyklė atidarydavo iki 6 lygiagrečių ryšių per domeną — specifikacija neleidžia daugiau. Likusios užklausos laukdavo eilėje. Tai lėta.

HTTP/2 išsprendė problemą multipleksavimu: kelios užklausos ir atsakymai keliauja vienu metu viename TCP ryšyje. Kiekviena užklausa — atskiras srautas (stream). Naršyklė atidaro srautą HTML, paskui srautus CSS, JS, paveikslėliams — visa tai lygiagrečiai, vienas ryšys.

HTTP/2 srauto atšaukimui skirtas specialus kadras — RST_STREAM. Jei naršyklė nusprendė nebeįkelti paveikslėlio — ji siunčia RST_STREAM ir srautas užsidaro. Tai normali protokolo dalis.

Ir būtent čia slepiasi pažeidžiamumas.

ATAKOS MECHANIKA

Problema ta kad RST_STREAM — vienašalė operacija. Klientas išsiuntė kadrą ir iš karto laiko srautą uždarytu. Serveris privalo pradėti apdoroti užklausą prieš gaudamas atšaukimą — pagal HTTP/2 specifikaciją jis negali iš anksto atsisakyti darbo.

Užpuolikas išnaudoja tai taip:

1 žingsnis. Atidaro HTTP/2 ryšį su serveriu.

2 žingsnis. Siunčia užklausą — atidaro srautą.

3 žingsnis. Nedelsiant, nelaukdamas atsakymo, siunčia RST_STREAM — atšaukia srautą.

4 žingsnis. Grįžta prie 2 žingsnio. Tūkstančius kartų per sekundę. Viename TCP ryšyje.

Serveris gauna užklausų laviną kurią reikia pradėti apdoroti, paskui atšaukimų laviną, paskui vėl užklausas. CPU ir atmintis sunaudojami kuriant ir naikinant apdorojimo kontekstus. Realiems vartotojams nieko nelieka — serveris užsiėmęs.

Atakos kaina užpuolikui minimali: vienas TCP ryšys, minimalus srautas. Botnetas iš 20 000 mašinų kūrė apkrovą kuriai anksčiau reikėjo šimtų tūkstančių ar milijonų mazgų tinklo — būtent taip Cloudflare apibūdino šį skirtumą oficialiame tinklaraštyje.

KODĖL TAI NE TIK NGINX KLAIDA

Rapid Reset — pažeidžiamumas pačiame HTTP/2 protokole, o ne konkrečioje realizacijoje. Ataka palietė nginx, Apache, Tomcat, .NET, Go, Node.js — viską kas realizuoja HTTP/2. Pataisas turėjo išleisti visi vienu metu.

Svarbus niuansas: nginx kūrėjai oficialiai pareiškė kad nginx su numatytosiomis nuostatomis nėra pažeidžiamas Rapid Reset — numatytasis keepalive_requests apribojimas jau riboja užklausų skaičių per ryšį ir mažina atakos poveikį. Versijos 1.25.3 pataisa prideda patobulintą kenksmingų klientų aptikimą atvejams kai numatytosios reikšmės pakeistos. Todėl oficialaus CHANGES formuluotė: „improved detection of misbehaving clients when using HTTP/2.”

Nginx pažeidžiamumas uždarytas versijoje 1.25.3, išleistoje 2023 m. spalio 24 d. Jei naudojate nginx senesnę nei ši versija su nestandartiniu keepalive_requests ir įjungtu HTTP/2 — serveris potencialiai pažeidžiamas.

Patikrinti versiją:

nginx -v

Patikrinti ar HTTP/2 įjungtas konfigūracijoje. Iki nginx 1.25.0 HTTP/2 buvo įjungiamas listen eilutėje; nuo nginx 1.25.0+ naudojama atskira direktyva. Ši komanda pagauna abu variantus:

grep -r "http2" /etc/nginx/sites-enabled/

Jei rasite listen 443 ssl http2 arba http2 on — HTTP/2 aktyvus.

KAIP APSISAUGOTI

1 žingsnis — atnaujinti nginx

Svarbiausia. nginx 1.25.3 ir naujesnėse versijose yra pataisa su patobulinti kenksmingų klientų aptikimu naudojant HTTP/2 — tokia yra tiksliai oficialiame CHANGES. Aptikus rapid reset šabloną serveris uždaro ryšį vietoj to kad toliau apdorotų kiekvieną atšauktą transakciją:

# Debian/Ubuntu
sudo apt update && sudo apt upgrade nginx

# RHEL/CentOS/Fedora
sudo dnf update nginx

# Patikrinti po atnaujinimo
nginx -v

2 žingsnis — apriboti vienu metu atidaromų srautų skaičių

Direktyva http2_max_concurrent_streams riboja kiek lygiagrečių srautų klientas gali atidaryti viename ryšyje. Numatytoji reikšmė — 128. Daugumai svetainių pakanka 64 ar net 32:

http {
    http2_max_concurrent_streams 64;
    ...
}

Mažiau srautų — mažiau darbo atakos metu. Chrome ir Firefox palaiko iki 100 vienu metu veikiančių srautų per ryšį, tačiau įprastam puslapio įkėlimui retai naudoja daugiau nei 20–30. Reikšmė 64 nepalies realių vartotojų.

3 žingsnis — apriboti ryšius iš vieno IP

Rapid Reset efektyviausias esant dideliam ryšių skaičiui. limit_conn riboja kiek vienu metu priimama ryšių iš vieno IP:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        limit_conn addr 10;
    }
}

Vienas IP — ne daugiau 10 vienu metu veikiančių ryšių. Botnetas toliau veikia per skirtingus IP, tačiau kiekvieno ryšio apkrova apribota.

4 žingsnis — Cloudflare kaip pirmasis ešelonas

Cloudflare Rapid Reset atakas blokavo automatiškai 2023 m. spalį — dar prieš viešą CVE atskleidimą. Jei svetainė stovi už Cloudflare su įjungtu proxy, didžioji atakos dalis iki nginx apskritai nepasiekia.

Patikrinti kad Cloudflare veikia proxy režimu (oranžinis debesis DNS įrašuose), o ne tik DNS. Be proxy Cloudflare nesifiltruoja srauto.

TIPINĖS KLAIDOS

Manoma kad HTTP/2 paprasčiausiai galima išjungti ir problema išspręsta. Techniškai taip — tačiau HTTP/2 suteikia realų našumo padidėjimą, ir jį išjungti dėl jau ištaisyto pažeidžiamumo neturi prasmės.

Atnaujinamas nginx bet neperkraunamas. Po apt upgrade nginx reikalingas systemctl reload nginx — be jo procesas toliau veikia pagal seną kodą.

Netikrinama ar HTTP/2 apskritai įjungtas. Daugelis svetainių veikia su HTTP/1.1 ir šiai atakai visai nepažeidžiamos — patikrinkite prieš keičiant konfigūraciją.

IŠVADA

HTTP/2 Rapid Reset — retas atvejis kai pažeidžiamumas palietė ne konkretų produktą, o pagrindinį interneto protokolą. Pataisa negalėjo pasirodyti per naktį — ją koordinavo Google, Cloudflare, Amazon, Microsoft, nginx, Apache ir dešimtys kitų vienu metu.

Susirūpinti turėtų visi kas naudoja nginx senesnę nei 1.25.3 su įjungtu HTTP/2. Atnaujinimas visiškai uždaro pažeidžiamumą. http2_max_concurrent_streams ir limit_conn apribojimai prideda papildomą apsaugos sluoksnį kurį verta sukonfigūruoti nepriklausomai nuo versijos.

Cloudflare atlaikė 201 milijoną užklausų per sekundę. Nepatataisytas nginx ant dviejų branduolių VPS — ne.

Leave your thought here

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *