CSP (Content Security Policy) — стандарт защиты сайтов от атак с внедрением контента, например XSS — межсайтового скриптинга. CSP описывает безопасные источники загрузки и блокирует ресурсы, которые не входят в «белый список».
CSP разработал Роберт Хансен в 2004 году. Сначала протокол появился в Firefox 4, а потом и в других популярных браузерах. А в 2012 году он вошел в список рекомендаций World Wide Web Consortium (W3C, Консорциума Всемирной паутины) — группы организаций, которая занимается разработкой стандартов для Всемирной паутины.
Для чего нужен CSP
По политике безопасности в интернете, каждый сайт должен обращаться только к своим данным (same-origin policy). На практике ресурсы постоянно взаимодействуют с другими источниками: социальными сетями, сервисами метрики, сетями доставки контента и т.д. Это используют злоумышленники. Они внедряют вредоносный код в подгружаемую на сайт внешнюю информацию, которую он считает безопасной. Цель CSP — ограничить список ресурсов, откуда может загружаться контент, например изображения для страницы.
Как работает CSP
Стандарт CSP сообщает сайту, какие источники данных заслуживают доверия, а какие — нет. Он работает по принципу «Что не разрешено (не упомянуто), то запрещено». Для этого на страницу добавляется HTTP-заголовок Content-Security-Policy и директивы. Каждая директива представляет собой «белый список», в котором через пробел прописаны источники контента. Администратор может дать доступ целому домену, его отдельным поддоменам или конкретной странице, уточнить допустимые правила взаимодействия с ними.
Основные директивы
- img-src — контролирует использование изображений с внешних ресурсов;
- media-src — управляет загрузкой медиаконтента (видео, анимации, аудио);
- script-src — ограничивает источники рабочих сценариев для веб-страницы;
- frame-src — контролирует подгрузку веб-элементов, вложенных в контекст основной страницы;
- default-src — резервная директива. Когда браузер или другая программа для работы с веб-страницами просматривает код сайта, то сначала анализирует содержание частных директив. Если информации нет, то обращается к резервной директиве. Например, браузер не «увидел» в img-src источники, из которых можно подгружать изображения. Тогда он обращается к default-src и использует указанный там список.
Правила
- none — запрещает использование ресурсов из всех источников, включая домен сайта;
- self — разрешает подгружать ресурсы, размещенные на домене защищаемого сайта.
Для каждой директивы должны быть прописаны значения. При этом правил из одной директивы не влияют на указанные в другой. Например, если на сайте в img-src помечено self, а в default-src — self и адрес http://cdn.example.com, то картинки будут загружаться только с собственного домена сайта.
Кроме источников, в директивах также прописываются правила:
- unsafe-inline — разрешает использование инлайн-стилей (когда стиль указан не в отдельном блоке/файле, а непосредственно в коде) и скриптов style и script, атрибутов CSS style, обработчиков событий (onclick, onmouseover и т.д.) и javascript-ссылок. Если это правило не прописано, все они запрещаются автоматически;
- unsafe-eval — применяется в директиве script-src. Когда этого правила нет, запрещается любая динамическая оценка кода (при выполнении).
Разработчики и системные администраторы, которые еще не решили, стоит ли внедрять CSP на сайтах, могут применять директиву Content-Security-Policy-Report-Only. В этом случае система защиты будет отмечать нарушения безопасности и отправлять CSP-отчеты, но не станет блокировать использование ресурсов даже из потенциально опасных источников.
Пример 1
Ограничение источников контента только исходным сервером (без поддоменов).Content-Security-Policy: default-src 'self'
Можно получать контент с только с доверенного домена и его поддоменов.Content-Security-Policy: default-src 'self' *.trusted.com
Пользователи приложения могут вставлять в контент изображения из любых источников, но при этом загружать аудио- и видеофайлы только от доверенных провайдеров. Скрипты можно получать только с конкретного сервера, который содержит доверенный код.Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
- Изображения будут доступны из любого источника (источник — «*»).
- Прочие медиафайлы — с media1.com и media2.com (без поддоменов).
- Исполняемый код — с userscripts.example.com.
От каких атак защищает CSP
XSS (Cross-Site Scripting) — «межсайтовый скриптинг»
На страницу сайта внедряется вредоносный код, связанный с сервером злоумышленника. Браузер доверяет источнику контента и выполняет директивы.
Как защищает CSP: администраторы сервера, на котором расположен сайт, могут составить «белый список» доменов, заслуживающих доверия. Так можно сократить или полностью исключить обращение к источникам потенциально вредоносного скрипта. Радикальный вариант защиты — глобальный запрет на исполнение скриптов.
Перехват пакетов
Это извлечение конкретных данных из общего потока информации между сайтом и компьютером пользователя. Используется вредоносный код, внедренный в протоколы передачи данных. Могут быть перехвачены и похищены сетевые пароли, номера банковских карт или телефонные номера, указанные при оформлении заказов.
Как защищает CSP: сервер может указать, какие протоколы разрешено использовать. Стратегия безопасности передачи данных отмечает файлы cookie атрибутами secure и автоматически перенаправляет со страниц HTTP на их аналоги HTTPS. Сайты также могут использовать HTTP-заголовок Strict-Transport-Security, чтобы браузеры подключались по зашифрованному каналу. От перехвата пакетов это не защитит, но поможет избежать расшифровки.
Типы потенциально опасного содержимого
Скрипты
Это последовательности действий (сценарии), написанные на JavaScript, PHP, Perl, Python или другом скриптовом языке программирования. Скрипты описывают автоматические действия, которые будет выполнять функциональный элемент сайта — например форма оплаты или обратной связи.
Изображения
Хотя картинка (фото, баннер и т.д.) представляет собой набор пикселей, файл с ней размещается и отображается на сайте с помощью скрипта. Именно в сценарий, по которому работает изображение, злоумышленник может вставить вредоносный код.
Стили
Это описания внешнего вида страницы и ее элементов (надписей, кнопок, подсветок и т.д.) на языке CSS. Внедрив вредоносный код в стили, злоумышленник может нарушить отображение сайта или использовать стили для доступа к другой секретной информации — например паролям пользователей.
Медиа
Это анимированные изображения, видеоролики, аудиофайлы. Опасность исходит не от содержимого, а от скриптов и стилей, которые их описывают и заставляют работать на сайте.
Шрифты
С их помощью отображаются статьи, заголовки и другие текстовые элементы на сайте. Шрифт — текстовый файл, поэтому может являться непосредственным источником опасности. Другой вариант — использование описывающего его стиля как носителя вредоносного кода.
Объекты
Это видеофайлы или плагины, расширения, счетчики метрики и т.д. В зависимости от типа объекта источником опасности может быть код или описывающие его скрипты и стили.
Фреймы
Тегами frame и iframe описываются встраивания одних веб-страниц в контекст других. Например, с их помощью отображаются интерактивные карты с адресом компании в разделе «Контакты» на сайтах. Источник опасности — вложенный в основную страницу веб-документ или объект.
Манифесты
Это веб-приложения, которые пользователь может установить на экран гаджета или десктоп ПК. Они объединяют в себе признаки традиционного сайта и нативного ПО. Источник опасности — как код самого манифеста, так и используемые им сторонние ресурсы.
Уязвимости CSP
Несмотря на настройки, CSP можно обойти. Количество «лазеек» зависит от его поддержки браузерами. Например, Internet Explorer использует стандарт частично. В меньшем количестве уязвимости есть в браузерах вроде Google Chrome, Opera, Safari.
JavaScript внутри фрейма
Когда текстовый документ или изображение открываются на любом сайте, они автоматически преобразуются в HTML-страницу с помощью iframe. Внутри него можно прописать вредоносный код. Так как такие автоматически созданные веб-документы не имеют настроенного CSP, браузер выполнит прописанный код без ограничений.
Отсутствие CSP в ошибках сервера
Разработчики часто защищают только рабочие страницы. Если злоумышленник пропишет в фрейме страницы с ошибкой 404 (или другой с кодом 4**) свой скрипт, то сможет похитить данные.
Подгрузка скриптов с файлообменников
Некоторые сайты используют облачные хранилища данных (Яндекс.Диск, Google Drive и т.д.) как источники контента. В этом случае злоумышленник может разместить на виртуальном диске вредоносный файл или скрипт, который будет исполняться системой.
Большинство уязвимостей CSP связано не с его недостатками, а с неправильным использованием разработчиками. Корректное внедрение стандарта на сайте позволяет защитить ресурс и данные пользователей.
0 комментариев