Frontend Security Thoughts After the Bybit Incident


事件背景

在加密货币投资圈中,全球前五大交易所 bybit 发生了一起令人闻风色变的骇客事件

Bybit 虽遭骇 15 亿美元创下史上最大加密窃案,但平台仍稳定营运,用户资产也可正常提领,并未破产。

此次攻击被追溯至北韩骇客组织 Lazarus,手法精密、渗透前端开发,让多签钱包在毫不知情下完成转帐。

真实原因

骇客劫持并入侵了该公司员工的 AWS 环境,给前端代码的某一个 chunk 中植入了暗门

思考

排除本次的 AWS 入侵事件,关于类似的 XSS 脚本注入攻击我们该如何防止呢?

可能大家耳熟能祥的 CSP 内容安全策略等可以作为控制依据:

当然我们可以给一些特殊的脚本添加 noncescriptlink

例如:

<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 的挂马事件,直接修改了 vconsolecdn 脚本,在 PC 端的浏览器上开发并不会触发,但是在特定的 ua 下就会触发脚本重定向,进而影响我们的主站功能。