我的网站页面引用了来自第三方 CDN(分析等)的一些 JavaScript 代码。所以我无法控制那里有什么代码——第三方可能随时更改这些脚本,并在这些脚本中引入一些不好的东西——可能是偶然的,也可能是故意的。一旦这些脚本被更改,用户就会开始在他们的浏览器中接收和运行新代码。
这个不受控制的代码会带来什么风险?可能发生的最糟糕的事情是什么?我如何开始管理风险?
我的网站页面引用了来自第三方 CDN(分析等)的一些 JavaScript 代码。所以我无法控制那里有什么代码——第三方可能随时更改这些脚本,并在这些脚本中引入一些不好的东西——可能是偶然的,也可能是故意的。一旦这些脚本被更改,用户就会开始在他们的浏览器中接收和运行新代码。
这个不受控制的代码会带来什么风险?可能发生的最糟糕的事情是什么?我如何开始管理风险?
在最坏的情况下,它可能会使用户完全无法访问网站,它可能会像他们一样执行特定的操作(例如,请求删除帐户、花钱)或者它可能会窃取机密数据。
做不到。如果您在您的网站上运行其他人的 JavaScript,它不会比第三方更安全。你必须自己主持。
但是,您可以更接近目标。
Content-Security-Policy
将标头设置为,的示例设置script-src 'self' www.google-analytics.com;
将阻止执行从您自己的域之外的其他域提供的脚本或www.google-analytics.com
. 这样,如果有人发现一些跨站点脚本漏洞 (XSS) 允许他们将自己的内联 JavaScript 代码添加到您的网站 - 它就不会运行。integrity
您提供给script
标签的参数中。<script src="https://example.com/example-framework.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"/>
您可以在https://www.srihash.org/或使用命令在线生成这些哈希:
openssl dgst -sha384 -binary FILENAME.js | openssl base64 -A
这当然有缺点,例如分析提供商可能会更改他们的脚本,您将不得不更改integrity
参数以保持它们运行。它也是相当新的功能(Chrome 45.0+、Firefox 43+、Opera 32+,目前不支持 IE、Edge 或 Safari),因此您可以将客户端的安全性放在他们自己的软件上。
另请参阅OWASP 的3rd Party Javascript Management Cheat Sheet。
可能发生的最糟糕的事情是什么?
第三方可以做任何你可以用 JavaScript 做的事情——或者任何攻击者可以用 XSS 做的事情。
这包括窃取 cookie、注入 JavaScript 键盘记录器、绕过 CSRF 保护并因此执行您可以执行的任何请求 - 例如添加新的管理员用户 - 或更改网页内容(例如注入广告或进行网络钓鱼攻击)。
我如何开始应对风险?
如果您不信任第三方的意图或安全性,唯一合适的解决方案是自己托管脚本(在确保它只执行您希望它执行的操作之后)。
如果您不想这样做,您可以添加 Subresource Integrity 以在一定程度上降低风险:
您将脚本的哈希添加到包含中,现代浏览器会将哈希与包含文件的哈希进行比较。如果不匹配,则不会执行代码:<script src="https://example.com/script.js" integrity="[hash]" crossorigin="anonymous"></script>
. 这样,您可以确保脚本不会更改。当然,如果确实发生了变化,您需要重新检查脚本并更改哈希,否则您的网站将被破坏。
这个不受控制的代码会带来什么风险?可能发生的最糟糕的事情是什么?
通常,攻击者可以访问您的身份验证方法旨在保护的任何内容。
最坏的情况,假设代码是为您的站点定制的。可以提示用户执行的操作输入安全凭据,从而使攻击者在用户注销很久后就可以访问该用户的帐户。对于银行账户、比特币钱包或其他控制资产访问的网站,攻击者将可以访问不可逆转的高价值行为。如果当时没有价值,但他们获得了访问帐户的凭据,他们可以等到帐户中有足够的价值以使其值得。
我如何开始应对风险?
好:在您自己托管的脚本上设置内容安全策略和子资源完整性。有关这些的更多信息,请参阅@Przemek 的答案。不确定是否需要这样说,但所有 JavaScript 都应该通过 HTTPs 提供;这至少提高了 MITM 对这些资源的成本。
更好:自己托管代码。但是,不要忘记定期更新它。这些供应商发布了他们自己的安全修复程序。不要落后。
最佳:查看所有源代码。大多数时候,您可以找到可以自己阅读的 JS 的未缩小版本(最终只是差异),然后将其缩小并与您网站的其他 JS 捆绑在一起。显然这是很高的成本,请根据您网站的需求适当权衡。
可能发生的最糟糕的事情是什么?
技术术语是任意代码执行。 在这种情况下,“任意”意味着“任何”,就像“任何可以用 JavaScript 编码的东西最终都可能在您的网站上运行”。
是否可以使用 JavaScript 从表单字段中读取值?是的。是否可以使用 JavaScript 从 URL 加载内容?是的。然后,任意代码执行意味着有人可以在用户登录时读取用户的用户名和密码,并将其传输到自己的服务器,编码为 GET 请求中的参数。(这为您的用户登录数据的 HTTPS 加密提供了一个整洁的终端运行,顺便说一句。)
是否可以使用 JavaScript 读取页面上的数据?是的。然后任意代码执行意味着有人可以在访问包含它的页面时读取用户的私人资料数据。(并使用 HTTP 请求将其报告回攻击者的服务器。)
...等等。从网络安全的角度来看,任意代码执行漏洞被认为是最糟糕的事情,因为利用它意味着可以在您的系统上执行任何可能的坏事。