当前位置:首页区块链贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同

大家好,我是Parity Asia技术总监姚琦。感谢万向区块链邀请您与您分享与区块链有关的安全和隐私问题。我目前在Parity负责亚洲特别是中国的Web3.0的技术和社区开发。 Parity主要是作为以太坊Rust客户,目前正在开发区块链框架Substrate和跨链网络Polkadot

今天,我将分享一些在过去几年中遇到的针对区块链的攻击的示例,以向您展示不同的区块链安全和隐私问题。

一是恶意攻击。这些攻击大多数都是与区块链相关的智能合约攻击,每个人通常都会受到这种攻击。

二是理性进攻。通常情况下联系很少,也就是说,攻击者如何在游戏规则内使用某些方法来**化自己的利益。具体示例是挖矿池和矿工。

第三,隐私攻击。根据针对Monero和Zcash的攻击,我们将简要介绍当前隐私区块链系统的问题。

在过去的几年中,从比特币以太坊,区块链系统已经从最初的分布式分类帐功能慢慢演变为现在的分布式计算机。早期,每个人只能使用在线电子支付或跨境支付,但是现在链上有各种智能合约和操作逻辑,每个人都可以轻松地在以太坊和其他区块链平台上执行编程和操作。

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同

如上所示,您可以看到不同的节点当前包含其他程序(如智能合约)的处理能力。左侧的用户可以使用键对数据签名,然后将事务发送到该节点。处理完事务后,该节点将更新相应的状态,以生成广播到其他节点的块。其他节点将执行操作和验证,然后写入本地区块链。这样的分布式系统是相互关联的,从而确保来自不同国家和地区的用户可以在此世界计算机上进行操作和计算。

具有如此强大功能的分布式计算机听起来很酷,但是从安全性的角度来看,系统支持的逻辑功能越多,它所具有的安全风险就越大,这就是为什么比特币系统的安全性相对较低。方有一个更好的原因。

查看以太坊的主要安全事件,您会发现,如果经常暴露区块链平台上的安全问题,也会损害大量开发人员和一些初创公司在平台上部署商业应用程序的信心。

当我们看另一种区块链平台EOS时,我们显然可以感觉到相应的安全事件实际上与相应的价值更相关。无论是链本身还是智能合约的无休止的安全问题,总体而言,每个人都更倾向于选择高度去中心化且更安全的区块链平台来部署自己的业务逻辑。

过去一年中发生了各种DeFi攻击。实际上,这也为众多区块链开发者敲响了警钟。在启动各种新功能之前,您必须进行安全审核以确保您没有在线功能。较大的安全性问题。

恶性攻击

接下来,我们研究恶意攻击,特别是与智能合约有关的攻击。

再入攻击

2016 DAO问题和最近的DeFi问题是类似的攻击。攻击者编写了相应的恶意智能合约,调用了受害人的合同,同时使用自己的回调函数周期性地调用了受害人的合同代码。由于它反复输入受害者的合同以执行导致漏洞的相应代码,因此称为“再入攻击”

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同1

如上所示,右侧是恶意智能合约,左侧是普通智能合约。如果正常的智能合约是按照左边的逻辑,那么它实际上应该从上到下执行withdrawBalance,然后用以太坊进行转账,**更新相应用户的余额。

但是,恶意合约的执行逻辑是首先启动取款功能,调用withdrawBalance函数,然后左侧的普通智能合约将调用相应的withdrawBalance,以太坊转移。一旦转移完成,由于以太坊的特性,它将调用恶意智能合约中的回调函数,并且回调函数将进一步调用左侧的withdrawBalance。

总体而言,根据该箭头,一二三四,形成了一个循环。结果是,恶意合约发起呼叫后,只要左侧智慧合约的燃油费足够大,并且可以继续以这种方式转移资金,并将左侧智慧合约中的余额转移到攻击者的地址,并且如果有余额,所有余额最终将转移给相应的攻击者。

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同2

