CSP: Политика безопасности контента
Что такое CSP (Content Security Policy)
CSP — это механизм безопасности браузера, цель которого смягчение последствий XSS и некоторых других атак. Он работает ограничивая ресурсы (такие, как сценарии и изображения), которые может загружать страница, и ограничивая возможности обрамления страницы другими страницами.
Для включения CSP, ответ должен включать HTTP ответ с заголовком Content-Security-Policy
со значением содержащим политику. Сама политика состоит из одной или нескольких директив, разделённых точкой с запятой.
Защита от XSS атак с помощью CSP
Следующая директива позволит загружать скрипты только из того же источника, что и сама страница:
script-src 'self'
Следующая директива разрешает загрузку скриптов только из определённого домена:
script-src https://scripts.normal-website.com
Следует соблюдать осторожность при разрешении сценариев из внешних доменов. Если у злоумышленника есть какой-либо способ контролировать контент, обслуживаемый из внешнего домена, он может провести атаку. Например, сетям доставки контента (CDN), которые не использую отдельные адреса для каждого клиента, такие как ajax.googleapis.com
, нельзя доверять, поскольку третьи стороны могут получить контент на свои домены.
Помимо внесения в белый список определённых доменов, политика безопасности контента (CSP) также предоставляет два других способа указания доверенных ресурсов: одноразовые номера и хэши:
- Директива CSP может указывать одноразовый номер (случайное значение), и это же значение должно использоваться в теге, загружающем скрипт. Если значения не совпадают, скрипт не будет выполняться. Для эффективного контроля, одноразовый номер должен безопасно генерироваться при каждой загрузке страницы и не должен угадываться злоумышленником.
- Директива CSP может указывать хэш содержимого доверенного скрипта. Если хэш фактического скрипта не соответствует значению указанному в директиве, то он не будет выполняться. Если содержимое скрипта когда-нибудь изменится, вам конечно же, потребуется обновить хэш-значение, указанное в директиве.
CSP довольно часто блокирует такие ресурсы, как script
. Однако многие CSP разрешают запросы изображений. Это означает, что вы можете использовать элементы img
для выполнения запросов к внешним серверам, например для раскрытия токена CSRF.
Some browsers, such as Chrome, have built-in dangling markup mitigation that will block requests containing certain characters, such as raw, unencoded new lines or angle brackets.
Некоторые браузеры, такие как Chrome, имеют встроенное средство устранения висячей разметки, которое блокирует запросы, содержащие определённые символы, такие как необработанные, незакодированные новые строки или угловые скобки.
Некоторые политики более строгие и запрещают все формы внешних запросов. Однако всё ещё можно обойти эти ограничения, вызвав некоторое взаимодействие с пользователем. Для обхода этой формы политики, нужно внедрить HTML элемент, который при клике будет сохранять и отправлять всё, что содержится во внедрённом элементе, на внешний сервер.
Противодействие атакам с висячей разметкой с помощью CSP
Следующая директива позволит загружать изображения только из того же источника, что и сама страница:
img-src 'self'
Следующая директива позволяет загрузку изображений только из определённого домена:
img-src https://images.normal-website.com
Обратите внимание, что эти политики предотвратят некоторые эксплойты с висячей разметкой, потому что простой способ сбора данных без взаимодействия с пользователем — использование тега img
. Однако это не защитит от других эксплойтов, таких, как внедрение тега ссылки с разорванным атрибутом href
.
Обход CSP с внедрением политик
Вы можете столкнуться с веб-сайтом, отражающим ввод в фактическую политику, скорее всего, в директиве report-uri
. Если сайт отражает параметр, которым вы можете управлять, вы можете ввести точку с запятой, чтобы добавить собственные директивы CSP. Обычно директива report-uri
завершает список директив. Это означает, что вам нужно перезаписать существующие директивы, для использования этой уязвимости и обхода политики.
Обычно невозможно перезаписать существующую директиву script-src
. Однако недавно в Chrome появилась директива script-src-elem
, которая позволяет управлять элементами скрипта, но не событиями. Важно отметить, что эта новая директива позволяет перезаписывать существующие директивы script-src
.
Защита от кликджекинга с помощью CSP
Следующая директива позволит размещать страницу в фрейм только другими страницами из того же источника:
frame-ancestors 'self'
Следующая директива полностью предотвратит размещение страницы в фрейме:
frame-ancestors 'none'
Использование политики безопасности контента для предотвращения кликджекинга более гибко, чем использование заголовка X-Frame-Options
, поскольку вы можете указать несколько доменов и использовать подстановочные знаки. Например:
frame-ancestors 'self' https://normal-website.com https://*.robust-website.com
CSP также проверяет каждый фрейм в иерархии родительских фреймов, тогда как X-Frame-Options
проверяет только фрейм верхнего уровня.
Рекомендуется использовать CSP для защиты от кликджекинга. Вы также можете комбинировать это с заголовком X-Frame-Options
, для обеспечения защиты в старых браузерах, которые не поддерживают CSP, таких, как Internet Explorer.
Дополнительные материалы
- XSS: Межсайтовые сценарии
- SOP: Что такое Same-origin policy
- CSRF: Подделка межсайтовых запросов
- CSRF: Как предотвратить уязвимость