Как правильно загрузить скрипт с помощью строгой динамической директивы CSP? - PullRequest
0 голосов
/ 25 июня 2018

Фон

Идея Политики безопасности контента заключалась в том, чтобы сообщать веб-браузерам, какой контент откуда загружать. Это означает, что злоумышленники не должны иметь возможность вводить свой собственный код, если, например, 'unsafe-inline' явно не разрешено (что не является лучшим решением).

Google также выпустила CSP Evaluator , который предназначен для поиска возможных ошибок в вашей политике. При настройках по умолчанию инструмент рекомендует использовать политику 'strict-dynamic' для 'script-src'. Идея заключается в том, что вы пишете загрузчик для любых источников JavaScript, которые вам требуются, и запрещаете все остальное.

Проблема

Что считается «правильным» способом реализации такого загрузчика? Нужно ли писать загрузчик самостоятельно (см., Например, ниже) или следует использовать инструмент для создания такого загрузчика? (обратите внимание, что этот вопрос не требует конкретной рекомендации инструмента)

Пример

var imported = document.createElement('script');
imported.src = '/path/to/imported/script';
document.head.appendChild(imported);

Контекст

Мой веб-сайт в настоящее время имеет следующую политику:

default-src 'none';
img-src 'self';
style-src 'self' https://stackpath.bootstrapcdn.com 'sha256-bviLPwiqrYk7TOtr5i2eb7I5exfGcGEvVuxmITyg//c=';
script-src https://use.fontawesome.com https://code.jquery.com https://cdnjs.cloudflare.com https://stackpath.bootstrapcdn.com;
base-uri 'none';
form-action 'none';
frame-ancestors 'none';

Инструмент Google предложил следующее:

Белый список хостов часто можно обойти. Попробуйте использовать 'strict-dynamic' в сочетании с одноразовыми номерами или хэшами CSP.

Поэтому я хочу реализовать загрузчик для загрузки этих JS-структур и узнать, как лучше всего подойти к этой проблеме.

1 Ответ

0 голосов
/ 26 июня 2018

Непосредственный ответ заключается в том, что, пока скрипт, который вы динамически загружаете (/path/to/imported/script), размещается в домене, который вы уже занесены в белый список в script-src, вам не нужно изменять CSP или изменятьваш загрузчик - все будет работать как положено.

Однако более широкая проблема состоит в том, что ваш белый список script-src включает в себя домены, на которых размещен Javascript, который может быть использован злоумышленником, который обнаружит ошибку внедрения разметки в вашем приложении дляобойти свой CSP.Например, https://cdnjs.cloudflare.com хостов Angular (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.2/angular.min.js), который может использоваться злоумышленником для преобразования HTML-инъекции в выполнение произвольного скрипта ( здесь - статья об этом).

В инструменте CSP Evaluator предлагается переключить ваше приложение на использование script-src, которое использует одноразовые номера CSP вместо белого списка.Для этого вам нужно будет следовать процессу, описанному в https://csp.withgoogle.com/docs/strict-csp.html - в основном, убедитесь, что каждый элемент <script> имеет правильный атрибут nonce, который изменяется для каждой загрузки страницы, или вместо этого используйте CSP3 хеширует для статических скриптов.

Ваш CSP будет выглядеть следующим образом:

... script-src 'nonce-[random-value]' 'strict-dynamic' 'unsafe-inline' https:; ...

Если вы используете 'strict-dynamic', ваш загрузчик скриптов не имеетизменить, потому что браузеры будут автоматически доверять сценариям, добавленным на вашу страницу через программные API, такие как appendChild().

...