这是简化的流程图。您可以查看实际的代码。左侧是普通的智能合约,右侧是攻击者的智能合约。攻击者的智能合约在右上角启动,调用左侧的withdrawBalance函数,然后调用call.alue(),call.alue()触发恶意智能合约的默认应付款回调函数和默认回调功能将进一步触发循环,直到左侧整个智能合约的所有余额都转移给恶意攻击者为止。

由于再入攻击,DAO合同当时在ETH中损失了超过6000万美元。区块链具有不可篡改的特征,此类交易无法回滚,造成的损失是**的。当时,社区想修复这样的漏洞以返回相应的以太损失,而一些社区成员不希望这样做,这最终导致当时的以太坊分叉,而该分叉现在被称为ETC /以太坊经典

不会忘记过去,但很多时候人们会忘记历史的老师,即使它与安全息息相关。在最近的DeFi或LendF.me攻击中,我们在2016年看到了类似的重入攻击。由于此过程实际上比2016年的前一次攻击复杂得多,因此,这里有一个简化的解释。

Lendf.me存款函数在回调函数中通过撤回而反复调用,导致攻击者在智能合约中攻击的抵押贷款总额在没有足够抵押的情况下继续上升。这等效于调用此循环,即使攻击者没有相应的抵押品,也可以使其总抵押贷款金额增加,这最终导致攻击者积累了与imBTC对应的足够抵押品金额。然后,攻击者借出了所有可用资产,超过2500万美元。当然,幸运的是,攻击者通过某些方法归还了相应的资产,这也是不幸的。

再入攻击很严重。有哪些防御措施?实际上,您可以在进行传输之前设置内部状态。例如,当一个智能合约想要向用户转移10 ETH时,在转移与该用户相对应的余额变量之前,减去对应的10 ETH然后进行交互式转移,可以避免这种攻击。这是一个很好的规范。首先检查,然后执行,然后进行交互。

溢出攻击

我想与您分享的另一种攻击也是过去几年中一种相对常见的攻击,称为“溢出攻击”众所周知,无论开发人员对算术运算(尤其是整数溢出)进行不正确的操作,程序员无论使用C ++还是JaaScript,都将超出范围。当超出整数类的**范围时,该数字将从**值更改为最小值或直接返回零,这称为“溢出”相反,超出最小值的范围称为“下溢”

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同3

上图是一个示例。可以看出,攻击者发送了很多交易,_alue的对应值特别大。特别是对于第257行,当_alue特别大时,如果cnt大于2,则数量直接溢出到零,从而使所有后续安全检查都通过。通常不应该通过第259行的第二次检查,但是由于溢出量已变为0,因此左侧的balances [msg.sender]的值必须大于或等于零,从而导致安全检查。最终,攻击者成功地获得了大量数字资产,即使他自己的余额可能很小。

对于其他一些示例,您可以检查multiOerflow(CVE-2018-10706),transferFlaw(CVE-2018-10468),proxyOerflow(CVE-2018-10376)。攻击者通常使用智能合约的溢出漏洞来创建可能导致溢出的交易,然后使用溢出的变量通过智能合约的安全检查并最终获得巨额资产。作为一种防御措施,开发人员尝试使用保证计算安全性的库,例如SafeMath。

所有权攻击

所有权攻击是指攻击者篡改了智能合约功能的所有权。在某些攻击中,某些功能设置了只有所有者才能看到的访问控制。但是,谁可以成为所有者?此功能不实现访问控制。任何人都可以将交易发送到智能合约以将自己设置为所有者,然后可以操纵其他功能。

另一个例子是,任何人都可以调用公共职能,然后将其自己的地址设置为CEO的地址。一旦您的地址成为CEO的地址,您就可以执行CEO相应权限的操作,这可能会很高。允许执行任何操作。所有权攻击利用程序开发过程中访问控制设计中的漏洞来进行相应的攻击。

拥塞攻击

