dĂ©tails de la nouvelle attaque sur les sites utilisant le modĂšle frontend-backend, par exemple, ceux fonctionnant via des rĂ©seaux de diffusion de contenu, des Ă©quilibreurs de charge ou des proxy. L'attaque permet, en envoyant des requĂȘtes spĂ©cifiques, d'interfĂ©rer dans le contenu d'autres requĂȘtes traitĂ©es dans le mĂȘme flux entre le frontend et le backend. La mĂ©thode proposĂ©e a Ă©tĂ© appliquĂ©e avec succĂšs pour mener une attaque permettant d'intercepter les paramĂštres d'authentification des utilisateurs du service PayPal, qui a versĂ© environ 40 000 dollars aux chercheurs dans le cadre d'un programme de signalement de vulnĂ©rabilitĂ©s non corrigĂ©es. L'attaque est Ă©galement applicable aux sites utilisant le rĂ©seau de diffusion de contenu Akamai.
La essence du problĂšme est que les frontends et backends offrent souvent diffĂ©rents niveaux de support pour le protocole HTTP, tout en encapsulant les requĂȘtes de diffĂ©rents utilisateurs dans un canal commun. Une connexion TCP persistante est Ă©tablie entre le frontend, qui reçoit les requĂȘtes, et le backend, qui les traite, Ă travers laquelle les requĂȘtes des utilisateurs sont transmises en chaĂźne, les unes aprĂšs les autres, avec sĂ©paration par les moyens du protocole HTTP. Pour sĂ©parer les requĂȘtes, les en-tĂȘtes « Content-Length » (dĂ©terminant la taille totale des donnĂ©es dans la requĂȘte) et «» (permettant de transmettre des donnĂ©es par morceaux, en spĂ©cifiant des blocs de tailles diffĂ©rentes au format «{taille}\r\n{bloc}\r\n{taille}\r\n{bloc}\r\n0»).
Le problĂšme survient si le frontend ne prend en charge que « Content-Length », mais ignore « Transfer-Encoding: chunked » (par exemple, c'Ă©tait le cas du CDN Akamai) ou vice versa. En cas de prise en charge de « Transfer-Encoding: chunked » des deux cĂŽtĂ©s, les particularitĂ©s de l'implĂ©mentation des analyseurs d'en-tĂȘte HTTP peuvent ĂȘtre utilisĂ©es pour l'attaque (par exemple, lorsque le frontend ignore des lignes telles que « Transfer-Encoding: xchunked », « Transfer-Encoding: chunked », « Transfer-Encoding:[tab]chunked », « X: X[\n]Transfer-Encoding: chunked », « Transfer-Encoding[\n]: chunked » ou « Transfer-Encoding : chunked », tandis que le backend les traite avec succĂšs).
Dans ce cas, un attaquant peut envoyer une requĂȘte contenant simultanĂ©ment les en-tĂȘtes « Content-Length » et « Transfer-Encoding: chunked », mais la taille dans « Content-Length » ne correspond pas Ă la taille de la chaĂźne chunked, qui est infĂ©rieure Ă la valeur rĂ©elle. Si le frontend traite et redirige la requĂȘte en fonction de « Content-Length », mais que le backend attend la fin du bloc en fonction de « Transfer-Encoding: chunked », alors la fin des donnĂ©es basĂ©e sur « Transfer-Encoding: chunked » sera dĂ©terminĂ©e plus tĂŽt, et le reste de la requĂȘte de l'attaquant se retrouvera au dĂ©but de la requĂȘte suivante, c'est-Ă -dire que l'attaquant aura la possibilitĂ© d'attacher des donnĂ©es arbitraires au dĂ©but de la requĂȘte d'un tiers transmise ensuite.

Pour identifier le problĂšme dans la chaĂźne frontend-backend utilisĂ©e, vous pouvez envoyer une requĂȘte de type :
POST /about HTTP/1.1
Host: example.com
Transfer-Encoding: chunked
Content-Length: 4
1
Z
Q
Le problĂšme est prĂ©sent si le backend ne traite pas immĂ©diatement la requĂȘte et attend l'arrivĂ©e du bloc de terminaison nul final des donnĂ©es chunked. Pour un contrĂŽle plus complet un utilitaire spĂ©cial qui teste Ă©galement les mĂ©thodes possibles pour masquer l'en-tĂȘte « Transfer-Encoding: chunked » du frontend.
La conduite d'une attaque rĂ©elle dĂ©pend des capacitĂ©s du site attaquĂ©, par exemple, lors d'une attaque sur l'application web Trello, il est possible de remplacer le dĂ©but de la requĂȘte (insĂ©rer des donnĂ©es telles que « PUT /1/members/1234⊠x=x&csrf=1234&username=testzzz&bio=cake ») et d'envoyer un message contenant la requĂȘte originale d'un utilisateur tiers et les Cookies d'authentification associĂ©s. Pour l'attaque sur saas-app.com, il a Ă©tĂ© possible d'injecter du code JavaScript dans la rĂ©ponse, Ă travers son insertion dans un des paramĂštres de la requĂȘte. Pour l'attaque sur redhat.com, un gestionnaire interne a Ă©tĂ© utilisĂ© pour rediriger vers le site de l'attaquant (une requĂȘte de type « POST /search?dest=..\/assets\/idx?redir=\/\/redhat.com@evil.net\/ HTTP/1.1 » a Ă©tĂ© insĂ©rĂ©e).
L'utilisation de la mĂ©thode pour les rĂ©seaux de livraison de contenu permettait de simplement intercepter le site demandĂ© en substituant l'en-tĂȘte « Host: ». L'attaque est Ă©galement applicable pour organiser la contamination des systĂšmes de mise en cache de contenu et extraire des donnĂ©es sensibles mises en cache. Le point culminant de cette mĂ©thode a Ă©tĂ© l'organisation d'une attaque contre PayPal, permettant d'intercepter les mots de passe envoyĂ©s par les utilisateurs lors de l'authentification (la requĂȘte iframe a Ă©tĂ© modifiĂ©e pour exĂ©cuter JavaScript dans le contexte de la page paypal.com/us/gifts, pour laquelle la CSP (Content Security Policy) n'Ă©tait pas appliquĂ©e).
Fait intĂ©ressant, en 2005, il y avait une technique de substitution de requĂȘtes similaire, permettant de modifier les donnĂ©es dans des proxies de mise en cache (Tomcat, squid, mod_proxy) ou de contourner les bloqueurs de pare-feu en passant plusieurs requĂȘtes « GET » ou « POST » dans un mĂȘme session HTTP.
Source : opennet.ru
