Как сохранить надежность внешних ресурсов

Вчера некоторые части jquery.com были ненадолго повреждены.

Официального заявления о том, как злоумышленники получили доступ, пока не поступало, и хотя, похоже, он был ограничен настройкой jQuery Wordpress, некоторые люди выразили обеспокоенность по поводу целостности общедоступного файла jQuery на code.jquery.com.

Учитывая, что jQuery и сторонний код JavaScript в целом в наши дни довольно популярны, эти опасения имеют законное основание, поскольку успешная атака на этот конкретный файл может привести к катастрофе. Только на этой неделе атака именно такого типа была нацелена на Coinhive.

Что приводит нас к ....

Целостность субресурсов

SRI существует примерно с 2014 года, и хотя он до сих пор не получил широкого распространения, это в некоторой степени идеальное решение, позволяющее в первую очередь избежать проблем такого рода и гарантировать, что включенный (статический) сторонний контент не был подделан.

Концепция SRI довольно проста: всякий раз, когда ресурс включается на страницу через <script> или <link>, этот тег также указывает криптографический хэш ресурса. Когда клиент затем сталкивается с ним, вместо того, чтобы сразу запускать его, он сначала проверяет достоверность хэша, вычисляя его сам и сравнивая два значения. Только если есть совпадение, оно будет продолжаться как обычно. В противном случае он будет считать, что файл был изменен, и удалит его.

С технической точки зрения для тега ресурса требуются два дополнительных HTML-атрибута: crossorigin и integrity. Первый включает CORS (необходимое условие для SRI при загрузке ресурсов независимого происхождения), второй содержит фактическое хеш-значение (или значения, разделенные пробелами) в кодировке base64 с префиксом соответствующего алгоритм хеширования (в настоящее время SHA с 256, 384 или 512 битами). В следующих примерах будут использоваться исключительно хэши SHA-512.

Для рассматриваемого сценария (минимизированный jQuery 3.2.1) будет применима следующая разметка.

<script src="https://code.jquery.com/jquery-3.2.1.min.js"
        integrity="sha512-3P8rXCuGJdNZOnUx/03c1jOTnMn3rP63nBip5gOP2qmUh5YAdVAvFZ1E+QLZZbC1rtMrQb+mah3AfYW11RUrWA=="
        crossorigin="anonymous">
</script>

Здесь мы включаем общедоступный файл jQuery, как обычно, но дополнительно указываем атрибут integrity, а вместе с ним и хэш файла SHA-512. Если этот файл теперь будет изменен по какой-либо причине, хэш, вычисленный браузером, больше не будет совпадать, и браузер откажется запускать файл.

Поддержка браузера

На момент написания статьи SRI полностью поддерживается Firefox и Chrome (и их оболочками), частично поддерживается Safari и поставляется с предварительной поддержкой в ​​Edge.

Вычисление хеша

Среди онлайн-калькуляторов был бы srihash.org, но его также легко рассчитать локально. Оба этих набора команд прекрасно работают в вашей локальной оболочке Unix.

openssl dgst -sha512 -binary /PATH/TO/FILE | openssl base64 -A

or

sha512sum -b /PATH/TO/FILE | xxd -r -p | base64 -w 0

Только не забудьте добавить к хэшу префикс выбранного алгоритма, здесь sha512-.