Хакер пишет вредоносный код, который спрятан в svg изображении
Хакер пишет вредоносный код, который спрятан в svg изображении
Категория: Разработка Теги: Веб-разработка , Уязвимости Опубликовано: 12 августа 2023

Уязвимость редиректа в html теге embed через svg

В HTML тег embed можно вставить SVG изображение и вставить его можно при помощи base64, а уже внутри него можно зашить javascript и он будет выполнен.

Тег <embed> является одним из способов встроить мультимедийные элементы или плагины в веб-страницу. Он используется для отображения контента, такого как изображения, аудио, видео, флеш, PDF и т. д. внутри веб-страницы. Тег <embed> поддерживает различные типы мультимедиа и обеспечивает возможность взаимодействия с этими элементами.

В теге embed можно использовать в том числе и SVG-изображения.

Использование base64 кодирования позволяет вставить изображение непосредственно в код HTML, что может быть полезно, если нет отдельного файла изображения или необходимо улучшить скорость загрузки страницы. Для этого используется атрибут src тега embed.

И оказывается, что можно в base64 засунуть javascript и он будет успешно преобразован браузером, что позволит его использовать на стороне клиента. Логика простая! Часть js пишется открыто и без второй части она не выглядит опасно, но вторая часть спрятана именно в этом якобы изображении svg в виде base64, и при расшифровке код может выполнить вредоносные действия. Самое печальное в том, что он и сейчас очень плохо детектируется средствами защиты, хотя с момента его обнаружения антивирусными лабораториями прошло около трех месяцев.

В общем, меньше слов, больше демонстрации, вот код:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
  <embed src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KPGNpcmNsZT48L2NpcmNsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5wYXJlbnQud2luZG93LnBvc3RNZXNzYWdlKCJodHRwczovL3d3dy5tYWlsLnJ1IiwgIioiKTwvc2NyaXB0Pg0KPC9zdmc+">
  <script>
    window.addEventListener("message", (event) => {
        console.log(event)
        if (event.data)
            window.location = event.data;
    }, false);
  </script>
</body>

</html>

Данный HTML код содержит встроенное SVG изображение через тег embed. Однако, JavaScript код отслеживает сообщения, получаемые от других источников с помощью функции window.addEventListener("message") и, при наличии данных в сообщении, перенаправляет пользователя на URL, указанный в сообщении.

Теперь самое интересное... возьмите base64, который якобы является изображением и при помощи любого сервиса декодируйте. Вы получите следующий код:

<svg xmlns="http://www.w3.org/2000/svg">
<circle></circle>
<script type="text/javascript">parent.window.postMessage("https://www.mail.ru", "*")</script>
</svg>

Данный код представляет собой SVG-изображение, внутри которого содержится круг <circle></circle> и скрипт <script type="text/javascript">parent.window.postMessage("https://www.mail.ru", "*")</script>.

Скрипт использует метод postMessage() для отправки сообщения родительскому окну с URL-адресом "https://www.mail.ru". Знак "*" означает, что сообщение может быть отправлено любому окну.

Вы можете сохранить тот изначальный код в html файл и убедиться, что при его открытии произойдёт перенаправление на mail.ru.

Теперь представьте, что там может быть фишинговый сайт. Вы понимаете, что таким образом можно обмануть даже самого грамотного безопасника? 

В данный пример mail.ru я уже сам вставил, а в изначальном файле был OpenRedirect через вредоносный сайт. Достаточно открыть зараженный сайт и он сможет похитить всё что угодно из вашего браузера.

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

Советы по защите для веб-разработчиков

  1. Фильтрация и валидация входных данных: Необходимо проверять и фильтровать все входные данные, включая все входные параметры, поля формы или значения URL-адресов, чтобы предотвратить внедрение вредоносного кода.

  2. Использование Content Security Policy, CSP: CSP позволяет контролировать и ограничивать источники ресурсов, которые могут быть загружены на вашем сайте. Это включает скрипты, стили, изображения, фреймы и многое другое. Установка CSP с правильными правилами поможет предотвратить выполнение вредоносного кода, в том числе и SVG с внедренными скриптами.

  3. Регулярные обновления и установка обновлений безопасности: Важно регулярно обновлять и поддерживать все компоненты вашего веб-сайта, включая серверное программное обеспечение, библиотеки и фреймворки. Обновления могут содержать исправления уязвимостей, которые могут быть использованы в подобных атаках.

  4. Использование заголовков безопасности HTTP: Настройте свои сервера для отправки заголовков безопасности HTTP, таких как X-Content-Type-Options и X-Frame-Options, которые могут помочь в предотвращении внедрения вредоносных скриптов.

  5. Мониторинг и ведение журналов событий: Установите систему мониторинга и ведения журналов событий, которая будет отслеживать любые подозрительные действия или атаки на ваш веб-сайт. Это поможет вам быстро обнаружить и реагировать на потенциальные уязвимости.

Не существует способа полной защиты от всех возможных атак, поэтому рекомендуется принимать совокупность мер для обеспечения безопасности вашего сайта.

Рекомендации для клиентских машин и простых пользователей

Для защиты клиентских машин от подобного кода рекомендуется применять следующие меры:

  1. Регулярные обновления и установка обновлений безопасности: Важно регулярно обновлять и поддерживать программное обеспечение клиентских машин, включая операционные системы, браузеры и плагины. Обновления могут содержать исправления уязвимостей, которые могут быть использованы в подобных атаках.

  2. Использование защитного программного обеспечения: Установите и поддерживайте антивирусное программное обеспечение и брандмауэры на клиентских машинах. Это поможет обнаружить и блокировать вредоносный код, включая скрипты, которые могут быть внедрены в запросы или отображены на веб-страницах.

  3. Обучение пользователей: Проведите обучение пользователей об основах безопасности в Интернете, включая предостережения от перехода по подозрительным ссылкам, скачивания ненадежных файлов или открытия вредоносных вложений в электронных письмах. О том, как распознать фишинговое письмо или фишинговую ссылку я писал тут.

  4. Мониторинг активности: Установите систему мониторинга активности на клиентских машинах для обнаружения подозрительной активности или поведения, а также ведения журналов событий для последующего анализа и реагирования.

  5. Использование доступных инструментов защиты: Базовая безопасность может быть усилена с помощью использования инструментов, таких как внедренный защитный код, отключение автозапуска кода или настройка ограничений на выполнение скриптов в браузерах.

Блокировщики рекламы и отключение JavaScript могут помочь в защите от некоторых видов вредоносного кода, но при этом множество полезных сайтов могут отображаться или работать некорректно.

Блокировщики рекламы могут блокировать вредоносные объявления и скрипты, которые могут быть использованы для атаки или внедрения вредоносного кода. Они работают путем блокировки запросов к рекламным серверам или фильтрации содержимого веб-страниц для выявления подозрительной активности.

Отключение JavaScript также может предотвратить выполнение некоторых видов вредоносного кода, особенно если атакующий использует именно JavaScript для своих атак. Однако отключение JavaScript может быть неудобным для пользователей, поскольку многие веб-сайты зависят от JavaScript для правильной работы.

Важно отметить, что блокировщики рекламы и отключение JavaScript не являются идеальными методами защиты и могут иметь некоторые недостатки. Некоторые вредоносные коды могут обходить блокировщики рекламы или использовать другие методы атаки, не требующие JavaScript.

Лучший подход к обеспечению безопасности включает комбинирование различных методов и мер безопасности, таких как фильтрация данных, обновления безопасности и использование безопасного программного обеспечения.

Алексей Черемных
937