Прошло почти два года с тех пор, как в январе 2018-го Google Project Zero и другие раскрыли первые три уязвимости нового класса, которые затрагивают процессоры со спекулятивным выполнением. Их назвали Spectre (1 и 2) и Meltdown. Используя механизмы спекулятивного выполнения CPU, злоумышленник может временно обойти как явные, так и неявные программные проверки безопасности, которые не позволяют программам читать недоступные данные в памяти.
Самое печальное, что атаки Spectre возможны средствами JavaScript, а уязвимости подвержены практически все современные процессоры со спекулятивным выполнением инструкций.
В прошлом году Google внедрила изоляцию сайтов в настольных версиях своего браузера Chrome. Тогда разработчики из команды V8 объясняли, что атака Spectre состоит из двух частей:
-
Утечка недоступных в противном случае данных в скрытое состояние CPU. Все известные атаки Spectre используют спекуляции для передачи битов недоступных данных в кэши CPU.
- Извлечение скрытого состояния, чтобы восстановить недоступные данные. Для этого злоумышленнику нужны часы достаточной точности.
Теоретически, достаточно заблокировать любой из двух компонентов атаки. Но поскольку неизвестно, как полностью заблокировать ни один из них, разработаны смягчения, которые значительно уменьшают объём информации, просачивающейся в кэши CPU, и смягчения, которые затрудняют восстановление скрытого состояния.
Список смягчений
- Защита для таймера.
- «Усиление» считывания данных, не ограничиваясь ёмкостью кэша.
- Защита JIT: предотвращение спекулятивного выполнения кода и предотвращение чтения недоступных данных со стороны спекулятивного конвейера.
- Изоляция сайтов.
Изоляция сайтов
В принципе, ненадёжный код может считать всё адресное пространство процесса с помощью Spectre и сторонних каналов. Единственной эффективной мерой разработчики считают перемещение конфиденциальных данных за пределы адресного пространства процесса. Именно это делает механизм изоляции сайтов.
Этот метод изолирует веб-сайты в отдельных процессах, чтобы помешать одному сайту вмешиваться или отслеживать работу другого. Более того, на настольных компьютерах изоляция сайтов защищает и от других серьёзных уязвимостей безопасности, когда процесс рендеринга полностью скомпрометирован, таких как повреждение памяти или логические ошибки универсальных межсайтовых скриптов (Universal Cross-Site Scripting, UXSS).
Изоляция сайтов под Android
На прошлой неделе компания сделала следующий шаг — и активировала данный механизм безопасности в Android-версии браузера Chrome 77, который вышел в сентябре 2019 года. Одновременно усовершенствована защита от полностью скомпрометированных процессов рендеринга и универсальных ошибок межсайтовых скриптов на настольных версиях Chrome.
Изоляция сайта под Android работает аналогично десктопной версии, но более избирательно. Чтобы снизить нагрузку на процессор и память, защита активируется только на сайтах с авторизацией по паролю (банки, интернет-магазины, личные кабинеты разных сервисов и др.). Смысл в том, чтобы защищать конфиденциальные данные пользователей. Можно предположить, что на сайтах с авторизацией больше конфиденциальных данных, чем на обычных статических сайтах, которые открыты для всех.
Несмотря на ограниченный вариант защиты, она всё равно несёт с собой небольшой оверхед на потребление оперативной памяти от 3% до 5%.
Изоляция сайтов автоматически включена у всех пользователей Chrome 77 под Android, если на устройстве имеется минимум 2 ГБ оперативной памяти. Защита активирована у 99% всех пользователей (1% исключены из эксперимента как контрольная группа для мониторинга).
Как только Chrome заметит ввод пароля (или сохранённую сессию после авторизации), этот сайт навсегда заносится в список ресурсов, для которых будет активироваться функция изоляции. Для него спаунится собственный выделенный процесс визуализации, изолированный от других сайтов. В случае перехода на другие сайты вкладка сменит процесс, а межсайтовые фреймы помещаются в отдельный процесс в качестве «внепроцессных фреймов».
Chrome сохраняет список изолированных сайтов локально на устройстве, и очищает его всякий раз, когда пользователь очищает историю просмотра или другие данные сайта.
Для начальной загрузки в Chrome есть готовый список сайтов, где мобильные пользователи чаще всего вводят пароли.
По большей части изоляция сайта — это архитектурное изменение под капотом, которое не должно повлиять на пользователей или разработчиков. Как и на настольных платформах, Chrome теперь генерирует больше процессов, что связано с компромиссами производительности. С одной стороны, каждый процесс меньше по объёму, быстрее завершается и имеет меньше конфликтов внутри. Но в реальных рабочих нагрузках общая нагрузка на память возрастает. Разработчики сейчас упорно работают, чтобы оптимизировать это поведение.
Установить полную изоляцию для всех сайтов можно вручную в настройке
chrome://flags/#enable-site-per-process
. Это приблизит Chrome для Android к настольному Chrome по уровню оверхеда на оперативную память: от 10% до 13%.Google также предупреждает разработчиков, что из-за изоляции сайтов некоторые хэндлеры
unload
могут работать ненадёжно, а полностраничные макеты страниц не всегда будут синхронными, поскольку фреймы со страницы расползаются по нескольким процессам.