Insights

加密货币与黑客攻击 —— 黑帽噩梦

加密货币黑帽事件——跨链桥、密钥、社会工程学和治理漏洞利用——以及专业团队所采取的缓慢且昂贵的防御措施。

发布于 Netts 团队 阅读约 12 分钟

其他语言: EnglishРусскийEspañolไทยFrançaisУкраїнськаTürkçeहिंदीفارسیالعربيةHausaPortuguêsTiếng Việt한국어日本語Bahasa IndonesiaDeutschTagalog

加密货币与黑客攻击 —— 黑帽噩梦
目录
  1. 智能合约漏洞利用的起源
  2. 后果与硬分叉
  3. 未初始化逻辑与 Delegate Call 时代
  4. 多重签名钱包的冻结
  5. 跨链桥的密码学幻象
  6. Nomad 跨链桥漏洞利用事件
  7. 编译器漏洞与市场操纵
  8. 代码与后果之间持续不断的博弈

加密领域常被描绘成一座由密码学、去中心化共识和不可篡改账本构成的城堡。但这个数字应许之地的真相要复杂得多,也危险得多。主流媒体在谈论加密领域的黑客攻击时,通常是指通过社会工程学或网络钓鱼活动,或者是简单的诈骗——即诱导毫无防备的用户在恶意网站上输入交易所地址或私钥。

但本文将完全忽略这些基于人为因素的失败。在本文中,我们将讨论纯粹的黑客攻击。这是一个网络安全崩溃、代码存在深度缺陷并导致严重入侵的领域。这是黑帽黑客的梦想:代码被武器化以反噬其开发者,在几分钟内不费一兵一卒就卷走数亿美元;迫使我们直面逻辑缺陷、编译器漏洞和架构疏忽的极端情况。

智能合约漏洞利用的起源

讨论纯粹的智能合约黑客攻击,需要从一个案例开始——这是 DeFi 历史上当时最臭名昭著的案例之一,它永远改变了以太坊的发展进程。在早期可编程区块链时代,有一个名为 The DAO 的项目。该基金旨在成为一种完全由智能合约管理、无需人工干预的去中心化风险投资基金。

该合约吸引了投资者价值数百万美元的以太币,他们希望通过对提案进行投票来赚取奖励。然而,开发者未能以安全的方式实现提现流程,这导致了一个被称为“重入”(reentrancy)的漏洞。

重入——智能合约调用外部合约,但未更新其内部状态。例如,在 The DAO 中,提现函数先将请求的资金转账给用户,然后才根据提现金额更新用户状态。

黑帽黑客意识到,他们还可以部署一个带有回退函数(fallback function)的恶意智能合约。

每当 The DAO 向该恶意合约转账时,回退函数就会被调用。该回退函数不仅接收了资金,还立即再次调用了 The DAO 的提现函数。这再次触发了回退函数,而 The DAO 执行了该操作,因为在第一次提现时,黑客的余额尚未被更新。

这一过程周而复始,在网络做出反应之前,从 The DAO 中窃取了数百万美元。

后果与硬分叉

这次黑客攻击造成的后果是前所未有的。网络面临崩溃的危险;当时存在的大比例以太币被盗。这给社区带来了生存和技术危机,最终导致社区实施了硬分叉,以回滚区块链历史并退还资金。

这一极具争议的决定导致了永久性的分裂,产生了以太坊(Ethereum)和以太坊经典(Ethereum Classic)。这种特定的漏洞在今天已广为人知,并且主要通过使用“检查-生效-交互”(Checks-Effects-Interactions)模式得到了缓解。

该模式规定,合约必须首先验证所有条件,然后才能更新其内部状态,并且必须在最后阶段才调用外部合约。

然而,尽管基础的重入攻击现在很容易被自动化审计工具检测到,但在某些非常特殊、小众的情况下,微妙的跨合约重入攻击仍可能发生。这表明,即使是已经成熟的概念也可能演变成全新的攻击方式。

未初始化逻辑与 Delegate Call 时代