除了利用智能合约中的漏洞进行攻击外,某些攻击实际上还基于区块链本身的特征。最有趣的攻击类之一称为“拥塞攻击”例如,Fomo 3D,Fomo 3D是过去几年中非常流行的彩票游戏,最终获得密钥的人几乎可以获得合同的所有ETH。游戏规则是什么?每个人都可以在有限的时间内购买钥匙,并且每一轮钥匙的价格都会继续上涨。如果用户在限定时间内参与购买钥匙,则下一轮将继续。直到本轮比赛为止,没有人在有限的时间内购买钥匙,而上轮购买钥匙的用户才是**的赢家。

Fomo3D的第一轮胜利者也是一名攻击者,他获得了10,000多以太坊的奖励。在正常情况下,游戏规则是相当公平的,用户会在**一轮获得最终奖励。但是,攻击者发现了以太坊本身的拥塞问题,并通过自己的行动获得了更大的成功空间,从而使他成为最终的赢家。

以太坊是什么样的漏洞?实际上,这不是以太坊的漏洞,而是它的特点。

首先,以太坊本身的吞吐量不是特别高,每秒只能处理10至20个事务。当然,现在它相对较高,以太坊2.0将来可能更高。

然后,每个区块都有一个相应的燃料限制,以确保以太坊节点不受拒绝服务攻击。胜利者和攻击者利用这两个特征:低吞吐量和有限的燃料。他进行了很多高费用和油耗的交易,因此智能交易无法处理其他交易对手的交易。最终,他只用自己的高费用来处理交易,以确保他在上一轮和下一轮中都获得了钥匙。如果其他人的交易无法达成,他将在有限的时间内成为最终的赢家。

攻击者获得密钥后,他发送大量消耗燃料和高额费用的交易,从而在下一个区块中仅产生少量交易。超高的手续费允许获胜者允许其交易由节点打包。当节点仅处理超高手续费交易时,燃料耗尽,其他交易无法进入。**,攻击者成为**一轮的获胜者。

如果平台吞吐量增加,会有所改善吗?攻击者将无法攻击吗?其实并不是。您可以观看另一个区块链平台EOS,EOS上有一个EOSPlay游戏。该游戏将Future块的哈希值用于随机数计算。通常,用户不确定将来将哪些交易放入区块链。但是,在拥塞的情况下,攻击者可以操纵future块中包含的交易并预先计算随机数。在实际攻击中,攻击者在CPU价格非常低时会购买大量CPU资源,产生大量交易,并允许相应的智能合约处理交易。

由于攻击者购买了大量的计算资源,因此当时的EOS平台比较拥挤,最终智能合约和节点在执行操作时仅在对应的块中计算了攻击者的交易。由于这些块中的事务是由攻击者进行的,因此攻击者可以执行简单的排列和组合,然后计算排列和组合中的事务,以计算可能提前出现的随机数,从而获得优于其他正常值的优势。用户。最终,攻击者花费了约210,000个EOS,但获得了超过240,000个EOS,而利润约为28,000个EOS。

有什么防范这些恶意攻击的措施?

1.在链上开发逻辑时,请遵循某种安全范式,例如在调用外部智能合约之前更改变量。

2.使用成熟的安全库,例如SafeMath库,并尽量不要自己构建一些不熟悉的低级库轮子。

3.对于关键业务操作,请使用锁定机制并设置一个暂停开关。优点是,即使将来发生黑天鹅事件或遭受黑天鹅攻击,您也可以中止自己的智能合约并减少经济损失。

4.不要将链上的数据用作随机数,因为攻击者很可能在以后的区块中对信息大惊小怪,从而导致可以操纵随机数。

5.在启动任何功能之前,请执行第三方安全审核(至少两次)。

6.部署自己的链上逻辑后,您需要监视相应的链上智能合约。这样,可以及时发现问题并尽快解决。

