Разработчики популярных браузеров регулярно выпускают обновления своих программ, чтобы сделать посещение сайтов более удобным и безопасным. Однако современные браузеры содержат миллионы строк исходного кода, поэтому отследить влияние каждого обновления на программу в целом трудно. В результате новые функции иногда делают браузер уязвимым к ранее изученным атакам. Так случилось недавно с download-бомбами. Давайте разберемся, что это такое.

1. Регрессия в новом релизе

В марте 2018 года вышел релиз 65 версии браузера Google Chrome. В этой версии появились инструменты для SEO-аудита, была улучшена панель анализа производительности, но главное – были анонсированы исправления 45 уязвимостей. В том числе была устранена возможность многократного запуска скачивания файла с помощью JavaScript (запуска download-бомбы). «Бесконечное» скачивание файла заставляет браузер зависнуть, благодаря чему невозможно закрыть текущую вкладку. Но в чем смысл этой атаки? Оказывается, злоумышленники могут показывать в зависшей вкладке сообщения о заражении компьютера вирусом и предлагать звонить в фальшивую службу технической поддержки. Далее с помощью методов социальной инженерии по телефону преступники узнают персональные данные пользователя, получают доступ к его интернет-банкингу и т.п.

Казалось бы, уязвимость исправлена, значит, о подобных атаках можно забыть? Увы, нет. В 67 версии Chrome снова появилась возможность атаки download-бомбами. При этом опасности подвержены и другие браузеры на основе Blink – например, Яндекс.Браузер и Vivaldi. Хуже всего то, что и Firefox подвержен опасности (в Edge и Internet Explorer download-бомба не сработала, браузер не завис).

2. Как это работает?

Трюк с многократным скачиванием файла срабатывает при использовании JavaScript-метода Blob и функции window.navigator.msSaveOrOpenBlob. Однократное скачивание файла с помощью этой функции реализуется примерно так:

var blobFile = new Blob([data], {type: ‘text/plain’});    if(window.navigator.msSaveOrOpenBlob) {        window.navigator.msSaveBlob(blobFile, newFileName);    }

Здесь создается новый объект Blob (для примера скачивается текстовый файл), далее мы проверяем, поддерживается ли функция msSaveOrOpenBlob нашим браузером, и, если поддерживается, скачиваем файл. Код для браузеров, не поддерживающих данную функцию, опущен.

Для проведения атаки подобная функция вызывается несколько тысяч раз, например, с помощью SetInterval. В результате нагрузка на процессор возрастает, вкладка в браузере зависает. Можно в это время показывать страницу с пугающим предупреждением о вредоносном ПО (и телефоном ненастоящей службы поддержки) или просто демонстрировать рекламу.

3. Как защититься от угрозы?

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

taskkill /f /im firefox.exe

В Linux и macOS всегда можно воспользоваться kill или killall. После того как процессы завершатся, вы сможете перезапустить браузер и быстро закрыть вкладку с download-бомбой, пока страница не загрузилась еще раз.

4. Так нужно ли обновляться?

Увы, ситуация с внезапным восстановлением работоспособности download-бомб стала не единственным неприятным сюрпризом для пользователей. В конце июня 2018 года стало известно, что новая версия стандарта WebAssembly, которая будет поддерживаться всеми основными браузерами, может сделать компьютеры миллионов пользователей уязвимыми к ряду атак по времени (тайминг-атак). Это станет возможным из-за поддержки сверхточных JavaScript-таймеров: в ближайшем будущем ограничения, которые специально вводились для защиты от некоторых атак, не будут больше работать.

Возникает резонный вопрос: если в новых версиях браузеров проявляются такие регрессии (и будут проявляться), может быть, лучше вообще обновлять браузер как можно реже? Например, скачать хорошо протестированный предыдущий релиз Chrome или Firefox и долго не обновляться?

Это решение не лишено некоторых плюсов (стабильность интерфейса, отсутствие сломанных расширений и т.п.), но с точки зрения безопасности оно неидеально. Все-таки возвращения старых уязвимостей случаются не так часто, а ошибки исправляются в каждом релизе. Поэтому обновляться все-таки нужно, но лучше всего дожидаться официального релиза новой версии (от использования бета-версий и «ночных» сборок можно отказаться, если вы не знаете точно, что вам нужны именно новые функции браузера для повседневной работы в Интернете).