开发者社区迅速吸取了 The DAO 事件的教训,此后开发的系统复杂度不断提升,并引入了库合约和代理模式等概念,以节省 Gas 费用并提供更便捷的可升级路径。在这种复杂性中,出现了一个额外的纯黑客攻击向量,其中最臭名昭著的例子便是 Parity 多重签名钱包漏洞。

Parity 是一款广泛使用的以太坊客户端,它提供了一个多重签名钱包智能合约,其核心逻辑位于一个中心库合约中。这样设计的初衷是为了提高资源效率,因为多个钱包可以指向同一个库,而无需多次部署相同的代码。

这类漏洞源于对 delegatecall 函数的误解以及未初始化的状态变量。delegatecall 函数允许一个合约执行另一个合约的函数,但该函数可以访问调用合约的存储空间。在 Parity 库合约中,有一个用于初始化钱包所有者的函数。

但库合约本身实际上从未被初始化。 一名黑客发现他们可以直接调用库合约上的初始化函数,并声称自己是该库的所有者。在获得库的所有权后,他们调用了一个函数将其自毁。

多重签名钱包的冻结

当该库被销毁时,依赖于它的多签钱包立即失效。处理交易、提现、甚至仅仅是查询余额所需的所有逻辑都丢失了。在此过程中,由于一个纯粹的架构错误,价值数亿美元的以太币并非被盗,而是被物理冻结了。

这揭示了未初始化逻辑合约的极端危险,以及与 delegatecall 函数相关的微妙风险——这些风险在今天看来似乎是常识,但在当时并未得到充分理解。为了修复这一问题,开发者现在依赖特殊的初始化修饰符,以强制合约只能被初始化一次,并且他们经常在部署者的逻辑合约状态中放置占位值,从而使任何人都无法索取款项。

尽管今天不太可能发生完全相同的情况,但在任何成熟的去中心化金融架构中,仍应仔细考虑代理模式管理不当的普遍风险。

跨链桥的密码学幻象

随着加密生态系统扩展到多个区块链,对互操作性的需求日益增长,这体现在各种不同类型的跨链桥上。这些协议允许资产在一条链上被锁定,并在另一条链上铸造其映射资产。

由于其持有的资产规模巨大,它们成为了黑帽黑客梦寐以求的“蜜罐”。

Wormhole 跨链桥漏洞攻击是一个极其可怕的提醒,它展示了代码实现中遗漏的一个微小细节,如何导致复杂的加密验证彻底失效。Wormhole 允许在 Solana 和以太坊网络之间进行资产转移。这需要一组“守护者”(guardians)监控一条链上的事件,并签署一条消息来证明该事件。这些签名随后由目标链进行验证,验证通过后才会铸造相应的新代币。

漏洞存在于 Solana 智能合约的签名验证环节。加密验证是由该合约调用的一个 Solana 内置程序完成的。但 Wormhole 的开发人员并未检查被调用的程序是否为真正的系统程序。黑客还创建了一个程序,无论输入是什么,该程序始终返回成功消息。

接着,Wormhole 合约被指令使用这个伪造的程序进行验证。在签名确实有效的错误假设下,合约继续在 Solana 网络上铸造了价值数亿美元的包装以太坊(wrapped Ethereum),而另一侧实际上没有锁定任何以太坊。随后,黑客将这些新铸造的、无背书的代币跨回以太坊,从而清空了该协议中的真实资产。

这是一次针对 Solana 账户验证模型的利落且极具技术含量的攻击。这一问题通过更严格的验证得到了修复,即检查验证程序是否确实是硬编码的官方系统地址。

影响是巨大的,需要项目支持者的救助,以防止 Solana DeFi 生态系统发生系统性崩溃。

由于智能合约开发范式的独特特征,特别是在像 Solana 这样重度依赖账户模型的环境中,如果开发人员不对其智能合约中调用的每个外部实体进行严格的账户和程序验证与校验,此类漏洞在未来可能会再次发生。

Nomad 跨链桥漏洞利用事件

