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

By [十四君](https://paragraph.com/@shisi) · 2022-07-12

---

**G内容概要**

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

这到底是怎么回事?

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

*   跨链桥分类与技术原理
    
*   Horizon合约审计报告解读
    
*   被盗原因复盘分析与总结
    

* * *

一、跨链桥技术原理
---------

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

![《来自ios的跨链方案，多链流动》](https://storage.googleapis.com/papyrus_images/f973d67a4c3adae7524de517810d13b7ac9f03f9bbf30ea1b6d1c233ed9ddb32.jpg)

《来自ios的跨链方案，多链流动》

### 1.1、跨链方案有哪些？

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

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

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

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

*   交易所做担保型：比如币安提币，各种买卖均在中心化交易所进行，提币才兑现
    
*   流动性池桥接型：比如bridge.connext，o3swap
    
*   合约锁定铸造型：各类官方桥通用方案polygon/arbitrum/avax/celer，以及今天的主角harmony
    

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

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

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

![《流动性转换与交易量，来自o3swap官网》](https://storage.googleapis.com/papyrus_images/9af10308b65eedf7bbd6fa7b5e1bff79a5ffee2dab5742f3af8cf205f1958e91.jpg)

《流动性转换与交易量，来自o3swap官网》

### 1.2、Horizo​​​​​​​​​​​n桥的跨链原理

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】](https://storage.googleapis.com/papyrus_images/8b1b6e9bcd3fa0952d96682321000cf326cf7b31325decbabb0b977e63030dd8.png)

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

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

![【Horizon链桥TVL图，来自dune】](https://storage.googleapis.com/papyrus_images/780e275f0f164b11e398340b37173ac31c7fa34249b6e4daed2c4fbb2bebbde6.png)

【Horizon链桥TVL图，来自dune】

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

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

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

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

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

![](https://storage.googleapis.com/papyrus_images/5821060ddacb8bfd4adc4b146c81cfce6adaf5b22805a5e0c501798a3ef304fb.png)

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

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

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

![](https://storage.googleapis.com/papyrus_images/fecfd3e9cebc4b66b26c6e4793685d2339ddd084cb70e71badc62c7308d870dc.png)

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

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

可看前文：[【源码解读】你买的NFT到底是什么？](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483815&idx=1&sn=5f91df631b450944739419be185e597c&chksm=e83aa67ddf4d2f6bf24b9f6139bd685db9b5f3ff5a131f84c179a5166ad42337f0b2aabe0bf0&scene=21#wechat_redirect)

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

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

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

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

可看前文：[【源码解读】你买的NFT到底是什么？](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483815&idx=1&sn=5f91df631b450944739419be185e597c&chksm=e83aa67ddf4d2f6bf24b9f6139bd685db9b5f3ff5a131f84c179a5166ad42337f0b2aabe0bf0&scene=21#wechat_redirect)

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

### 2.3、高风险点

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

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

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

![《PeckShield对Horizon桥的审计报告》](https://storage.googleapis.com/papyrus_images/6a0108601ad3c0e42dfd5ff5cecdcd2a4930d7d8dbe30feb62183978213aaadd.png)

《PeckShield对Horizon桥的审计报告》

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

3、黑客盗取过程
--------

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

区块链浏览器使用指南见：[当我们在看Etherscan的时候,到底在看什么?](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483782&idx=1&sn=ff4604617e9409f844bf60a37f96543e&chksm=e83aa65cdf4d2f4ad58a90069649bce2dc1678c3bf216cbe44205d5f0f0632186a6fdfb92587&scene=21#wechat_redirect)\*\* \*\*

**3.1、关键信息**

攻击者钱包

*   钱包1：0x0d043128146654C7683Fbf30ac98D7B2285DeD00
    
*   钱包2：0x9E91ae672E7f7330Fc6B9bAb9C259BD94Cd08715
    
*   钱包3：0x58f4baccb411acef70a5f6dd174af7854fc48fa9
    

跨链桥相关地址

*   多重签名钱包：0x715cdda5e9ad30a0ced14940f9997ee611496de6
    
*   ETH的金库地址：0xF9Fb1c508Ff49F78b60d3A96dea99Fa5d7F3A8A6
    
*   ERC20金库地址：0x2dccdb493827e15a5dc8f8b72147e6c4a5620857
    
*   被盗公证人地址：0x812d8622c6f3c45959439e7ede3c580da06f8f25
    

### 3.2、盗取过程分析

盗取13100个Ether，详情见交易Link（附录引用）

![](https://storage.googleapis.com/papyrus_images/9a527fbbb00e0ab65af873dc04e417e2e582f6608a598b827dfa864d2548d17e.png)

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

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

![](https://storage.googleapis.com/papyrus_images/3f0c454ebe6cbeb0fd4ddba15196e9d970b4fefd9428d7c03977cf9cd3ec4085.png)

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

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

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

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

![](https://storage.googleapis.com/papyrus_images/cf5759dade26385d5a020b2fa738cdf266ab6150f831442c2ddc87965b0fb273.png)

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保护跨链资产》](https://storage.googleapis.com/papyrus_images/3e7ad5f118f6e63bc12f429521f7423998dad52791d6077cef60d9f33133e4dc.png)

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

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

引用：

iosg-[跨链桥方案一览，谁能汇聚多链流动性](https://mp.weixin.qq.com/s?__biz=MzUzNjk5MzI5Nw==&mid=2247488009&idx=1&sn=aebba103e525b0eadf9277b23f0a3ae0&scene=21#wechat_redirect)

Horizon桥官方GIT：[https://github.com/harmony-one/ethhmy-bridge](https://github.com/harmony-one/ethhmy-bridge)

Horizon链桥TVL图：[https://dune.com/queries/118245](https://dune.com/queries/118245)

盗取交易Link：

[https://etherscan.io/tx/0x27981c7289c372e601c9475e5b5466310be18ed10b59d1ac840145f6e7804c97](https://etherscan.io/tx/0x27981c7289c372e601c9475e5b5466310be18ed10b59d1ac840145f6e7804c97)

《PeckShield对Horizon桥的审计报告》

[https://docs.harmony.one/home/general/bridges/horizon-bridge/audit](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](https://medium.com/avalancheavax/avalanche-bridge-secure-cross-chain-asset-transfers-using-intel-sgx-b04f5a4c7ad1)

### 前文回顾

[【源码解读】新标准4907是怎样实现NFT租赁的？](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483830&idx=1&sn=9f0002c75b0168b44cba7331a0f115e0&chksm=e83aa66cdf4d2f7af04313b44143f23b1874b851a079cd793f6837346279d26cbf035602b33e&scene=21#wechat_redirect)

[【解密】OpenSea免费创造的NFT都没上链竟能出现在我的钱包里？](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483828&idx=1&sn=a2a1f38dcfa456738707b9f8219cf805&chksm=e83aa66edf4d2f78c2b2c271262064f37dea2f3e412e0b073e2cbd4529fa025d3ed93d530802&scene=21#wechat_redirect)

[【源码解读】你买的NFT到底是什么？](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483815&idx=1&sn=5f91df631b450944739419be185e597c&chksm=e83aa67ddf4d2f6bf24b9f6139bd685db9b5f3ff5a131f84c179a5166ad42337f0b2aabe0bf0&scene=21#wechat_redirect)

[EIP-5058 能否防止NFT项目方提桶跑路？](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483797&idx=1&sn=8bdd641eb4316baad1e91fb0e815c613&chksm=e83aa64fdf4d2f59e8f76f5dd54c1c287b230a2201fd80e9d21b8752fdd53c02494beff533ef&scene=21#wechat_redirect)

[当我们在看Etherscan的时候,到底在看什么?](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483782&idx=1&sn=ff4604617e9409f844bf60a37f96543e&chksm=e83aa65cdf4d2f4ad58a90069649bce2dc1678c3bf216cbe44205d5f0f0632186a6fdfb92587&scene=21#wechat_redirect)

[当奈飞的NFT忘记了web2的业务安全](http://mp.weixin.qq.com/s?__biz=MzIyMTQ5MTg5Mw==&mid=2247483761&idx=1&sn=0ebe04a3611d8ad2bde5045a862324e3&chksm=e83aa6abdf4d2fbd476a402c6fb697b6d3086721a66f217d659e45ddd1835a45885b969b5161&scene=21#wechat_redirect)

![](https://storage.googleapis.com/papyrus_images/28c05ac12f7b2fdc4d2a11b92a232583f9989aed5d010c1374f74f3b79c97ce8.bmp)

---

*Originally published on [十四君](https://paragraph.com/@shisi/harmony)*
