【解读合约审计】Harmony的跨链桥是如何被盗一亿美金的?

2023-11-03 04:10

本文主要是介绍【解读合约审计】Harmony的跨链桥是如何被盗一亿美金的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内容概要

2022年6月24日,由Layer1公链Harmony开发的,以太坊与Harmony间的资产跨链桥Horizon遭到攻击,损失金额约为1亿美元。

这到底是怎么回事?

虽然黑客攻击发生的当天就能断定属于“公证人私钥被盗”,既然贵客点开,不妨来展开聊聊,放心,有少数硬核源码但全篇讲白话,通俗易懂!

    • 跨链桥分类与技术原理

    • Horizon合约审计报告解读

    • 被盗原因复盘分析与总结

  • 目录

    1、跨链桥技术原理

    1.1、跨链方案有哪些?

    1.2、Horizon桥的跨链原理

    2、Horizon桥的合约审计报告解读

    2.1、中低风险点1-兼容不足

    2.2、中低风险点2-异常锁定

    2.3、高风险点

    3、黑客盗取过程

    3.1、关键信息

    3.2、盗取过程分析

    4、思考总结

    4.1、盗者会如何?

    4.2、如何更安全?

    前文回顾


1、跨链桥技术原理

跨链,顾名思义是不同区块链之间资产信息如何转移的问题,也称之为互操作性,而目前有超50种跨链解决方案,其方案定义是多种多样的。

《来自iosg-跨链桥方案一览,谁能汇聚多链流动性》

1.1、跨链方案有哪些?

概括来讲,要实现资产价值在另一条链上恒定,有两种大路径按”价格”锚定和按”物理”锚定

乍一听复杂,其实按价格锚定就是在各公链上的USDT这种稳定币,他与美元1:1锚定,因此也属于跨链资产的一种。

抛开各类稳定币更直观一种跨链方案则是物理锚定,即流动性总量是恒定的,其方案也很多(公证人、侧链、中继链、哈希锁定等),咱们重点讲公证人模式。

公证人模式依据”公证人是谁“有三种区分:

  • 交易所做担保型:比如币安提币,各种买卖均在中心化交易所进行,提币才兑现

  • 流动性池桥接型:比如bridge.connext,o3swap

  • 合约锁定铸造型:各类官方桥通用方案polygon/arbitrum/avax/celer,以及今天的主角harmony

锁定铸造型由于产生的是包装代币,因此往往是各公链具有一定公信力的官方桥才采用。

以上均各有优缺,或是怕交易所跑路,或是流动性枯竭,或是公证人私钥被盗,目前并没有完美实现不可能三角的跨链方案出现。

如下图是o3swap的流动性总量和交易量趋势,近半年已然跌去90%,或许是因为去年8月的质押资产被盗案导致不断式微吧。

《流动性总量与交易量,来自o3swap官网》


1.2、Horizon桥的跨链原理

Harmony开发的Horizon桥是非常标准的公证人锁定铸造型。

为何锁定铸造可以被信任呢?

是由于区块链上的合约具有不可更改特性,如果不留后门的话,甚至一旦部署将无任何方式可以影响他的运作,正如无聊猿官方自己将所有权限转入0地址,放弃所有权后,无任何方式可以进一步铸造出新的猴子,其流动性总量将被锁死。

同理的,不同公链之间虽然合约不同,但如果在以太坊上用合约锁住10个ETH,在另一条公链上也以同样有公信力的合约,来释放10个wETH,这样一来其实全局上流动性是固定的,只要wETH可以随时转回以太坊并兑换得到ETH,那wETH就可以被认为是具有了ETH的等同价值。

因此其核心的操作就是

  • Lock-and-Mint:A链锁定代币流动性 + B链发行等量的可流通包装代币

  • Burn-and-Release:B链销毁包装代币 + A链解锁等量基础代币的流动性

  • 公证人:负责发现A链Lock锁定事件后,去B链Mint铸造出锚定代币,转入目标地址。

【Horizon桥的流程示意图,来自官方github】

有锁定自然衡量各个跨链桥规模的最佳方式就是TVL(总价值锁定),可以显著看到6.24之后,Horizon的TVL瞬间跌入谷底,当安全事故来临再多的TVL也就如流水一般,蜂拥而至也一哄而散。

【Horizon链桥TVL图,来自dune】

2、Horizon桥的合约审计报告解读