如果说 Wormhole 是一次针对特定方向的协同攻击,那么 Nomad 跨链桥漏洞利用事件则证明了一个简单的逻辑缺陷是多么容易让一个协议陷入混乱,就像一场毫无秩序的大乱斗。为了实现这种跨链消息传递,Nomad 使用了一种依赖默克尔树(Merkle tree)来证明消息有效性的乐观汇总(Optimistic Rollup)模型。开发人员在部署协议更新时,在初始化信任根(trusted root)方面犯了一个关键错误。

这是因为他们将信任根设置为了零哈希(zero hash)——这是 Solidity 中未初始化变量的默认值。这导致任何未经过显式验证的消息都会回退到零哈希,而此时合约已将其视为有效的信任根。从本质上讲,一名黑客意识到他可以创建一个请求合约提取资金的交易,由于证明的哈希值为零哈希,合约将始终接受该交易。

这次黑客攻击的独特之处在于其简单性以及随之而来的疯狂混乱。在最初的黑客实施了漏洞利用后,其他用户也纷纷加入其中。这不需要任何技术性的黑客能力,只需复制并粘贴黑客的交易信息,将目标地址更改为自己的地址,并将其发布到网络上即可。

数百名不同的参与者在短短几小时内洗劫了 Nomad 跨链桥近两亿美元的资金。

这是一个教科书式的网络安全事故:一行配置错误的初始化代码绕过了整个加密安全系统。通过修补零根(zero root)初始化逻辑并明确拒绝将其作为有效根,该问题得到了缓解。跨链桥的用户付出了代价,这惨痛地提醒了我们,在开发智能合约时,一个缺失的字符或错误的默认值就足以危及整个协议的安全。

只要经过严谨的测试,这种特定的漏洞本可以轻而易举地避免,然而更大类别的初始化错误仍然在活跃地困扰着各类系统。

编译器漏洞与市场操纵

最令人恐惧的纯黑客攻击类型之一,是缺陷不在开发者的代码中,而是在用于编译代码的工具中。在 Curve Finance 漏洞利用事件中,我们再次领教了这一点,该事件引发了 DeFi 基石的剧烈震动。作为领先的稳定币去中心化交易所(DEX),Curve 的大部分核心合约都是用 Vyper 编写的,这是一种强调安全性和简洁性的类 Python 智能合约语言。

幸运的是,Curve 的开发者在智能合约中实现了重入保护(reentrancy guards),以防御这种曾重创 The DAO 的攻击类型。但在 Vyper 编译器的某个特定旧版本中,却埋藏着这样一个漏洞。

编译器成功地将人类可读的 Vyper 代码翻译成了要在以太坊虚拟机(EVM)上运行的机器可读字节码,但在将重入锁应用到多个函数方面表现不佳。

代码本身是安全的,开发者完全按照预期编写,但编译器却反戈一击,生成了带有漏洞的字节码。这意味着一名黑帽黑客注意到并理解了某些 Curve 流动性池容易受到跨函数重入攻击。他们利用这一点从资金池中窃取了数千万美元。

这次攻击极其隐蔽,因为通过传统的源码审计根本无法发现;源码本身是正确的。漏洞仅存在于编译后的字节码中。这一事件迫使整个行业重新审视对编译器和基础设施的信任。该问题已通过更新 Vyper 编译器并将受影响的资金池迁移到安全编译的新合约中得到解决。

其结果是一场严重的信任危机,并让人们认识到安全必须贯穿整个技术栈。当然,编译器漏洞非常罕见,但也几乎无法预见,因此这种基础设施层面的噩梦很容易再次上演。

闪电贷——一种随着去中心化金融(DeFi)发展而出现的新型金融工具,从根本上改变了纯粹黑客攻击的本质。闪电贷允许用户在无需抵押的情况下借入几乎无限数量的加密货币,只要在同一笔交易完成前归还贷款即可。 如果资金未结算,整个交易将被回滚——就好像从未发生过一样。

闪电贷通常用于套利或清算,它为黑帽黑客提供了必要的流动性,以利用市场机制中深层的逻辑漏洞。以 Euler Finance 攻击事件为例,Euler 是一个用于存款和获利的借贷协议。用户还可以将其存入的资产捐赠给协议储备金,协议中这一功能被称为 donateToReserves。