上面提到的攻击,无论是重入攻击,溢出攻击还是网络拥塞攻击,都是恶意的。但是,某些攻击不是恶意的,只是为了**化自身利益。这也是区块链系统本身独特的攻击发展方向,有点像传统经济学和金融学中的博弈论。

理性攻击

下面我主要介绍块状癫痫发作和验证者困境攻击。

阻止癫痫发作

让我们从挖矿开始。每个人都知道,比特币本身是使用工作量证明进行挖矿的。通过计算哈希值,可以看到前面有多少个数字为“ 0”如果前几个数字为“ 0”,则说明该矿工挖出了一个新块。如果矿工想自己挖矿新的区块,那么硬件投资是相当大的,可能会有超过数亿美元的投资来购买挖矿机。

由于不同的矿工无法确定自己可以独立挖块,因此他们将联合起来形成不同的矿池。挖矿池的优点是可以分解难度,将大问题分解为小问题。

与Nonce一样,您可以将“ 11”的开头分配给一个矿工,而将“ 10”的开头分配给另一个矿工。每个矿工完成相应的计算后,相应的结果将返回给挖矿池的管理员。目前,超过90%的矿工加入了矿池,而矿池的存在使矿工的收入更加稳定。例如,您身边有90个矿工,其中一个挖矿了**一块,那么其他90个矿工可以根据自己的算力获得相应的奖励。

比特币联合挖矿协议看起来特别合理。矿工具有很高的算力和高回报。对于矿工而言,从直觉上讲,要遵守协议,收益应该是**的。

有什么办法可以攻击这种协议?在这里,我们将提到阻止癫痫发作。当“区块扣押攻击”**提出时,每个人都不同意,许多矿池运营商认为这不是一个大问题。然而,此后,矿池发生了一次癫痫发作,造成了超过20万美元的损失,使每个人都意识到原始的癫痫发作是真实的。

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同4

该图粗略地介绍了矿工是否可以参与不同的挖矿池,您可以参与左侧的挖矿池还是右侧的挖矿池。不同的挖矿池具有不同的优势,并根据您的算力获得相应的奖励。矿工实际上可以将其算力资源分配给不同的矿池,而他们想要实现的最终效果是**化利润。那么,如何合理分配整个算力资源,然后**化收益呢?

刚才提到的癫痫发作就是一个例子。作为普通矿工,只要矿池分配不同的任务进行计算并将结果提交给矿池即可。但是,即使挖出了通过比特币挖矿获得的区块,区块扣押攻击也不会向挖矿池报告,而只是向挖矿池报告先前计算的无效结果以进行报告。由于矿工与矿池共享先前计算的结果,因此矿池仍会根据矿工的挖矿能力支付相应的奖励。

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同5

比特币是一个零和游戏。这会使其他矿池更有利可图吗?有损失吗?

现在请拿出纸笔来计算一个非常简单的例子,攻击者拥有整个网络的25%的算力,受害者挖矿池拥有75%的算力,并将自己的算力分配给5%算力的一部分功率分配给了挖矿池,其余20%则由自身进行挖矿。接下来,开始了癫痫发作发作。攻击者占挖矿池中5%的算力,但是5%的算力实际上是在磨削外国工人。即使计算了相应的块,也不会告知挖矿池,所以挖矿池得到的结果无效。根据当前协议,矿工只要将相应的结果计算到挖矿池中,便可以获得相应的奖励,因此,挖矿池仍将按算力的5%分配奖励。

但是,由于这5%是外劳,因此整个网络的真实算力仅为95%,相应的攻击者占21%,而挖矿池则占79%。根据协议,正确的挖矿池将获得79%的奖励,其中79%* 5%= 4.9%将分配给魔阳宫的攻击者。攻击者本身也为正常挖矿获得了21%的奖励,总计达到25.9%。综上所述,如果攻击者按照协议正常运行,则25%的算力只能获得25%的报酬,但是如果实施了块抢占攻击,则他可以获得25.9%的报酬。