一次事故对很多Web3项目而言,做不到100%安全就基本等于0的价值,因此为了检查合约的安全性,一般会测试模拟多种攻击场景,通过checklist进行安全审查,以确保合约安全

开发或许几天而已,但要足够可靠则流程多且昂贵(一般报价按时间衡量10W刀起步)

审计报告的核心信息是:风险名称、漏洞描述、风险等级、安全建议、修复状态及审计结果等

而Horizon桥的合约审计报告是老牌审计公司PeckShield进行的,发现了5个漏洞风险

2.1、中低风险点1-兼容不足

是不是很难想象区区3行代码都能有bug?

其实锁定token的逻辑很简单,就是用户制定金额和目标地址,在授权代扣权限后,合约将USDT转入此合约锁定,并发出一个locked事件,让链下的公证人可以得知资产已经被锁定了。

function lockToken(uint256 amount,address recipient)public{  ethToken_.safeTransferFrom(msg.sender,address(this),amount);  emit Locked(address(ethToken_),msg.sender,amount,recipient);}

但PeckShield审计发现LockToken锁定函数对通缩型token是不兼容的,用户传入的amount如果是100,自然Locked事件发出的是成功锁定100个

但是如果是”通缩型“的token呢?进行safeTransferFrom 的过程中amount变少了怎么办?这就会出现锁仓额低于B链释放额的风险

可看前文:【源码解读】你买的NFT到底是什么?

标准协议中都会以虚函数为钩子的方法,在转移前后增加逻辑,有些token则可能在这里_beforeTokenTransfer增加交易损耗,从而控制流通量实现通缩。

当然harmony最后肯定是修改优化了,采用转移前后两次读取balance的方法来算出实际锁定额。

2.2、中低风险点2-异常锁定

还是这段代码,是不是很难想象区区3行代码不仅有BUG,而且有2个!

可看前文:【源码解读】你买的NFT到底是什么?

为了安全的Mint,其实标准协议是禁止向0地址mint的,如果lockToken 的时候目的转入地址recipient 填写为0地址,则会B链上铸造失败,造成锁入此合约但无跨链效果,如果此金库合约没有预留合适的转出方法则会永久锁定。

2.3、高风险点

铸造解锁等函数的调用者为单签账户

在原先程序里,Mint铸造资产unlock解锁释放,都是只能指定公证人进行。

这也正是本次中招的原因,harmony是最终将公证人改了多签钱包,但只不过只改成3个,其中2个私钥被盗就可以横行无忌。

《PeckShield对Horizon桥的审计报告》

怎么说呢,你说他改了吧总觉得有些敷衍,甚至黑客盗出资产的时候,harmony桥依旧在运作中,意味着他的私钥甚至是明文保存被黑客拷贝走的。

3、黑客盗取过程

通过合约审计报告的解读可以发现,原来跨链公证人的权限如此之大,只有他可以进行铸造和释放,而黑客事件发生的时候,看他交易操作就能分辨出来被盗原因

区块链浏览器使用指南见:当我们在看Etherscan的时候,到底在看什么?

3.1、关键信息

攻击者钱包

  • wallet1:0x0d043128146654C7683Fbf30ac98D7B2285DeD00

  • wallet2:0x9E91ae672E7f7330Fc6B9bAb9C259BD94Cd08715

  • wallet3:0x58f4baccb411acef70a5f6dd174af7854fc48fa9

跨链桥相关地址

  • MultiSigWallet:0x715cdda5e9ad30a0ced14940f9997ee611496de6

  • ETH的金库地址:0xF9Fb1c508Ff49F78b60d3A96dea99Fa5d7F3A8A6

  • ERC20金库地址:0x2dccdb493827e15a5dc8f8b72147e6c4a5620857

  • 被盗公证人地址:0x812d8622c6f3c45959439e7ede3c580da06f8f25

3.2、盗取过程分析

盗取13100个Ether,详情见交易Link(附录引用)

执行的是确认某个交易ID(多签投票中的一环)

公证人确认->等待确认的公证人数量达标->解锁金库资产转入目标地址

在多签合约合约代码里逻辑可以看出,这个函数会进行notConfirmed 判断,因此只有系统之前设置过的公证人地址可以调用

后续会执行executeTransaction 方法,再调用 isConfirmed 方法做判断,如果认证这笔交易的管理员数量达到2位,就会内部调用EthManager 合约的 unlockEth 方法,最终将 ETH发送至攻击者钱包。

至此很明显,除了私钥被盗,如此简单明了的合约不会有什么特别的犯错可能性了。

