Атака на системи фронтенд-бекенд, що дозволяє вклинитися в сторонні запити

Розкрито деталі нової атаки на сайти, що використовують модель фронтенд-бекенд, наприклад, що працюють через мережі доставки контенту, балансувальники або проксі. Атака дозволяє через відправлення певних запитів вклинюватися у вміст інших запитів, що обробляються в тому ж потоці між фронтендом та бекендом. Запропонований метод успішно застосований для організації атаки, що дозволяє перехоплювати параметри автентифікації користувачів сервісу PayPal, який виплатив дослідникам близько 40 тисяч доларів у рамках програми інформування про невиправлені вразливості. Атака також застосовується для сайтів, які використовують мережу доставки контенту Akamai.

Суть проблеми в тому, що фронтенди та бекенди найчастіше забезпечують різний рівень підтримки протоколу HTTP, але при цьому інкапсулюють запити різних користувачів до загального каналу. Для зв'язку приймаючого запити фронтенду і оброблюючого запити бекенда встановлюється довгострокове TCP-з'єднання, через яке транслюються запити користувачів, що передаються по ланцюжку один за одним з поділом засобами протоколу HTTP. Для розділення запитів можуть використовуватись заголовки «Content-Length» (визначає загальний розмір даних у запиті) та «Передача-кодування: шматок» (дозволяє передавати дані частинами, вказуючи блоки різного розміру у форматі «{розмір}\r\n{блок}\r\n{розмір}\r\n{блок}\r\n0”).

Проблема виникає, якщо фронтенд підтримує тільки Content-Length, але ігнорує Transfer-Encoding: chunked (наприклад, так чинив CDN Akamai) або навпаки. У разі підтримки Transfer-Encoding: chunked на обох сторонах для атаки можуть використовуватися особливості реалізації парсерів HTTP-заголовків (наприклад, коли фронтенд ігнорує рядки виду Transfer-Encoding: xchunked, Transfer-Encoding: chunked, Transfer-Encoding :[tab]chunked", "X: X[\n]Transfer-Encoding: chunked", "Transfer-Encoding[\n]: chunked" або "Transfer-Encoding : chunked", а бекенд успішно обробляє їх).

У цьому випадку атакуючий може відправити запит, в якому одночасно вказані заголовки «Content-Length» і «Transfer-Encoding: chunked», але розмір «Content-Length» не відповідає розміру chunked-ланцюжка, який менший від фактичного значення. Якщо фронтенд обробить і перенаправить запит відповідно до «Content-Length», а бекенд чекатиме завершення блоку на основі «Transfer-Encoding: chunked», то кінець даних на підставі «Transfer-Encoding: chunked» буде визначений раніше і хвіст запиту, що залишився. атакуючого виявиться спочатку наступного запиту, тобто. атакуючий отримає можливість прикріплення довільних даних на початок чужого запиту, переданого слідом.

Атака на системи фронтенд-бекенд, що дозволяє вклинитися в сторонні запити

Для визначення проблеми у зв'язці, що використовується фронтенд-бекенд через фронтенд можна відправити запит виду:

POST /about HTTP/1.1
Хост: example.com
Передача-кодування: шматок
Content-Length: 4

1
Z
Q

Проблема присутня, якщо бекенд відразу не опрацює запит і чекатиме на прихід фінального нульового обмежуючого блоку chunked-даних. Для більш повної перевірки підготовлена спеціальна утиліта, яка також тестує можливі методи приховування заголовка Transfer-Encoding: chunked від фронтенду.

Проведення реальної атаки залежить від можливостей сайту, що атакується, наприклад, при атаці на web-додаток Trello можна підмінити початок запиту (підставити дані виду «PUT /1/members/1234… x=x&csrf=1234&username=testzzz&bio=cake») і відправити повідомлення, що включає оригінальний запит стороннього користувача та зазначені в ньому Cookie автентифікації. Для атаки на saas-app.com виявилося можливим здійснити підстановку JavaScript-коду у відповідь через його підстановку в один із параметрів запиту. Для атаки на redhat.com був використаний внутрішній обробник для перенаправлення на сайт атакуючого (підставлено запит типу «POST /search?dest=../assets/idx?redir=//[захищено електронною поштою]/HTTP/1.1»).

Застосування методу мереж доставки контенту дозволяло просто підмінити запитуваний сайт через підстановку заголовка «Host:». Атака також застосовна для організації отруєння вмісту систем кешування контенту та вилучення конфіденційних даних, що прокешують. Вершиною застосування методу стала організація атаки на PayPal, що дозволяє перехоплювати паролі, що надсилаються користувачами під час аутентифікації (була здійснена зміна запиту iframe для виконання JavaScript у контексті сторінки paypal.com/us/gifts, для якої не застосовувався CSP (Content Security Policy)).

Цікаво, що у 2005 році була запропонована схожа по суті техніка підміни запитів, що дозволяє підмінити дані в проксі кешуючих (Tomcat, squid, mod_proxy) або обійти блокування міжмережевих екранів через вказівку декількох запитів «GET» або «POST» в рамках одного HTTP-сеансу.

Джерело: opennet.ru

Додати коментар або відгук