LedgerHQ软件供应链安全事件
0x00 前言
写这篇的文章的原因如下:
1、 去年有及时关注到这起供应链攻击事件,但由于不熟悉区块链安全以及对关键代码的解密困难未能深入分析,就先收藏留存;
2、 对区块链安全的兴趣日益加深,以及职业发展需求驱动下开始尝试学习储备相关知识技能;
3、 最近突然对关键代码的解密有所突破,并借助AI工具加速分析和理解;
4、 未在互联网上找到与此相关的技术细节方面(可能是个人关注的角度)的分析,希望能分享一些学习过程中的新发现,为安全社区贡献一点绵薄之力;
5、 软件供应链攻击的分析专题补充一类涉及NPM投毒、区块链相关的经典案例。
0x01 事件背景
2023年12月份在推特上关注到慢雾科技的余弦大大在播报这个软件供应链攻击事件,大致了解到知名的硬件钱包厂商Ledger维护的一个JS库被篡改,影响了很多dApps(去中心化)应用,更传奇的是听说黑客转走了很多用户的加密货币。
https://twitter.com/evilcos/status/1735285800101884272
Ledgerhq/connect-kit这个库是一个广泛使用的JS库,dApps应用通过这个库可以方便地与Ledger硬件钱包进行连接。攻击者通过在这个库中插入恶意代码使其转变为一个“资金抽取器”,可以在用户不知情的情况下从他们的钱包中提取资金。这个被篡改和更新的版本库在短时间内影响了多个知名的dApps应用,如Zapper、SushiSwap和RevokeCash等,用户在访问这些正规网站并授权后,资金被迅速的转移到攻击者控制的账户地址。
https://twitter.com/zachxbt/status/1735292040986886648
上面贴文截图中的作案钱包账户是一个以太坊相关的地址,通过以太坊代币浏览器查看该账户(0x6587…5c2d)在23年12月份15号之前的转账记录,结果显示从北京时间12月14号早上10点到中午12点左右就将近进行了100笔交易,累积金额数十万美元(据称本次案例影响规模至少达60万美元以上)。
https://ethplorer.io/zh/address/0x658729879fca881d9526480b82ae00efc54b5c2d#pageTab=transfers
0x02 技术分析
这个被劫持的JS库主要通过NPM和Github发布,目前相关恶意版本均已移除。如下所示当前NPM仓库里的该库版本从1.1.4直接跳到.1.1.8版本,缺失的1.1.5、1.1.6和1.1.7这3个就是曾经被篡改过的恶意版本,也是差不多一年前当时的最新更新版本。
不过,著名的CDN镜像站jsDelivr不知为何目前还存留着这个库的恶意版本,建议官方还是尽快移除比较好。
1.1.5版本库较大,主要是从尾部插入一个恶意js(2e6d5f64604be31.js)请求,该请求被设置为在DOM页面加载完成后开始执行。
1.1.6版本当前在CDN上已移除,不过我之前有备份内容如下,它去掉了大部分的connect-kit主体代码,直接动态加载恶意的2e6d5f64604be31.js,推测可能因为这样足够小显得这份代码相对比较可疑才被jsDelivr相关人员删除。
1.1.7版本目前也没有被移除,此版本则更是直接地执行恶意代码部分,该部分恶意代码与2e6d5f64604be31.js类似。
恶意2e6d5f64604be31.js目前也还存在于jsDelivr上面,仔细观察除了开头部分配置代码容易阅读理解外,之后的恶意代码均被混淆处理成很多随机的字符编码难以阅读。
之前就是对这里的关键代码“加密”无从下手才搁置分析,这里推荐一款开源工具“decode-js”可以帮助解密这块混淆代码,它是基于AST分析来执行解混淆功能。
https://github.com/echo094/decode-js
解混淆后的脚本虽然已经是可以供人阅读和分析了,但是如果缺乏专业的区块链相关知识,要理解起来也比较困难。所以我机智地想到了利用现阶段很流行的AI工具来辅助分析,本来想续费一下Perplexity来借助它强大的附件上传能力进行分析,后来又觉得一个月20美金的价格还是有点不舍,所幸无意之间又翻到了之前试用过的Kimi,发现它不需要充钱就可以上传文本分析,而且使用效果甚至还在预期之外,看来国内的大模型也在偷偷的不断进步。
上述大模型的分析截图看起来有那么点意思了,接着就我比较关心的资产转移功能再试探性问一波:
根据kimi的提示,在代码中定位了一下相关的转账函数,果然很快就找到了一个根据用户的资产环境判断的转账分支流程,由此可见恶意代码确实能窃取多种类型的加密货币资产如智能合约、NFT,或原生代币的转账如ETH、BNB、ARB币等。
跟进这个原生代币的转账函数transferNative,发现其核心操作就是使用eth_sendTransaction 这么一个 JSON-RPC 接口,用于发起一个请求来创建新交易。也就是说这个接口的参数form和to就分别代表转账交易的发送账户和接收账户,其中from参数的值this.walletAddress是通过获取dApps应用当前登录账户的钱包地址得来(使用导入的ethers.providers.Web3Provider对象),而to参数的值则是从一个特殊的config对象中的一个ethContractAddress(以太坊合约地址)字段获取。在创建交易后,紧接着又将当前用户的IP地址、钱包地址等信息发送到一个叫做this.logDomainName的服务器上对应的"backend/safa/native"接口用于记录本次交易。
因为本人比较关心的是这份恶意代码的C&C地址以及用于资产转移的接收账户的地址,于是就锁定这个this.logDomainName和config对象,前者比较好找,在一个Configuration配置类的定义中就直接看到,“*.infura-api.com”这个域名就是C2,看样子似乎是仿冒了infura平台(区块链相关)的名称。
不过令我比较惊讶的是VirusTotal上关于这个域名的检出着实不多,很多知名大厂都miss了,检出的也大多标注仅是钓鱼域名(可能认为仿冒infura?)的样子,似乎对这次供应链攻击事件的关注度不够高。
再来看下config对象,因为我并没有在恶意代码里直接找到转账的接收地址(前文所述的0x6587…5c2d账户也没发现),所以猜测是通过C2下发的配置来动态控制而不是写死固定账户。首先找到config初始定义的地方,其中还看到infura相关的key,但是却没有找到上述的ethContractAddress字段。
然后发现它在后面被重新分配了,并且C&C地址的对象this.logDomainName也在此处进行了一次更新。
而更新数据来自这个getDomain函数,根据代码可知是先访问“https[:]//infura-api.com/router.js”后拿到更新C2域名,接着再访问“https[:]//rpc.infura-api.com/config?key=b16aa749-b357-49f9-884e-33bef38ebfd4”获取更新config对象配置,此配置数据还经过加密需要使用定制化的this.decryptBody函数解密,而关键的接收账户的地址应该就是通过这里进行分发。
由于当前C2域名已失效无法访问,所以不能进一步验证配置数据,不过这也侧面印证这个域名应该就是此次软件供应链攻击的其中一个IOC。
另外,本人注意到网上/AI关于本次攻击手法的一些分析描述,似乎为了达成黑客自动转账提取资金的目的,需要经过一次和用户的交互动作才能实现(而非全自动)。这个地方的细节暂时没有找到很详细的描述,只是提到说Drainer类会替换dApps应用正常的窗口逻辑,会弹出一个伪造的DrainerPopup弹窗来诱导用户连接钱包并进行授权操作,可能用户看到的弹窗是一个正常的操作请求,而实际上却是攻击者精心构造的虚假交易请求,一旦用户大意操作后钱包资金就会被抽走。由于本人对现实中这些区块链钱包应用的交易转账流程不太熟悉,以及缺乏调试环境无法复现代码的运行效果,所以只能从静态代码大概看一下这块而无法验证其真实情况。
首先找到DrainerPopup弹窗类的定义,它会动态创建一个div窗口并设置样式为config对象的popupCode字段:
然后如果准备好要打开弹窗,就会通过Swal.fire(SweetAlert2库函数)创建一个关于钱包信息的弹出窗口,并且判断用户钱包类型是否为已知列表之一(如MetaMask钱包、Trust钱包和Ledger钱包等),若是则设置首选连接的钱包图标和类型显示为对应的样式,否则就默认显示为自定义的图标和钱包名。
从代码分析大致情况与如下用户的反馈截图(出自慢雾科技报告,如下账户目前已不存在,不知道是否受此事件影响)相符合,截图中的弹窗就是攻击者需要诱导用户连接钱包进行转账的虚假提示。
虽然代码中还有很多值得研究和学习的地方,但是限于篇幅等因素至此技术分析部分就先结束了。
0x03 攻击溯源
此部分并非本文重点,为了行文完整性考虑就在这里整合一些从网上搜集到的信息作为补充。
首先,根据推特上某用户发现的线索截图(出自慢雾科技报告,如下推文受此事件压力目前已删除),攻击者在提交1.1.7版本库时暴露了一个gmail邮箱账户(jun.sugiura.jp@gmail.com),此账户指向了Ledger的前员工Jun。
随后Ledger官方也发推文证实了前员工遭遇钓鱼攻击导致NPMJS账户权限被非法访问的事情,当然这也免不了众多网友发出为何前员工还会有代码访问权限的灵魂拷问。
https://twitter.com/Ledger/status/1735326240658100414
虽然前员工被攻击的事件难以追溯调查,但是从另一个角度即黑客作案收账的钱包地址去追踪,慢雾科技的报告指出攻击者与钓鱼团伙Angel Drainer有所关联,似乎是因为上文贴文截图中的第二个账户地址(Drainer fee Address, 0x412f…313f)是Angel Drainer团伙使用的其中一个账户。
此外从今年二月份sucuri发布的一篇关于web3恶意软件的分析报告中也关联到了上述IOC指标(rpc.infura-api[.]com),并且提到了钓鱼作案团伙Angel Drainer的一种连接钱包的钓鱼弹窗手法与上述的攻击手法相吻合,侧面印证了本次软件供应链攻击出自于该钓鱼团伙。
有意思的是该团伙还在库代码的注释中对著名的web3钓鱼团伙Inferno致敬了一番。
0x04 总结
似乎是对于此次软件供应链攻击事件的关注度不够,众多厂商并未过多的分析这份恶意代码,导致目前对于相关的IOC并未标注明显的威胁标签。而且著名的CDN镜像站jsDelivr服务器上目前依然可以访问相关的带毒JS库,从jsDelivr只删除了较为可疑的1.1.6版本的事实上推测,明显反映出他们对于这次攻击事件的响应和专业度并不充分,安全分析和检测不足。
由于区块链安全属于新兴的一类安全方向,目前并不是太多的传统安全厂商都涉及和参与其中,所以可能会存在某种行业壁垒导致一些关注点的“盲区”。而因为安全又是一个大的整体,特别是在供应链攻击日渐盛行的当下,不同行业之间其实早已深度捆绑、紧密相连,所以感觉加强新兴区块链安全与传统安全之间的深入协作确实也是十分必要的。
本文仅从软件供应链安全事件和代码分析的角度窥探区块链安全的一角,实际上区块链安全是一个庞大的体系,涉及很多专业的知识进一步需要学习和钻研。
0x05 参考链接
1、 Ledger Connect Kit 被黑之谜,https://web3caff.com/zh/archives/79128
2、 Web3 Crypto Malware: Angel Drainer Overview, Variants & Stats ,https://blog.sucuri.net/2024/02/web3-crypto-malware-angel-drainer.html
3、 Cracking the Code: Unveiling the Deceptive ‘Angel Drainer’ Phishing Gang ,https://slowmist.medium.com/cracking-the-code-unveiling-the-deceptive-angel-drainer-phishing-gang-proactive-strategies-to-3ade2bbfd45c
4、 浅谈区块链及其安全,https://xz.aliyun.com/t/4135
5、 黑手册,https://github.com/evilcos/darkhandbook
6、 SharkTeam:Web3 常见钓鱼方式分析与安全防范建议,https://web3caff.com/zh/archives/93913
7、 盗取8000万美元加密货币后 钓鱼工具Inferno Drainer宣布关闭,https://www.fx168news.com/article/388748
目前没有反馈
表单载入中...