进一步分析区块扣押攻击,例如考虑不同情况,单个攻击者,单个矿池;单个攻击者,多个挖矿池;多个攻击者,多个挖矿池。经过大量计算,我们发现攻击者的算力越高,奖励就越高。同时,如果仅一个挖矿池被单独攻击,则奖励不会像攻击多个挖矿池那样高。这与我们通常的直觉不同。我们通常认为严格遵守游戏规则可以使利润**化。但是在这里您可以看到,矿工略微改变了挖矿方法,以实施区块扣押攻击,他们可以获得更多好处。

癫痫发作有什么解决方案?方法之一是将同一任务划分给多个矿工。一名矿工工作不佳,另一名矿工在挖矿比特币区块时将向挖矿池报告。您还可以更改还款计划或方法,例如,向已挖矿比特币区块的矿工提供更多奖励,并鼓励矿工根据协议进行挖矿。当然,也可以更改比特币协议,以便本地挖矿可以支持挖矿池挖矿。

验证者困境

验证者的困境在下面共享。

曾经有一段时间,有5%的比特币矿工挖矿无效区块。每个人都发现许多矿工在未验证区块的情况下进行挖矿,导致越来越多的人在无效区块上构建新区块,浪费了相应的算力,并且更有可能造成51%的攻击。

像比特币和以太坊一样,对矿工的大部分奖励都是通过工作量证明获得的,而一小部分是打包交易中的手续费。但是,在进行哈希操作之前,矿工需要验证相应的块是否正确以及交易是否正确。矿工作为验证者没有任何奖励。这导致矿工们认为在挖矿时散列更为重要。资源枯竭攻击强化了矿工的想法。

在资源耗尽攻击中,攻击者将一些消耗大量计算资源的事务发送给矿工,以便根据协议执行正常验证事务的矿工花费大量时间进行验证,而无需直接验证这些事务,并且直接打包交易以计算哈希以挖矿下一个区块挖矿器具有巨大的时间优势(例如,在上一次攻击中进行验证需要3分钟以上的时间)。

这导致了“验证者困境”如果矿工根据协议验证了交易并进行了冻结,那么他可以保证挖出的冻结没有问题,但同时,由于验证时间过长,因此挖矿时间要比进行挖矿的矿工晚。未核实,并且在挖矿方面处于不利地位;未验证的矿工将提前打包交易并具有挖矿区块的时间优势,但他们自己的区块可能会出现问题,问题区块将在将来被其他矿工或节点丢弃,从而导致其自身的计算功率。浪费。困境导致了矿工验证者的困境。是否应该对其进行验证?如果每个人都没有验证,那么系统更容易受到51%攻击。如果有人验证,有些人不验证,则不验证的人将具有更大的优势来查找下一个块。目前,没有更好的解决方案来解决验证难题。

隐私攻击

**,简要介绍了针对现有隐私区块链系统的攻击。

匿名是指在一组对象(匿名组)中,不能很好地区分对应的对象。在比特币交易中,A将资金转移到B。您可以清楚地看到此交易的接收者是B。我们可以通过某种方式隐藏接收者。例如,Monero可以将从A发送到B的交易与其他交易(“ Mixins”)混合使用,然后我们无法清楚地区分接收方是B还是CDE。通过混淆不同的事务,不清楚将A发送到B还是CDE。

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同6

早期的Monero并没有强迫每个发件人设置安全条件来保护用户隐私。这使一些粗心的用户认为Monero的隐私是默认的,但事实并非如此。而且由于匿名组还不够大,因此可以通过一些简单的计算快速计算出许多交易接收者。如图片底部的紫色箭头所示,C仅混合两个事务。由于上面的绿色箭头A已发送给B,因此C不可能将其发送给B。必须将其发送给D。中间的黑色箭头使许多交易混乱,但是由于先前的交易已经暴露,我们可以推断出最终收件人是E。

