Как я могу убедиться, что мои файлы JavaScript, доставленные по CDN, не изменены?

Я работаю над сценарием, в котором некоторые файлы JavaScript должны размещаться на CDN. Я хочу иметь некоторый механизм, чтобы, когда этот файл загружается с пользовательской стороны, я могу гарантировать, что файлы не были подделаны и действительно поступают из указанного CDN.

Я понимаю, что задача очень проста, если я использую SSL, но все же хочу убедиться, что правильные файлы обслуживаются даже по HTTP без SSL.

Насколько я мог искать, не существует существующего механизма, такого как цифровая подпись для файлов JavaScript, который поддерживается на разных платформах. Возможно, это не нужно?

Есть ли какой-либо метод, встроенный в браузеры для проверки автора файлов JavaScript? Могу ли я сделать это безопасным способом?

Ответ 1

По сути, такая функция в настоящее время разрабатывается под названием Integrity Subresource. Посмотрите на атрибут integrity тега <script>. Пока он еще не полностью принят по всем направлениям, он выполняет именно эту цель.

integrity

Содержит встроенные метаданные, которые пользовательский агент может использовать для проверки того, что извлеченный ресурс был доставлен без неожиданных манипуляций. См. Целостность Subresource.

Источник

Целостность Subresource (SRI) - это функция безопасности, которая позволяет браузерам проверять, что файлы, которые они извлекают (например, из CDN), поставляются без неожиданных манипуляций. Он работает, позволяя вам предоставлять криптографический хеш, который должен соответствовать выбранный файл.

Source


Пример:

<script src="https://example.com/example-framework.js"
    integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
    crossorigin="anonymous"></script>

Обратите внимание, что этот не защитит вас от Man in the Middle attack, если вы передаете свои ресурсы через простой HTTP. В этом случае хэш-код может быть подделан злоумышленником, что делает защиту от манипулируемых файлов script бесполезным.

По этой причине вы должны всегда использовать безопасные HTTPS-соединения вместо простого HTTP в дополнение к описанным выше мерам безопасности.

Ответ 2

Вы ищете проверку целостности подресурсов.

Например, здесь фрагмент jQuery CDN:

<script src="https://code.jquery.com/jquery-3.1.0.js"
        integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
        crossorigin="anonymous"></script>

Ответ 3

Отказ от ответственности. Как всегда, вы должны учитывать, что эти механизмы могут быть использованы при использовании https, поскольку их можно легко отключить с помощью MitM с помощью http

В дополнение к механизму в вышеприведенных ответах вы также можете использовать заголовки ответов content-security policy http на родительской странице.

http://www.html5rocks.com/en/tutorials/security/content-security-policy/

Content-Security-Policy: script -src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='

Здесь есть несколько вещей. Префикс sha * - определяет алгоритм, используемый для генерации хэша. В приведенном выше примере используется sha256-. CSP также поддерживает sha384- и sha512-. При генерации хэша не включают теги. Также используется капитализация и пробел, включая начальные или конечные пробелы.

Используя Chrome 40 или более позднюю версию, вы можете открыть DevTools, а затем перезагрузить страницу. Вкладка "Консоль" будет содержать сообщения об ошибках с правильным хэшем sha256 для каждого из ваших встроенных скриптов.

Этот механизм существует довольно давно, поэтому поддержка браузера, скорее всего, довольно хорошая, просто обязательно проверьте.

Кроме того, если вы хотите, чтобы старые несовместимые браузеры были небезопасными, вы можете включить синхронный переадресацию script в верхней части страницы, которая не разрешена политикой.

Ответ 4

Там важно, что такое подписание может и не может сделать. Он может защитить пользователя от гипотетических атак, в которых кто-то модифицирует ваш код. Он не может гарантировать ваш сайт, что ваш код является исполняемым кодом. Другими словами, вы по-прежнему не можете доверять чему-либо, что приходит на ваш сайт с клиента.

Ответ 5

Если ваша модель противника позволяет злоумышленнику изменять файлы JavaScript по мере их доставки из CDN, то ваша модель противника позволяет злоумышленнику изменять источник ссылок, поскольку он доставляется, чтобы удалить любую попытку проверки, изменить исходный адрес кроме CDN, и/или полностью удалить ссылку на JavaScript.

И позволяет не открывать банку червей о том, как ваше приложение может определить, является ли пользовательский преобразователь неправильным решением для CDN через HTTP-запросы (или любой другой механизм, который не имеет проверенной цепи доверия).

/и т.д./хостов:

#  ...
1.2.3.4    vile-pirates.org    trustworthy.cdn
#  ...

Ответ 6

Вы можете обеспечить это с помощью Subresource Integrity. Многие общедоступные CDN включают в себя встраиваемый код, предлагаемый на веб-сайтах CDN. Например, в PageCDN, когда вы щелкаете файл jquery на странице jQuery CDN, вы получаете возможность скопировать URL-адрес или использовать тег сценария, содержащий хэш SRI, как показано ниже:

<script src="https://pagecdn.io/lib/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>

При загрузке страницы браузер отправляет запрос на этот ресурс, и по завершении запроса он сопоставляет хэш полученного файла с хэшем, указанным в качестве значения целостности в теге скрипта. Если оба хэша не совпадают, браузер отклонит файл jquery.

На данный момент эта функция поддерживается 91% браузеров по всему миру. Подробнее о caniuse.