2021-08-15 02:01 | 出处: 行走
本篇笔记来自8月11日晚巴比特8问大事件的直播。直播分上下半场,上半场由主持人贾小别采访被黑客攻击的Poly Network上的一位受损当事人。下半场是由来自安全公司BlockSec的联合创始人,浙江大学网络空间安全学院的教授、博导周亚金教授对Poly被盗事件做了相对完整,虽然技术但基本能看懂的复盘。笔记会分上、下两篇呈现。同时行走也会把这一事件后续进展中一些大咖的评论贴在笔记后面供大家参考。
以下,Enjoy:
主持人:接下来连线周亚金教授。周教授是浙大网络空间安全学院的教授,近期加入到了区块链行业,是一家专注安全研究的公司BlockSec的联合创始人。请周教授和大家打个招呼。
周亚金:我之前主要的研究方向在区块链安全,也包括了隐私计算和系统安全。在区块链安全的行业,从18年开始到现在,陆陆续续我们也研究了三年多。18年当时区块链的生态还没有那么丰富,区块链从过去比较简单的游戏和博彩类的应用逐渐上升到今天有了比较丰富的Defi生态。我们是一步一步的看着区块链,包括以太坊的公链一步步起来的。
我们也发现在这个过程当中,安全其实是一个非常重要的因素。很多人说区块链就是安全。因为区块链、特别是在Defi上,有很多的资金的属性在里面。对于虚拟货币和数字货币,安全事件的频发会给用户带来非常大的损失。这也是这一次Poly的安全事件所带给我们的警示。
安全在区块链里应当放到非常非常重要的地位。包括前一阶段国外的Defi项目,200个million USDT的损失还是非常大的。在目前,整个区块链行业还是需要安全这么一个比较强属性的东西来支撑的。
主持人:下面我们来讨论下Poly Network被盗的事情。我是在事件发生的第一时间通过朋友联系到周教授。你们当时就在跟踪。
根据你们跟踪的结果,这次被盗事件是不是一次有预谋的行动?黑客从开始发起攻击,做了哪些操作?有哪些操作比较关键,他的目的是什么?
周亚金:这个事件我们是从8月10日晚上8点多钟第一时间知道以后,团队就一直在分析。在差不多不到24小时的时间里,我们对整个攻击的了解是越来越深的。
到现在为止,攻击漏洞最本质的那个点大家都还没有找到。虽然网上现在有很多版本的报告,但实际上最终的真相和最终的漏洞,大家都还没有找到。
我们现在还在分析,已经快接近真相了。我会用一个PPT把整个的攻击的过程和原理给大家分享一下。
首先我先简单介绍一下Poly Chain,它其实是一个跨链的聚合器。现在有很多条不同的公链,包括BSA、以太坊以及其他的一些链,在链上会存在不同的数字资产。这就带来一个需求,我的数字资产如何在不同的链之间去交换和传递。
Poly就是一个跨链的解决方案。用户可以通过Poly的网络,可以在不同的链上实现资产的流转。
我在左边引用的是整个Poly官方给出的文档。这里介绍Poly协议的流程,和后面我们分析攻击原理还是比较相关的。
我们假设有一个用户,他在这个以太坊上想用一个ETH转账到目标链上的代币要怎么做呢?
用户首先会去调用以太坊链上的智能合约,把把他的ETH资产锁在这个智能合约里面。然后Poly有个名为“Relayer”的中继器,会把这样一个交易传播到目标链上。在整个传播的过程当中,它必须要对交易的合法性做很多的校验。
第三步,在目标链上同样有一个Poly的合约。这个合约会去调用一个unlock的
函数。unlock的操作做什么呢?它是把用户锁在以太坊上的一个ETH,换算成目
标链上相应资产的余额,转到目标链的代币里。
这样通过Poly Chain,我们就完成了资产从以太坊目标链的转换。在整个过程当中,Poly其实有很多安全的考量,它需要校验整个交易的合法性。
由于在跨链的过程当中,涉及到的交互还是比较复杂的。涉及到用户和合约之间的交互,合约和链的交互,链和Poly之间的交互,Poly和Relayer之间的交互,Relayer和目标链之间交互。所以它整个交互的链条还是比较长的。
从最基本的安全设计来说,为了保证在整个跨链时候的交易安全性,我们需要对跨链的消息进行签名校验。Poly在整个的设计当中,是成立了4个校验者。因此攻击者其实是没有办法去伪造消息,直接发送给目标链,从而完成提币和转账的操作。
正因为有了这些校验,攻击者如果想完成攻击过程。他基本上需要做两件事情:
第一件事情,要绕过这些校验;
第二步,是在绕过校验过程之后,可以发送任意的提币的交易。
在去做绕过校验的时候,通常也有几种不同的方法:
1、整个链在设计的时候,密码学的算法本身存在着漏洞。用来去做签名校验的算法本身有一些后门或者漏洞,被攻击者知道了;
2、算法实现可能有错误。签名校验的加密算法可能没有问题,但是因为算法实现存在漏洞,那攻击者可以去利用它;
3、用来签名消息的私钥,可能存在私钥泄露的隐患。攻击者实际上是可以用已经泄露的私钥去签名出来各种各样任意的交易消息的;
4、修改签名交易者的公钥。我们在做校验的时候,必须要使用预先预置好的一些公钥去对消息去做校验。如果攻击者有某一种方法能去修改签名校验的公钥,就可以把公钥修改成攻击者自身所控制的公钥。这样就可以用自己所拥有的私钥去签署消息;
我们在分析攻击的时候,是从外部的角度来看,最后看到的都是面上的交易信息。在链下的,包括Poly Chain网络内部的一些操作,我们是看不到的。
所以我们在10号晚上,只是看到了有一笔合法签名的提币交易在链上了,并且整个签名校验的过程确实都过了。而且在签名校验的过程中,我们发现用来校验的公钥只有一个。所以当时安全界有很多很多的猜测。当然后来进一步的研究发现,其实攻击者是通过第四种方法,去修改了签名校验的公钥。
问题是他是怎么去修改的呢?
校验者公钥实际上是存在某一个合约的一个变量里面。而能去修改这个变量的合约又是特定的。也就是说不是谁都可以去修改这个变量的。那攻击者是如何达到修改签名校验者的公钥呢?
我们再回到一开始讲的。如果要让一个资产从以太坊的链到另外一个链转移,它需要进行哪些步骤。略过前面的步骤得不讲,我们就讲最后一步。最后一步是比较关键的。
在目标链上如果需要完成资产的转移,需要调用一个“unlock”函数去完成资产的转移。但是如果攻击者通过某一种方法,调用的不是“unlock”的方法,而是某一个其他的方法,并且这个方法本身就有权限能去修改校验的公钥。攻击者就可以通过恶意的调用,修改公钥的函数,从而替换签名调用的公钥。把签名调用的公钥替换成攻击者控制之后,后面就可以任意的发送提币的交易。
这些是大家都掌握到的信息。我们继续做了一定的追踪,发现了为什么攻击者可以通过不调用“unlock”函数,而是通过调用一个特定的函数去完成修改公钥的操作。
我们发现,攻击者最初的攻击交易,是从ONT(本体)这个链发过来的。攻击者是从ONT上发出了一个精心构造的恶意交易。这个精心构造的恶意交易的唯一目的就是去修改在以太坊上用来做签名校验的公钥。
但是这个交易本身是合法的。这个交易本身是合法的在ONT上的交易。但为什么会有一条合法的交易到ONT的链上?目前大家都还不知道。我们也在看ONT链上本身的合约以及链的实现。
我们比较怀疑可能是ont链上Poly Network的合约有问题。或者ONT本身去做跨链的接口有问题。导致攻击者可以恶意、精心构造这么一个交易,最后来完成对密钥的替换。具体的详细过程我们还在分析当中。
为什么8月10日很多的媒体和安全公司都认为Poly Network的keeper只有1个公钥?实际上确实是这样。因为它原先是有4个公钥,但是被攻击者修改成只有一个公钥,所以从最后攻击的交易来看确实只有1个公钥。
我们