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

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

具体来说,在CloneableProxy:Proxy.initialize()函数中,有一个delegatecall调用了Wallet.initialize()函数。这个调用是通过对CloneableProxy:Implementation.initialize()函数的delegatecall实现的。因此,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团队通过以安全可控的方式复制漏洞,成功制定了缓解策略。这个过程包括重新初始化钱包代理,以使其与新实现的、安全的Beacon对齐。鉴于此漏洞是千载难逢的机会,Telcoin可以先发制人地更新钱包配置,从而阻止攻击者进一步利用这些漏洞的能力。
12月26日,太平洋标准时间凌晨2:07至凌晨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等知名投资者那里获得了两轮融资,总计数千万美元。



