ReDoS и Яндекс Браузер: разбираемся в уязвимости и способах защиты

Зависание вкладки Яндекс Браузера при открытии определённой страницы или вводе текста в поле поиска может быть признаком ReDoS-атаки — регулярное выражение на веб-странице или в расширении обрабатывает строку экспоненциально долго и полностью блокирует поток JavaScript. Такая уязвимость называется Regular expression Denial of Service и встречается не только на серверах, но и в клиентском коде сайтов, расширений и веб-приложений, которые вы открываете в браузере.

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

Что такое ReDoS и почему он «вешает» браузер

ReDoS — это разновидность атаки типа «отказ в обслуживании», направленная на движок регулярных выражений. Некоторые шаблоны (например, с вложенными квантификаторами вида (a+)+$) при обработке специально подобранной строки заставляют движок перебирать астрономическое количество вариантов совпадения. Время обработки растёт экспоненциально от длины входа.

В контексте браузера проблема усугубляется архитектурой JavaScript: язык однопоточный, и пока выполняется «тяжёлое» регулярное выражение, вся вкладка полностью перестаёт реагировать на действия пользователя. Страница не скроллится, кнопки не нажимаются, а Яндекс Браузер может предложить принудительно завершить вкладку.

Источником уязвимого регулярного выражения может быть:

  • 🌐 код самого сайта — валидация форм, парсеры, подсветка синтаксиса;
  • 🧩 установленное расширение, обрабатывающее содержимое страниц;
  • 📦 сторонняя JavaScript-библиотека, подключённая разработчиком сайта;
  • ✉️ вредоносная страница, специально созданная для блокировки браузера жертвы.

Как ReDoS проявляется в Яндекс Браузере

Яндекс Браузер построен на движке Chromium, поэтому поведение при ReDoS у него схоже с другими Chromium-браузерами. Типичные симптомы: вкладка «замирает», загрузка процессора одним ядром подскакивает до максимума, интерфейс страницы не отвечает, а через некоторое время появляется системное предложение закрыть неотвечающую страницу.

Проверить, какой именно процесс потребляет ресурсы, можно через встроенный диспетчер задач браузера — он открывается через меню или сочетанием клавиш Shift + Esc. В списке видно, какая вкладка или расширение нагружает процессор. Если нагрузку создаёт конкретная вкладка сразу после загрузки страницы или ввода текста в поле — это повод заподозрить проблемное регулярное выражение в коде.

⚠️ Внимание: зависание вкладки — не всегда ReDoS. Похожие симптомы дают утечки памяти, бесконечные циклы в скриптах и конфликты расширений. Не делайте выводов по одному признаку — проведите диагностику, описанную ниже.
📊 Сталкивались ли вы с зависанием вкладок Яндекс Браузера на отдельных сайтах?
Да, регулярно на одних и тех же сайтах
Было пару раз, причина неизвестна
Нет, браузер работает стабильно
Зависает из-за расширений

Диагностика: отличаем ReDoS от других причин зависаний

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

Для более точной проверки используйте инструменты разработчика: нажмите F12, перейдите на вкладку Performance и запишите профиль во время зависания. Если весь поток занят одной длительной функцией, связанной с обработкой строк или вызовом RegExp, — это характерная картина ReDoS.

☑️ Проверка зависающей вкладки

Выполнено: 0 / 5

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

Чем опасен ReDoS для обычного пользователя

Для пользователя Яндекс Браузера клиентский ReDoS обычно означает временную потерю работоспособности вкладки: несохранённые данные в формах могут пропасть, а работа будет прервана. Само по себе зависание не крадёт данные и не заражает систему.

Однако ReDoS может использоваться как элемент более сложных сценариев — например, чтобы отвлечь внимание, задержать работу защитных скриптов страницы или вывести из строя веб-приложение, с которым работает сотрудник компании. Для серверной стороны (если вы разрабатываете сервис, который посещают через Яндекс Браузер) ReDoS уже означает реальную недоступность сервиса для всех пользователей.

Как защититься: шаги для пользователя

Полностью исключить встречу с уязвимой страницей нельзя, но минимизировать последствия вам помогут простые меры. Держите Яндекс Браузер обновлённым: разработчики движка регулярно закрывают уязвимости, включая проблемы производительности компонентов.

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

  • 🔄 включите автоматическое обновление браузера и проверяйте версию в настройках;
  • 🧹 оставьте только необходимые расширения, сомнительные — удалите;
  • 💾 перед заполнением длинных форм на незнакомых сайтах сохраняйте черновики отдельно;
  • 🚫 при повторяющихся зависаниях конкретного сайта избегайте его или используйте читальный режим, если он доступен.

Рекомендации для разработчиков сайтов и расширений

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

Дополнительные меры: ограничивайте длину пользовательского ввода до разумных значений, выносите тяжёлую обработку в Web Workers, чтобы не блокировать основной поток, и тестируйте регулярные выражения на специально подобранных «злых» строках. Существуют инструменты статического анализа, которые находят потенциально уязвимые паттерны в зависимостях проекта.

Пример опасного и безопасного подхода к валидации:

// Опасно: вложенные квантификаторы

const dangerous = /^([a-zA-Z0-9]+)+$/;

// Безопаснее: один квантификатор, ограничение длины

const safer = /^[a-zA-Z0-9]{1,64}$/;

⚠️ Внимание: не копируйте регулярные выражения из интернета без проверки. Популярные «готовые» паттерны для email, URL и паролей нередко содержат конструкции, уязвимые для ReDoS. Проверяйте каждый шаблон на длинных строках с повторяющимися символами.
Почему движок регулярных выражений так медленно работает на «злых» строках

Классические движки регулярных выражений в JavaScript используют backtracking — возврат назад при неудачном совпадении. Если шаблон допускает много способов разбить строку (например, вложенные повторы), движок перебирает все комбинации. Их число растёт экспоненциально от длины входа: строка из 30 символов может потребовать миллиарды шагов. Существуют движки без backtracking (на основе автоматов), но в JavaScript они не используются по умолчанию, поэтому ответственность лежит на авторе шаблона.

Сравнение подходов к защите от ReDoS

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

МераКто применяетЧто даётОграничения
Обновление браузераПользовательЗакрытие известных уязвимостей движкаНе защищает от уязвимого кода сайтов
Отключение лишних расширенийПользовательУменьшение поверхности атакиТребует ручного контроля
Аудит регулярных выраженийРазработчикУстранение коренной причиныНужны знания и время
Ограничение длины вводаРазработчикСнижение времени перебораНе устраняет уязвимость полностью
Web Workers для обработкиРазработчикИнтерфейс не блокируетсяУсложняет архитектуру

Часто задаваемые вопросы

Может ли ReDoS украсть мои пароли или данные из Яндекс Браузера?

Сама по себе ReDoS-атака направлена на отказ в обслуживании — она блокирует работу вкладки или сервиса, но не предназначена для кражи данных. Однако зависание может привести к потере несохранённой информации в формах, а в составе комплексной атаки — использоваться как вспомогательный элемент.

Яндекс Браузер уязвимее других браузеров для ReDoS?

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

Что делать, если вкладка зависла и не отвечает?

Откройте диспетчер задач браузера сочетанием Shift + Esc, найдите зависшую вкладку по нагрузке на процессор и завершите только её. Закрывать весь браузер не обязательно — остальные вкладки продолжат работать.

Как разработчику проверить своё регулярное выражение на ReDoS?

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

Помогает ли блокировщик рекламы против ReDoS?

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