Как сохранить надежность внешних ресурсов
Вчера некоторые части 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-
.