但开发者在该功能中遗漏了一个非常重要的健康检查。他们既没有检查捐赠者提取资金的账户在捐赠后是否仍能保持余额平衡。攻击者通过闪电贷借入大量资产并存入 Euler。接着,他们调用了 donateToReserves 函数来捐赠其部分存款。

由于缺乏健康检查,协议批准了这笔捐赠,导致黑客账户进入了一种高度人为操纵的破产状态。随后,黑客对其账户进行了清算。然而,Euler 清算奖励背后的数学逻辑非常复杂,加之闪电贷金额巨大,导致清算人最终从协议中获取的价值远超其存入的价值。

他们归还了闪电贷,并带着约 2 亿美元卷款潜逃。这并非密码学失效或编译器漏洞,而纯粹是代码中金融逻辑的失效。在这种情况下,开发者只是忘记插入一行代码来检查执行某些操作后的账户健康状况。补丁包括提供适当的健康检查,并彻底重构协议的风险管理逻辑。

这产生了严重的后果,导致协议中断,并花费了数月的谈判才追回部分资金。 这种逻辑漏洞利用——即复杂的金融机制以非预期的方式相互作用——代表了当今最普遍且最危险的纯黑客攻击形式。协议的复杂性将会增加,而这类逻辑疏忽几乎肯定会再次发生。

代码与后果之间持续不断的博弈

回顾这些巨额安全漏洞的历史事件,你会很容易发现一种规律。这些漏洞很少是由于底层区块链共识机制的失败造成的。不,它们是编码在不可篡改代码中的人类逻辑的失败。无论是状态更新出错、代理合约中未编写的代码路径、跳过的加密检查、编译器错误,还是缺失的金融不变性检查,其根本问题始终在于智能合约最初的设计错误。

为了消除这些风险,行业建立了一套完善的防御体系。其中包括:

1. 由独立安全公司进行的第三方人工代码审计。2. 通过数学方式证明代码完全按预期运行的形式化验证工具。3. 巨额漏洞赏金,用于支付给白帽黑客,以便在坏人之前发现缺陷。4. 使用时间锁和多签管理员密钥控制,以减缓恶意更新的部署速度。5. 使用去中心化保险协议,在发生安全漏洞时提供保障。

然而,尽管这些防御措施变得越来越先进,黑帽黑客攻击依然存在。软件开发的出发点在于:复杂性会产生失败的机会。"

去中心化金融的复杂性日益增加,开发者们构建的复杂协议集成了数十个其他智能合约,并实现跨链运行,这创造了前所未有的全新攻击途径。

由于攻击者的手段仅受限于其想象力,他们只需找到一个有效的攻击向量即可获得成功,而防御方总是处于被动应对且永远落后的状态。这将是一场持久的博弈,去中心化未来的建设者将与漏洞利用者不断较量。全面黑客攻击的噩梦将持续演变,并时刻提醒着我们:在一个“代码即法律”的世界里,一个细微的代码错误就可能导致满盘皆输。

每一行代码都价值数十万美元,因此,在日常操作中,效率和精准度与安全性同样重要,以确保最高水平的性能表现。用户在管理数字资产(尤其是稳定币)时,经常受到网络成本损耗的困扰。现在,每当你发送 USDT 时,如果你经常进行资金转移,你就会知道 USDT 的交易成本波动很大,甚至会严重损耗你的本金。

作为生态系统的积极参与者,寻找一种廉价的 USDT 转账方式至关重要。这正是特定工具能为你带来优势的地方。netts 服务:USDT 转账计算器(USDT Transfer Calculator)正是为了优化这些应用场景而创建的。

当您在 TRON 网络上转账 Tether 时,会消耗您的能量和带宽。如果您没有这些资源,网络将根据您的 USDT 手续费燃烧您的 TRX。

Netts 预估器可以预先计算所需的精确能量和带宽,这意味着用户可以通过租赁能量而不是燃烧 TRX 来节省大量费用。在每一分代币都至关重要的领域,这能让您的资产管理尽可能高效。

分享 X Telegram LinkedIn Reddit

下一步