Зависание вкладки Яндекс Браузера при открытии определённой страницы или вводе текста в поле поиска может быть признаком 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.
☑️ Проверка зависающей вкладки
Если зависание воспроизводится только на одном сайте и в любом браузере — проблема на стороне сайта, и вы как пользователь можете лишь избегать этой страницы или сообщить владельцу ресурса.
Чем опасен 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?
Частично: если вредоносный скрипт загружается со стороннего домена, блокировщик может не дать ему выполниться. Но если уязвимое регулярное выражение находится в основном коде легитимного сайта, блокировщик не поможет — сработает уже сам браузер.