顺道看了下现在跨链桥的ETH金库的余额还有94个Eth,ERC20的金库还有30W刀的各类代币

4、思考总结

4.1、盗者会如何?

虽然马上harmony开出了100W美金,提出黑客归还资产并承诺不追究责任,但即使黑客归还且官方不追究也会有其他社会团队做公诉,因此黑客的最佳路线只有想尽一切办法为被盗资产脱敏。

截至 6 月 29 日,攻击者已将大约 35,000 个以太坊(约合 3900 万美元)转移到 Tornado Cash,这是一种常见的混币器,虽然区块链是账本公开,任何交易均可被追踪,但是混币器犹如为100个人集合交易,并不能准确得出哪笔资金最终落到哪个人手里。

4.2、如何更安全?

harmony对多签的实现是每笔投票均上链,或许是出于成本的考虑所以他的公证人只有3位,当初的降本优化造成了满盘皆输

要优化可采用分布式托管的方法,托管给MPC (Multi-Party Computation)公证人网络,不超过一定比例的节点同时作恶即可保证安全

即使公证人稀少也可以参考雪崩桥采用的SGX可信计算技术

Avalanche Bridge:用英特尔SGX保护跨链资产

本质上还是对安全重要性的淡漠,在跨链桥的开源代码中写的执行计划,2年前就实现了可用的链桥,却迟迟不进一步优化。

引用:

iosg-跨链桥方案一览,谁能汇聚多链流动性

Horizon桥官方GIT:https://github.com/harmony-one/ethhmy-bridge

Horizon链桥TVL图:https://dune.com/queries/118245

盗取交易Link:

https://etherscan.io/tx/0x27981c7289c372e601c9475e5b5466310be18ed10b59d1ac840145f6e7804c97

《PeckShield对Horizon桥的审计报告》

https://docs.harmony.one/home/general/bridges/horizon-bridge/audit

《Avalanche Bridge:用英特尔SGX保护跨链资产》

https://medium.com/avalancheavax/avalanche-bridge-secure-cross-chain-asset-transfers-using-intel-sgx-b04f5a4c7ad1


写在最后:

前文回顾

【源码解读】新标准4907是怎样实现NFT租赁的?

【解密】OpenSea免费创造的NFT都没上链竟能出现在我的钱包里?

【源码解读】你买的NFT到底是什么?

EIP-5058 能否防止NFT项目方提桶跑路?

当我们在看Etherscan的时候,到底在看什么?

当奈飞的NFT忘记了web2的业务安全

欢迎你从后台提交技术问题

关注十四,用技术视角带给你价值

这篇关于【解读合约审计】Harmony的跨链桥是如何被盗一亿美金的?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335508

相关文章

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

速通GPT-3:Language Models are Few-Shot Learners全文解读

文章目录 论文实验总览1. 任务设置与测试策略2. 任务类别3. 关键实验结果4. 数据污染与实验局限性5. 总结与贡献 Abstract1. 概括2. 具体分析3. 摘要全文翻译4. 为什么不需要梯度更新或微调⭐ Introduction1. 概括2. 具体分析3. 进一步分析 Approach1. 概括2. 具体分析3. 进一步分析 Results1. 概括2. 具体分析2.1 语言模型

Linux内置的审计跟踪工具:last命令

如果你是一个服务器管理员,你或许知道你要保护你的服务器的话,不仅是从外部,还要从内部保护。Linux有一个内置工具来看到最后登陆服务器的用户,可以帮助你保护服务器。   这个命令是last。它对于追踪非常有用。让我们来看一下last可以为你做些什么。   last命令的功能是什么   last显示的是自/var/log/wtmp文件创建起所有登录(和登出)的用户。这个文件是二进制

单细胞降维聚类分群注释全流程学习(seruat5/harmony)

先前置几个推文~ 单细胞天地: https://mp.weixin.qq.com/s/drmfwJgbFsFCtoaMsMGaUA https://mp.weixin.qq.com/s/3uWO8AP-16ynpRQEnEezSw 生信技能树: https://mp.weixin.qq.com/s/Cp7EIXa72nxF3FHXvtweeg https://mp.weixin.qq.

Open-Sora代码详细解读(1):解读DiT结构

Diffusion Models专栏文章汇总:入门与实战 前言:目前开源的DiT视频生成模型不是很多,Open-Sora是开发者生态最好的一个,涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发,深入解读背后的原理。 目录 DiT相比于Unet的关键改进点 Token化方