关于 脚本(CryptoJS.lib.ByteArray) 被挂马
有网站调用我在 2014 年编写并托管在 GreasyFork 的一个简单脚本,但近期被发现暗藏 “木马”。
通过查看更改记录得知,该脚本在 2019.05.13 被非法访问并修改,并在 2019.07.08 之前持续被更改:
相关修改后的版本我也复制一份出来 (我加了一行 throw
防止不小心被执行;此为最后修改的版本):
脚本里面可以找到一个类似 DASH 虚拟货币的钱包地址,但简单查询未能获得任何交易信息:XgwGxaHAeQwVYcQAgZeTa6TPVjZhicEJki
该问题由受害者通过邮件联系通知。目前管理员已将该脚本移除。
该问题也在 GitHub 上发表,希望能通过强制锁定版本号、更频繁的邮件通知来避免这种问题再次发生或及时止损。
此外,GreasyFork 不是 CDN。希望前端开发者能锁定版本,使用 CDN 的副本或自己打包,而不是引用可随意更新内容的来源来防止投毒。
以下为邮件交流过程。
注:邮件来自z[隐私删除]@163.com
,我的回应来自 j[隐私删除]@gmail.com
。
[隐私删除]:
5.13号起 到7.12 号结束,mydashwallet.org 一直被你维护的脚本https://greasyfork.org/scripts/6696-cryptojs-lib-bytearray/code/CryptoJSlibByteArray.js
6.18-6.19号那天我的930个DASH 被这里盗窃洗劫一空,我一直在MDW抓包,终于抓到了https://api.dashcoinanalytics.com/stats.php 一直在窃取私钥。
如果是你本人做的,可以归还么? 如果不是,麻烦提供些线索。现在DASH CORE 的人员和警方 已经介入,查到了币安和bitfinex的一些线索,正在继续。
期待你的回复,同为中国人,望帮助,希望你在英国一切顺利。
回应1:
至[隐私删除]:
对于你的遭遇,我表示深感遗憾。
看了一下链接,的确是我的账号下的一个脚本。这个脚本在 2014 年建立之后没有被我“主动”更新过,我也不清楚为什么会在 2019 年(5月到7月)连续发生更改。翻了下我其他的脚本,未发现可疑的修改。我在网站的代码仓库报告了这个信息 https://github.com/JasonBarnabe/greasyfork/issues/621 ,以及如何避免这类依赖攻击(虽然我看了下我的那个脚本,并没有设定全域执行?)。
如果你能查到是哪个插件引入的这个脚本,建议调查。如果对方是无意引入,请提醒其清理;如果是主谋,你可以报告给警方。
至于线索,建议等待警方调查。不过因为被盗的是不容易监管的虚拟货币,我认为追回的可能性不大。
安全上的建议,则是开启 2FA 或使用硬件辅助,并设定每一笔交易(支出)都要求手动确认。
以上。
回应2:
至[隐私删除]:
观察其网站旧版本的代码(https://github.com/DeltaEngine/MyDashWallet/blob/c7b2eb3147cdc4e5960e442110123cab609bad65/Views/Home/Index.cshtml#L13),可以看到他们直接引用了我的脚本(且这个脚本在网站上线后被纂改)。
结论更新,应该不是第三方插件的问题。
以上。
来自对方的回应(17日):
[隐私删除]:
麻烦回想一下你的帐户是什么时候被盗的, 这次涉及的金额已经有几百万刀,盗取你帐户的人已经财务自由.请帮忙查查细节.
我的回应:
至[隐私删除]:
与网站所有者的对话可以参见 GitHub 上的讨论:https://github.com/JasonBarnabe/greasyfork/issues/621#issuecomment-512061491
详细细节我也没有,因为网站不是我的。从我与网站所有者的对话可得知我的这个帐号,至少从(今年)一月的时候账号被非法访问过,并设定了一个密码。因为我都是通过第三方网站登入,所以不可能是我主动设定的密码,也未注意到登入密码被篡改。此外,非法访问者是通过 tor 匿名网络访问,追查难度大。
在这段时间内,我没有发现任何异常,也没有注意到密码被重置(站内更改密码不会产生新邮件)。相信以后会更新这个策略。
对于你的案子,我只能祝你好运了。
以上。
来自对方的回应(26日):
[隐私删除]:
你好,可以麻烦你提供下https://greasyfork.org/en/scripts/6696-cryptojs-lib-bytearray/versions 的history 版本吗? 这里已经删除了 需要提供一些资料给相关机构 麻烦你帮忙下.
另外上次你说到你的帐户19年1月份已经被破解,请问能顺便提供下那时候的登陆IP么? 黑客的IP 十分感谢.
我的回应:
至[隐私删除]:
因为邮箱不允许上传带有脚本的文件,因此历史版本我打包放到Yandex网盘了(https://yadi.sk/d/CfbF5KEy5r33dg)。
登录 IP 恕我无法提供,请直接问站长(参见之前邮件的 GitHub 链接)。不过站长有提到这些登入是通过 Tor代理(https://www.torproject.org/)访问的,我认为追踪 IP 信息没有用处。
以上。
来自对方的回应(26日):
可以再发下0618版本的那份脚本么 再次感谢 那个时间节点很重要
我的回应:
至[隐私删除]:
06.18 的当日更新(UTC 时间 2019-06-18 23:20:26)被还原到了原始版本,没有添加恶意代码。不过之前的一个版本(UTC 时间 2019-06-07 14:57:27)有被替换,浏览器可能因为缓存策略而没有更新。
我目前有点事情要忙,等我过几个小时(大约2到3个小时)后把每个版本都一起打包一份后发给你。
以上。
来自对方的回应(26日):
谢谢
我的回应:
至[隐私删除]:
我把所有的版本都打包放到 Yandex 了:https://yadi.sk/d/kJ_3ukxYdvgqKQ
一共有 12 个文件,其中有 4 次修改是还原到原始代码(不含窃取私钥部分),原因不明,可能当时只是为了测试效果?
原始上传时间请参考文件名,如“20141127223259”表示这个版本是在 UTC 时间的 2014 年 11 月 27 日,22 时 32 分 59 秒提交。
2014 年的这个版本是我提交的,其它版本均为未授权访问者提交,直到被删除的时候。
以上。
我的看法:
该事件体现了 MDW 内部对安全审计的忽视(引用了第三方非完全可信内容),以及对第三方(小)网站服务的滥用(我发表的初版代码没有任何问题,MDW 没有复制到代码里用也没有锁定引用的版本)导致被黑客找到弱点并利用。任何一环的缺失都会导致此次黑客行为失败。
以前还觉得一些网站只要有新 IP 登入或什么操作都会发邮件简直就是骚扰用户,但现在却觉得这是能让用户止损的最快的方法了。
目前已经在 GitHub 上打开了 2FA 的选项,也订购了个硬件 2FA 准备绑定到账号上。