Исследователи обходят защиту Content Security Policy с помощью инъекций HTML, CSS и манипуляции кешем браузера

information security

В последнем исследовании специалисты по информационной безопасности продемонстрировали, как можно обойти защиту, основанную на nonce (одноразовом коде), в Content Security Policy (CSP), использовав комбинацию инъекций HTML, утечек nonce через CSS и манипуляцию кешем браузера. Этот прорыв ставит под сомнение надежность nonce-based CSP, которую ранее считали одной из самых эффективных защит от XSS-атак.

Исследование фокусировалось на веб-приложении с минимальным функционалом: формой входа и личным кабинетом. Последний был защищен nonce-based CSP - механизмом, который генерирует уникальный одноразовый код для каждого загрузки страницы. Этот nonce встраивается как в заголовок CSP, так и в тег "<script>", что, по идее, должно гарантировать выполнение только доверенных скриптов. Однако разработчики допустили критическую ошибку, вставив пользовательский ввод на страницу через ".innerHTML" без должной санитизации. CSP должен был блокировать любые инъекции, но исследователи нашли способ обойти эту защиту.

Первым шагом стала утечка nonce через инъекцию CSS. Уязвимость заключалась в том, что CSP не ограничивал использование тегов "<style>" и внешних таблиц стилей. Специально сконструированные CSS-селекторы позволили извлечь nonce из "<meta>"-тега, где хранилась политика безопасности. Методика включала использование атрибутных селекторов и запросов к фоновым изображениям, чтобы передать nonce серверу по частям, после чего собрать его воедино.

Следующим этапом стало использование механизмов кеширования браузера, в частности back/forward cache (bfcache) и disk cache. Получив nonce, злоумышленник мог внедрить вредоносный скрипт, но для его выполнения требовалось, чтобы nonce оставался актуальным. Исследователи обошли это ограничение, манипулируя историей навигации и ключами кеша. Через параметры запроса они заставляли браузер загружать старую версию страницы (с известным nonce) из disk cache, параллельно обновляя данные пользователя (например, профиль) через CSRF-атаку. В результате страница содержала старый nonce, но динамические данные (включая вредоносный скрипт) загружались свежими, что позволяло обойти защиту CSP.

DevTools показывает, что CSS применен, но на вкладке «Сеть» нет запроса

Это исследование имеет серьезные последствия для веб-безопасности. Оно показывает, что даже правильно настроенный nonce-based CSP может быть взломан, если nonce можно увести через HTML или CSS-инъекцию, а также если злоумышленник способен манипулировать кешем браузера. Кроме того, приложения, допускающие динамическое обновление контента (например, через Fetch или AJAX), но не синхронизирующие его с жизненным циклом nonce, остаются уязвимыми.

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

Комментарии: 0