在加密货币投资圈中,全球前五大交易所 bybit 发生了一起令人闻风色变的骇客事件。
Bybit 虽遭骇 15 亿美元创下史上最大加密窃案,但平台仍稳定营运,用户资产也可正常提领,并未破产。
此次攻击被追溯至北韩骇客组织 Lazarus,手法精密、渗透前端开发,让多签钱包在毫不知情下完成转帐。
骇客劫持并入侵了该公司员工的 AWS 环境,给前端代码的某一个 chunk 中植入了暗门。
排除本次的 AWS 入侵事件,关于类似的 XSS 脚本注入攻击我们该如何防止呢?
可能大家耳熟能祥的 CSP 内容安全策略等可以作为控制依据:
Response Header 中添加 Content-Security-Policy: default-src 'self'; img-src 'self' example.comhtml meta 标签也可以控制 <meta http-equiv="Content-Security-Policy" content="default-src 'self'">当然我们可以给一些特殊的脚本添加 nonce 给 script 和 link
例如:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src nonce-sha384-cvuhcu889">
<script nonce="sha384-cvuhcu889"></script>那么此次的安防和以上有关系吗?没多大关系,但是跟另外一个概念有关系 - SRI
Subresource Integrity子资源完整性(SRI) 是一项安全功能,它使浏览器能够验证其获取的资源(例如,从CDN获取的资源)是否已正确交付,且没有出现任何意外操作。它的工作原理是允许您提供获取的资源必须匹配的加密哈希值。
以上解释来自于 MDN
举个例子:
我们写一个测试的 html
<script src="./test.js" integrity="sha384-OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb"></script>❯ shasum -b -a 384 test.js | awk '{ print $1 }' | xxd -r -p | base64
OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb

如果此时我们更改了 test.js 中的内容但是并不调整 script 标签的 integrity 会发生什么呢?

可以看到资源加载被阻止了。
相信你应该理解文章的标题了,抛开 AWS Token 泄漏问题,单从防御 script 脚本的加载角度出发,可以借助 SRI 机制防御一些常见的攻击。
例如去年我们还碰到过 bootcss.cdn 的挂马事件,直接修改了 vconsole 的 cdn 脚本,在 PC 端的浏览器上开发并不会触发,但是在特定的 ua 下就会触发脚本重定向,进而影响我们的主站功能。