一些天前我们注意到 IOTA 暂停了主网,虽然早前我们也知道 IOTA 用户遭遇了盗币攻击,但没想到 IOTA 官方会通过暂停主网方式来进行这次盗币攻击的阻拦与调查,看来问题很严重。随后,2020/02/19,我们深入分析了官方披露在 status.iota.org 上的一些线索,开始独立调查这次严重安全事故的具体原因。
通过对 IOTA 官方钱包 Trinity 新版本发布的分析,我们在其 GitHub 上进行了版本比对,注意到了 MoonPay 这个第三方组件被移除,且我们注意到 Trinitiy 桌面钱包是基于 Electron 开发的,安全经验告诉我们,这可能是个大坑,于是,我们 2020/02/19 时发布了一些推测:
慢雾:IOTA 用户 Trinity 钱包被盗币攻击推测
IOTA 因为近期不少用户的 Trinity 钱包被盗币攻击,为了阻止攻击继续、调查与修复具体原因,主网协调器都暂停运行了。这是一个被低估的经典攻击,官方没披露具体攻击细节,但通过我们的分析,可以做出某些重要推测,首先可以明确的几个点:
不是 IOTA 区块链协议的问题,是 IOTA 的 Trinity 桌面钱包的问题(官方说的,且先相信)
这款桌面钱包基于 Electron(一个使用 JavaScript 为核心构建桌面应用的框架),意味着核心代码是 JavaScript 写的
在做该做钱包新旧版本代码的 diff 分析时,发现去除了之前内置的一个交易所功能模块 MoonPay,这其中关键点是去掉了一段可怕的代码:
const script = document.createElement(‘script’);
script.src = ‘https://cdn.moonpay.io/moonpay-sdk.js’;
document.write(script.outerHTML);
如果这个第三方 JavaScript 链接主动或被黑作恶,那该桌面版钱包就可以认为是完全沦陷了。到这,我们很有理由相信这是个很大的定时炸弹,如果这个定时炸弹是真的炸了,那很吻合官方的一些说辞与解释,如:尽快升级新版本的 Trinity 桌面钱包,尽快改密码,尽快转移资产到安全种子里等等。且看官方的后续披露。
今天(2020/02/22),我们注意到了官方披露了一些细节,基本验证了我们的推测。
https://blog.iota.org/trinity-attack-incident-part-1-summary-and-next-steps-8c7ccc4d81e8
重点关注下这段:
The attacker started on November 27th, 2019 with a DNS-interception Proof of Concept that used a Cloudflare API key to rewrite the api.moonpay.io endpoints, capturing all data going to api.moonpay.io for potential analysis or exfiltration. Another longer-running Proof of Concept was evaluated by the attacker one month later, on December 22nd, 2019. On January 25th, 2020, the active attack on Trinity began, where the attacker started shipping illicit code via Moonpay’s DNS provider at Cloudflare.
攻击者利用 MoonPay 的 Cloudflare API Key 完成了后续一系列劫持攻击,预估被盗的 IOTA 达 8.55 Ti(8550000 枚 MIOTA,MIOTA 现在是交易所默认最小交易单元,当前价格 0.267 美金/MIOTA)。根据我们历史经验,如果 Web 服务方使用了 Cloudflare,而其 Cloudflare 账号权限被控制,就可以做到非常完美的中间人劫持攻击,注入恶意 JavaScript。而 Trinity 桌面钱包又是基于 Electron,一个完美的 JavaScript 执行环境就摆在这,不需要任何特别的越权,JavaScript 可以完成用户或 Trinity 钱包可以完成的任何事情,其中就包括密码和种子的盗取等等。
由于我们不像 IOTA 和 MoonPay 官方,他们拥有足够的日志记录来将攻击过程完整掌握,我们只能通过我们所能接触到的完成以上推测与相关分析工作。剩下的就希望官方公布具体细节并尽快完成主网的重新运行。
在这,我们不得不提的一些安全看法及建议:
1. 第三方是可以邪恶的,默认都不可信,软件安全开发过程一定要警惕第三方依赖,包括第三方组件与第三方 JavaScript 链接
注:IOTA 基金会联合创始人 Dominik Schiener 表示:“此次攻击是由于集成 MoonPay 的漏洞造成,「Trinity 钱包所犯的最大错误是没有集成 NPM 软件包,并且没有适当地对集成进行安全审核」”我们站在第三方独立安全审计的角度认为,这种说法是不严谨的,在加密货币发展的历史上,因为 NPM 包中引用的第三方源而导致的加密货币被盗案件不在少数。如知名的 “event-stream” 事件
2. Cloudflare 等第三方 CDN/WAF 服务很优秀很强大,但如果使用者没安全管理好自己的账号权限,其 Web 服务将会遭遇完美的中间人攻击
3. 公链官方钱包的一个致命缺陷可能搞垮一条公链,链上安全关注的同时,链下安全也不能忽视,他们是一直整体,这也是为什么我们关注的是区块链生态安全,而不是仅仅区块链本身的链上安全
4. 作为 IOTA 官方钱包 Trinity 的使用者来说,尽快按官方的指导完成安全加固工作,这个就不多说了
相关链接:
Trinity Attack Incident Part 1: Summary and next steps https://blog.iota.org/trinity-attack-incident-part-1-summary-and-next-steps-8c7ccc4d81e8
Trinity Attack Incident Part 2: Trinity Seed Migration Plan https://blog.iota.org/trinity-attack-incident-part-2-trinity-seed-migration-plan-4c52086699b6
Trinity Attack Incident Part 3: Key Learnings & Takeaways https://blog.iota.org/trinity-attack-incident-part-3-key-learnings-takeaways-c933de22fd0a
IOTA Status Page: https://status.iota.org/
如何看待 NPM 包 event-stream 被黑客篡改,发现包含恶意代码?https://www.zhihu.com/question/303815270