2016-08-01 3 views
85

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

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

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

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

+12

В то время как я нахожу этот вопрос интересным, разве это не вне темы? – evolutionxbox

+19

Почему вы будете обслуживать файлы на http? – njzk2

+12

«Но почему такого механизма нет?» Потому что это очень тяжело. Как только ваши данные покинут ваш сервер, это тост. HTTPS помогает, но если это простое HTTP-соединение, любая проверка может завершиться неудачно (или скорее - передать). Атака MITM может просто изменить вашу ожидаемую подпись и/или подпись того, что вы предоставили, прежде чем браузер получит ожидания. Таким образом, когда пользователь получает какую-то полезную нагрузку, он будет считаться полностью безопасным ... когда это не обязательно. – vlaz

ответ

33

Вы ищете subresource integrity чеков.

Например, вот JQuery CDN сниппет:

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

Абсолютно бесполезно, потому что злоумышленник может изменить поле целостности одновременно с изменением загружаемого скрипта. –

+13

@LightnessRacesinOrbit: Нет, если вы контролируете свой собственный домен, доступ к которому осуществляется через HTTPS но не управляйте 'code.jquery.com'.Это может защитить вас от взломанного' code.jquery.com'. – SilverlightFox

+2

@SilverlightFox: Хорошо, абсолютно бесполезно против атак MITM * –

135

В самом деле, особенность, как это currently being drafted под названием Subresource Integrity. Посмотрите на атрибут integrity тега <script>.While not yet fully adopted across the board, он выполняет именно эту цель.

integrity

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

Source

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

Source


Пример:

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

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

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

+9

Я думаю, стоит упомянуть, что проверка целостности может легко быть подделанным, предполагая, что OP планирует отправить свой HTML в HTTP, а также их файлы активов. Если их сайт HTTPS и они хотят обслуживать активы через HTTP, большинству браузеров это не понравится и молча игнорирует активы HTTP. – MonkeyZeus

+3

@MonkeyZeus Это было бы правдой, хотя в случае атаки MITM или если наш собственный сервер взломан, правильно? Мое понимание - это t Вопрос в явном виде спрашивает, как защищаться от скомпрометированного CDN. – Timo

+10

@TimoSta Точно! Без этих проверок, если вы включаете скрипт из, например, 'https: // code.jquery.com /', то любой, кто компрометирует 'code.jquery.com', может XSS на вашем сайте, независимо от того, 'code.jquery.com' обращается через HTTPS. При этих проверках злоумышленник может предотвратить загрузку скриптов, а не заменять их вредоносными. – Ajedi32

5

Отказ от ответственности: Как всегда, вы должны рассматривать только эти механизмы любого использования при использовании протокола HTTPS, так как они легко могут быть отключены через MiTM с HTTP

В дополнении к механизму в вышеуказанных ответах, вы также можете использовать политику защиты контента HTTP-заголовков на родительской странице.

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

Content-Security-Policy: скрипт-Src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='

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

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

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

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

+0

существует уже довольно давно, но поддержка браузера не очень хороша. http://caniuse.com/subresource-integrity – Sp0T

+0

@ Sp0t - целостность Subresource (о чем идет речь) является механизмом в других ответах. Мой ответ касается политики безопасности контента, которая имеет гораздо лучшую поддержку. –

2

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

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

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

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

Первое предложение явно неверно. Что делать, если ссылочная страница загружается через HTTPS, а файл JavaScript загружается через HTTP-not-S? – immibis

+0

Или что, если сам CDN взломан, но не ваш собственный сервер? – Ajedi32

+0

@immibis: Я решил предположить, что OP не настолько иррациональен, чтобы предлагать такой сценарий. –

3

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

 Смежные вопросы

  • Нет связанных вопросов^_^