У розных рэалізацыях пратаколу HTTP/2 выяўлена 8 DoS-уразлівасцяў

Даследнікі з кампаній Netflix і Google выявілі у розных рэалізацыях пратаколу HTTP/2 восем уразлівасцяў, якія дазваляюць выклікаць адмову ў абслугоўванні праз адпраўку вызначанай выявай аформленага струменя сеткавых запытаў. Праблемы ў той ці іншай меры закранаюць большасць HTTP-сервераў з падтрымкай HTTP/2 і прыводзяць да вычарпання даступнай для працоўнага працэсу памяці ці стварэнню занадта высокай нагрузкі на CPU. Абнаўленні з ухіленнем уразлівасцяў ужо прадстаўлены ў nginx 1.16.1/1.17.3 и H2O 2.2.6, але пакуль недаступныя для Apache httpd і іншых прадуктаў.

Праблемы сталі следствам унесеных у пратакол HTTP/2 ускладненняў, звязаных з ужываннем бінарных структур, сістэмай лімітавання струменяў дадзеных усярэдзіне злучэнняў, механізмам прыярытэтызацыі струменяў і наяўнасці ICMP-падобных кіраўнікоў паведамленняў, якія працуюць на ўзроўні злучэння HTTP/2 (напрыклад, аперацыі ping, скіду і налады патоку). Многія рэалізацыі належным чынам не абмяжоўвалі паток кіраўнікоў паведамленняў, неэфектыўна арганізоўвалі працу чаргі прыярытэтаў пры апрацоўцы запытаў або выкарыстоўвалі неаптымальныя рэалізацыі алгарытмаў кіравання патокам.

Большасць выяўленых метадаў нападу зводзяцца да адпраўкі на сервер вызначаных запытаў, якія прыводзяць да генерацыі вялікай колькасці адказаў. Калі пры гэтым кліент не чытае з сокета дадзеныя і не раздзірае злучэнне, чарга буферызацыі адказаў на боку сервера бесперапынна запаўняецца. Падобныя паводзіны ствараюць нагрузку на сістэму кіравання чаргой апрацоўкі сеткавых злучэнняў і ў залежнасці ад асаблівасцяў рэалізацыі прыводзіць да вычарпання даступнай памяці ці рэсурсаў CPU.

Выяўленыя ўразлівасці:

  • CVE-2019-9511 (Data Dribble) - атакавалы запытвае вялікі аб'ём дадзеных у некалькі патокаў, маніпулюючы памерам слізгальнага акна і прыярытэтам патоку, прымушаючы сервер змяшчаць дадзеныя ў чаргу блокамі па 1 байту;
  • CVE-2019-9512 (Ping Flood) — атакавалы бесперапынна атручвае ping-паведамленні праз злучэнне HTTP/2, ініцыюючы запаўненне на іншым боку ўнутранай чаргі адпраўленых адказаў;
  • CVE-2019-9513 (Resource Loop) - атакавалы стварае некалькі патокаў запытаў і бесперапынна мяняе прыярытэт патокаў, выклікаючы перамешванне дрэва прыярытэтаў;
  • CVE-2019-9514 (Reset Flood) - атакавалы стварае некалькі патокаў
    і адпраўляе праз кожны струмень некарэктны запыт, выклікаючы адпраўку серверам кадраў RST_STREAM, але не прымае іх для запаўнення чаргі адказаў;

  • CVE-2019-9515 (Settings Flood) - атакавалы адпраўляе струмень пустых кадраў "SETTINGS", у адказ на якія сервер абавязаны пацвердзіць атрыманне кожнага запыту;
  • CVE-2019-9516 (0-Length Headers Leak) - атакавалы адпраўляе струмень загалоўкаў з нулявым імем і нулявым значэннем, а сервер вылучае для захоўвання кожнага загалоўка буфер у памяці і не вызваляе яго да завяршэння сеансу;
  • CVE-2019-9517 (Internal Data Buffering) - атакуючы адкрывае
    слізгальнае акно HTTP/2 для адпраўкі серверам дадзеных без абмежаванняў, але пры гэтым трымае акно TCP зачыненым, што не дазваляе фактычна запісаць дадзеныя ў сокет. Далей атакавалы адпраўляе запыты, якія патрабуюць вялікага адказу;

  • CVE-2019-9518 (Empty Frames Flood) - атакавалы адпраўляе паток кадраў тыпу DATA, HEADERS, CONTINUATION або PUSH_PROMISE, але з пустым карысным змесцівам і без сцяга завяршэння патоку. Сервер марнуе час на апрацоўку кожнага кадра, непрапарцыйна затрачанай атакавалым паласе прапускання.

Крыніца: opennet.ru

Дадаць каментар