CSP: Политика безопасности контента

Источник: «Content security policy»
В этой статье мы объясним, что такое политика безопасности контента, и опишем как использовать 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 довольно часто блокирует такие ресурсы, как 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.

Дополнительные материалы

Дополнительные материалы

Предыдущая Статья

Eloquent: Примеры трейтов в Моделях

Следующая Статья

Что такое CORS (Cross-origin resource sharing)