在过去的时期,尤其是在早期的Monero系统中,超过64%的发送者没有使用Mixins来设置多个接收者。超过63%的发送者甚至设置了多个接收者,但是他们可以根据以前的方法计算接收量。通过。当然,随着Monero隐私保护功能的逐步增强,使用现有的攻击方法来计算接收者变得更加困难。

众所周知,门罗币本身的隐私并不是特别好。谁在区块链世界中拥有**的隐私?是Zcash。 Zcash使用零知识证明来保护发送者和接收者的身份和数量。

贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同7

图中有几种特殊的交易:透明交易,A发送给B,每个人都知道号码,还知道发送者和接收者。然后,B将其发送给C进行匿名处理。由于存在匿名池,所以C向DEFG发送了一个匿名事务,没有人知道谁是真正的接收者。但是,DEFG有时可能希望取消匿名并将匿名身份转换为非匿名身份。

有趣的是,Zcash中超过85%的交易都是透明的,并且可以轻松计算存款/取款。少于1%的交易是匿名交易。 Zcash本身使用零知识证明。当前,零知识证明是一种相对安全的匿名方法。

许多研究人员和攻击者将专注于如何通过匿名化和取消匿名化事务来推断地址相关性。谁在使用匿名交易池?

1.矿工分为独立矿工和矿池。由于Zcash每个区块都有10ZEC的奖励,因此很容易区分奖励和区块接收者的地址。

2.创始人。每个区块都有2.5ZEC的奖励,地址是公开的,每个人都可以区分。

3.个人用户等。很容易将存款地址区分到匿名交易池中。超过80%的匿名存款交易来自矿工,并且创始人的交易步骤也非常明确。矿工直接从区块获得奖励,地址相对容易暴露。来自匿名事务池的地址不容易区分,并且大于90%的非匿名事务地址也很难区分。

通过分析,攻击者发现使用Zcash匿名化过程中存在一些有趣的操作,例如创建者行为。在许多情况下,创始人的存款为249.999ZEC,而存款为250.001ZEC。如果仅查看对应的值,则可以轻松地区分匿名时创建者的地址和匿名创建者的地址,因为这些值可以绑定。

挖矿池中还有一个非常有趣的行为。挖矿池将把资金转移到匿名交易池,但是当分配给矿工时,它将最终拥有自己的地址。这导致易于识别的图案。攻击者可以分析已知的矿池地址,并且同时有数百个其他地址。然后,交易必须属于挖矿池和矿工。

无论是Zcash还是Monero,很少有人可以很好地使用隐私保护系统。很多时候人们认为他们已经使用了隐私保护系统,因此保护效果应该很好。但实际上并非如此。每个系统都有一些相应的设置。如果您未设置为用户,则不能很好地保护相应的事务。

对于Zcash,可以根据以前的模区分69%的匿名交易,但是Zcash的基础加密技术是安全的,并且可以提供高度的匿名性和隐私性。前提是每个人都可以更正确地执行匿名操作,以确保他们没有使用那些明显的模式并被攻击者和研究人员发现。

“在区块链的世界中,除了违反规则的恶意攻击者之外,还有许多使用规则的利润**化者。”

例如,使用区块链平台阻止癫痫发作和拥塞攻击。每个人都没有违反规则,只是使用区块链本身的规则/平台特性来**化收益。在设计区块链系统和应用程序时,**能够考虑到我们的系统或程序是否没有漏洞供恶意攻击者破坏,同时尝试防止使用协议/规则来****地提高利益。其他。

**,我希望与您一起创建更好的方法来构建安全的Web3.0生态系统。

温馨提示:

文章标题:贾耀奇:攻击无处不在,区块链安全和隐私问题有些不同

文章链接:https://www.btchangqing.cn/30576.html

更新时间:2020年06月02日

本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。

区块链

火星第一线| Binance矿池排名上升至第八

2020-6-2 18:27:47

区块链

随着比特币的价格突破10,000,中国在计算能力中的领先地位能持续多久?

2020-6-2 19:24:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索