2023年12月25日,我们的监控系统检测到一系列针对Telcoin的恶意活动。我们协助Telcoin团队将根本原因确定为钱包合约的初始化不当,这是由于钱包的实际实现与其对应的代理之间存在不一致造成的。本报告旨在提供详细的分析,以便全面理解此事件。
0x0:基本设计
在检查漏洞之前,首先了解相关智能合约之间的关系非常重要。本质上,这些可以抽象为三种设计模式的组合:CloneFactory、Cloneable Proxy和Beacon Proxy模式,如下图所示。

0x1:漏洞分析
该漏洞源于钱包合约的初始化不当,这是由于钱包的实际实现与其对应的代理之间存在不匹配。具体来说,在初始化过程中,代理通过写入存储位置的最低有效位,将存储槽0初始化为一个非零状态。随后,钱包代码也写入了存储槽0,从而覆盖了代理在最低有效位中的初始值。这个问题不是由任一智能合约固有的漏洞造成的,而是两者之间交互的结果。
下面,我们将根据提供的交易追踪详细说明:

具体来说,在CloneableProxy:Proxy.initialize()函数中,有一个delegatecall调用了Wallet.initialize()函数。这个调用是通过delegatecall到CloneableProxy:Implementation.initialize()函数实现的。因此,Wallet.initialize()函数对存储所做的任何修改都将反映在CloneableProxy:Proxy合约的存储中。
要完全理解其含义,有必要检查CloneableProxy:Proxy合约的存储布局。该合约的定义如下:

鉴于Proxy和ERC1967Upgrade合约都没有存储变量,槽0被两个存储变量——_initialized和_initializing——使用,这两个变量都继承自Initializable合约。

现在,让我们检查Wallet合约。在Wallet.initialize()函数中,显而易见,槽0xaa用作初始化标志。这一点由以下3-4行和11-12行的代码片段强调:

请注意,槽0被分配给_state,它存储了函数选择器后面的calldata中的下一个32字节,如第21行所示。有关更多详细信息,请参阅Wallet合约开头的注释:

在槽0的使用上存在明显的不匹配:CloneableProxy:Proxy合约将其解释为初始化标志,而Wallet:initialize()函数则将其视为钱包的状态。
因此,初始化过程完成后,槽0的最低两个字节将被重置为零。这有效地将_initialized和_initializing都设置为零。结果,CloneableProxy:Proxy合约容易通过initialize()函数进行重新初始化,因为initializer修饰符的保护可以被规避。

显然,潜在的利用取决于钱包的状态。一旦更新为非零值,钱包的状态就会阻止该合约的进一步重新初始化。初始化之后,随着钱包状态在每次交易时更新,槽0的最低两个字节为非零的可能性就会增加,这有效地使钱包免受重新初始化的影响。这解释了为什么大多数易受攻击的钱包交易历史很少或根本没有,导致它们暴露于攻击之下。
0x2:攻击分析
攻击者首先重新初始化了易受攻击的CloneableProxy:Proxy合约,以更改Beacon合约的地址。随后,攻击者继续转移CloneableProxy:Proxy合约中包含的资产,具体如下:

值得注意的是,在一次交易中,多个易受攻击的合约被攻破,攻击者反复执行了这种策略。
0x3:攻击摘要
我们观察到总共发生了4,958次攻击,由六个不同的账户执行,如下所示:

0x4:修复和建议
我们的调查显示,核心问题源于存储槽0的使用不一致,导致易受攻击的合约可能被重新初始化。显然,修复涉及对存储分配进行仔细管理。
从这次事件中,我们获得了几点重要见解:
-
在使用内联汇编操作存储槽时要格外小心,因为错误可能导致重大的漏洞。
-
密切监控合约状态。快速响应能力取决于是否能及时收到警报。
-
在合约中实现暂停机制,以便在检测到被入侵时立即中止活动。
此外,此次事件涉及针对不同钱包合约的多次攻击交易,凸显了对威胁监控和攻击阻断解决方案(如Phalcon)的迫切需求。这类工具对于减轻未来风险和防范潜在损失至关重要。
0x5:事件时间线
太平洋标准时间12月25日上午9:23:我们的系统在Polygon网络上检测到第一笔恶意交易:

太平洋标准时间12月25日上午10:28:Telcoin支持团队在内部沟通频道报告了该事件。
太平洋标准时间12月25日上午10:32—10:37:Telcoin团队成员通知了Telcoin Discord社区,并召集了所有相关关键团队成员的紧急会议。
太平洋标准时间12月25日上午10:45:实施了Web应用程序防火墙规则,以限制对Telcoin基础设施的所有访问。
太平洋标准时间12月25日上午11:02:Telcoin团队开始与Seal 911进行洽谈。
太平洋标准时间12月25日上午11:11:Telcoin团队和其他安全成员成立了一个战争室,以找出根本原因并讨论阻止攻击的潜在解决方案。
太平洋标准时间12月25日下午1:14:Telcoin团队通过X(Twitter)向用户发布了警报。
太平洋标准时间12月25日下午3:39:Telcoin联系了Chainalysis和Slowmist,通过调查被盗资金,对被盗钱包和地址进行标记,并将这些情报与交易所共享。

太平洋标准时间12月25日下午10:35:应Telcoin团队的邀请,我们加入了战争室,并分享了我们的分析以确定根本原因。
太平洋标准时间12月25日晚上11:00至太平洋标准时间12月26日凌晨2:06:在确定根本原因后,Telcoin团队通过安全且可控的方式复制了漏洞利用,成功制定了缓解策略。此过程涉及重新初始化钱包代理,以与新实现的、安全的信标对齐。鉴于此漏洞利用是一次性机会,Telcoin可以预先更新钱包配置,从而使攻击者无法进一步利用这些漏洞。
太平洋标准时间12月26日凌晨2:07至太平洋标准时间12月26日凌晨2:14:Telcoin团队在所有尚未被攻破的钱包上实施了缓解措施,以确保全面覆盖。为了快速高效地部署,该过程在严格定义的时间窗口内分批执行。然后,Telcoin开始准备并在内部测试修复计划,以全面恢复所有受影响的钱包并永久修复所有钱包。
太平洋标准时间12月26日下午4:52:Telcoin和我方团队就以下主题展开讨论:
-
事件概述
-
事件时间线:事件发生的按时间顺序的记述。
-
根本原因分析:对事件根本原因的深入分析。
-
改进建议
-
代码审计
太平洋标准时间12月29日上午12:27:经过多轮讨论,我们开始与Telcoin团队合作起草事后报告并审计修复措施。
2024年1月3日:提供了事后报告草稿。
2024年1月4日:提交了我们的审计发现,包括确定的问题和建议。
2024年1月4日至1月10日:我们与Telcoin团队合作,完成了事后报告并审查了修复措施。
此外,值得注意的是,从12月25日至今,Telcoin一直与区块链调查公司和执法部门就此次事件密切合作。
关于BlockSec
BlockSec是一家开创性的区块链安全公司,于2021年由一群全球杰出的安全专家创立。该公司致力于提升新兴Web3世界的安全性和可用性,以促进其大规模采用。为此,BlockSec提供智能合约和EVM链安全审计服务、用于安全开发和主动阻断威胁的Phalcon平台、用于资金追踪和调查的MetaSleuth平台,以及供Web3构建者在加密世界中高效冲浪的MetaDock扩展。
迄今为止,该公司已为MetaMask、Uniswap Foundation、Compound、Forta和PancakeSwap等300多家知名客户提供服务,并通过两轮融资获得了数千万美元的投资,投资者包括Matrix Partners、Vitalbridge Capital和Fenbushi Capital。



