Web messages

Если страница небезопасно обрабатывает входящие веб‑сообщения, например, некорректно проверяет origin входящих сообщений в обработчике события, то свойства и функции, вызываемые этим обработчиком, потенциально могут стать приёмниками. Например, злоумышленник может разместить вредоносный iframe и использовать метод postMessage()для передачи данных уязвимому обработчику, который затем отправляет полезную нагрузку в приёмник на родительской странице. Это означает, что веб‑сообщения можно использовать как источник для распространения вредоносных данных к любым из этих приёмников.

Каковы последствия уязвимостей веб‑сообщений?

Потенциальное воздействие уязвимости зависит от того, как документ‑получатель обрабатывает входящее сообщение. Если документ‑получатель доверяет отправителю и небезопасно обрабатывает полученные данные, передавая их в приёмник, то совместное поведение двух документов может позволить злоумышленнику скомпрометировать пользователя.

Как сконструировать атаку, используя веб‑сообщения в качестве источника

Рассмотрим следующий код:

<script>
window.addEventListener('message', function(e) {
  eval(e.data);
});
</script>

Он уязвим, поскольку злоумышленник может внедрить JavaScript‑полезную нагрузку, сконструировав следующий iframe:

<iframe src="//vulnerable-website" onload="this.contentWindow.postMessage('print()','*')">

Поскольку обработчик события не проверяет происхождение сообщения, а метод postMessage() указывает targetOrigin как "*", обработчик принимает полезную нагрузку и передаёт её в приёмник, в данном случае в функцию eval().

Проверка origin

Даже если обработчик события включает некоторую форму проверки origin, этот шаг проверки иногда может быть принципиально ошибочным. Например, рассмотрим следующий код:

Метод indexOf используется, чтобы попытаться проверить, что происхождение входящего сообщения относится к домену normal-website.com. Однако на практике он лишь проверяет, содержится ли строка "normal-website.com"где‑нибудь в origin. В результате злоумышленник может легко обойти эту проверку, если origin его вредоносного сообщения будет, например, http://www.normal-website.com.evil.net.

Та же уязвимость относится к проверкам, основанным на методах startsWith()или endsWith(). Например, следующий обработчик события посчитает origin http://www.malicious-websitenormal-website.com безопасным:

Какие приёмники могут привести к уязвимостям веб‑сообщений?

Пока сайт принимает данные веб‑сообщений из ненадежных источников из‑за недостаточной проверки origin, любые приёмники, используемые обработчиком события входящего сообщения, потенциально могут приводить к уязвимостям.

Last updated