(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), которые не используют отдельные URL для каждого клиента, таким как ajax.googleapis.com, не стоит доверять, поскольку третьи стороны могут разместить контент на их доменах.

Помимо белых списков конкретных доменов, CSP также предоставляет два других способа указания доверенных ресурсов: одноразовые значения (nonces) и хэши:

  • Директива CSP может указывать nonce (случайное значение), и то же значение должно быть использовано в теге, который загружает скрипт. Если значения не совпадают, скрипт не выполнится. Чтобы быть эффективной мерой, nonce должен безопасно генерироваться при каждой загрузке страницы и быть непредсказуемым для атакующего.

  • Директива CSP может указывать хэш содержимого доверенного скрипта. Если хэш фактического скрипта не совпадает со значением, указанным в директиве, скрипт не выполнится. Если содержимое скрипта когда-либо изменится, то, разумеется, вам нужно будет обновить значение хэша в директиве.

Довольно часто CSP блокирует ресурсы вроде script. Однако многие политики CSP позволяют запросы изображений. Это означает, что вы часто можете использовать элементы img для выполнения запросов на внешние серверы, например, чтобы раскрывать CSRF‑токены.

Некоторые браузеры, такие как Chrome, имеют встроенную митигацию «висящей разметки» (dangling markup), которая будет блокировать запросы, содержащие определённые символы, такие как некодированные переводы строк или угловые скобки.

Некоторые политики более строгие и предотвращают все формы внешних запросов. Тем не менее всё ещё возможно обойти эти ограничения, вызвав некоторое взаимодействие пользователя. Чтобы обойти такой тип политики, вам нужно инъектировать HTML‑элемент, который при клике сохранит и отправит всё, что заключено в инъектированный элемент, на внешний сервер.

Снижение риска атак «висящей разметкой» с помощью CSP

Следующая директива позволит загружать изображения только с того же источника, что и сама страница:

Следующая директива позволит загружать изображения только с конкретного домена:

Обратите внимание, что эти политики предотвратят некоторые эксплойты «висящей разметкой», поскольку простой способ захвата данных без взаимодействия с пользователем — это использование тега img. Однако это не предотвратит другие эксплойты, такие как инъекции тега anchor с «висящим» атрибутом href.

Обход CSP с помощью инъекции политики

Вы можете столкнуться с веб‑сайтом, который отражает ввод непосредственно в саму политику, чаще всего в директиве report-uri. Если сайт отражает параметр, который вы можете контролировать, вы можете внедрить точку с запятой, чтобы добавить собственные директивы CSP. Обычно директива report-uri является последней в списке. Это означает, что вам потребуется перезаписать существующие директивы, чтобы эксплуатировать эту уязвимость и обойти политику.

Как правило, перезаписать существующую директиву script-src невозможно. Однако недавно Chrome представил директиву script-src-elem, которая позволяет контролировать элементы script, но не события. Критически важно, что эта новая директива позволяет перезаписывать существующие директивы script-src. Используя это знание, вы сможете решить следующую лабораторную.

Защита от кликджекинга с помощью CSP

Следующая директива позволит встраивать страницу во фреймы только со страниц того же источника:

Следующая директива полностью запретит встраивание во фреймы:

Использование CSP для предотвращения кликджекинга более гибко, чем использование заголовка X-Frame-Options, потому что вы можете указать несколько доменов и использовать подстановочные шаблоны (wildcards). Например:

Кроме того, CSP проверяет каждый фрейм в иерархии родительских фреймов, тогда как X-Frame-Options проверяет только фрейм верхнего уровня.

Рекомендуется использовать CSP для защиты от кликджекинга. Вы также можете комбинировать его с заголовком X-Frame-Options, чтобы обеспечить защиту в старых браузерах, которые не поддерживают CSP, таких как Internet Explorer.

Last updated