

今天,我将分享一些在过去几年中遇到的针对区块链的攻击的示例,并向您展示不同的区块链安全性和隐私问题.
首先是恶意攻击. 这些攻击大多数是与区块链相关的智能合约攻击,每个人通常都会受到这种攻击.
第二次,合理的进攻. 通常情况下联系很少,也就是说,攻击者如何在游戏规则内使用某些方法来最大化自己的利益. 具体示例是采矿池和矿工.
第三,隐私攻击. 根据针对Monero和Zcash的攻击,我们将简要介绍当前隐私区块链系统的问题.
在过去的几年中,从比特币到以太坊,区块链系统已从最初的分布式分类帐功能缓慢发展到现在的分布式计算机. 早期,每个人只能使用电子支付或跨境支付,但是现在链上有各种各样的智能合约和操作逻辑,每个人都可以轻松地在以太坊和其他区块链平台上执行编程和操作.

如上所示,您可以看到不同的节点实际上包含其他程序(例如智能合约)的处理能力. 左侧的用户可以使用键对数据签名,然后将事务发送到该节点. 处理完事务后,该节点将更新相应的状态,以生成广播到其他节点的块. 其他节点将执行操作和验证,然后写入本地区块链. . 这样的分布式系统是相互关联的,从而确保来自不同国家和地区的用户都可以在此世界计算机上进行操作和计算.
这台功能强大的分布式计算机听起来很酷,但是从安全性的角度来看,系统支持的逻辑功能越多,它所具有的安全风险就越大,这就是为什么比特币系统安全的原因之一,即性比以太坊好得多.
查看以太坊的主要安全事件,您会发现,如果频繁暴露区块链平台上的安全问题,也将挫伤大量开发人员和一些初创公司在平台上部署商业应用程序的信心.
当我们查看另一个区块链平台EOS时,我们显然可以感觉到相应的安全事件实际上与相应的值更相关. 无论是链本身还是智能合约的无尽安全问题,总体而言,每个人都更倾向于选择高度分散和更安全的区块链平台来部署自己的业务逻辑.
在过去的一年中,发生了各种各样的DeFi攻击. 实际上,这也为众多区块链开发商敲响了. 在启动各种新功能之前,您必须进行安全审核以确保您. 该功能没有重大安全问题.
恶意攻击

接下来,我们将研究恶意攻击,特别是与智能合约有关的攻击. </ p>
再入攻击
2016年的DAO问题和最近的DeFi问题是类似的攻击. 攻击者编写了相应的恶意智能合约最优攻击方式,调用了受害人的合同,同时使用自己的回调函数周期性地调用了受害人的合同代码. 因为它反复输入受害人的合同以执行导致漏洞的相应代码,所以称为“再入攻击”.

如上所示,右侧是恶意智能合约,左侧是普通智能合约. 如果正常的智能合约是按照左侧的逻辑,那么它实际上应该从上到下执行withdrawBalance,然后用以太坊进行转账,最后更新相应用户的余额.
但是,恶意合约的执行逻辑是先启动取款功能并调用withdrawBalance功能,然后左侧的普通智能合约将调用相应的withdrawBalance,以太坊转移,转移完成后,由于以太坊本身的特点,恶意智能合约中的回调函数将被调用,回调函数将进一步调用左侧的withdrawBalance.
总体上,根据此箭头一二三四,形成一个循环. 结果是,恶意合约发起呼叫后,只要左侧智慧合约的燃油费足够大,并且可以继续以这种方式转移资金,并将左侧智慧合约中的余额转移到攻击者的地址,并且如果有余额,所有余额最终都会转移给相应的攻击者.

这是简化的流程图. 您可以查看实际的代码. 左侧是普通的智能合约,右侧是攻击者的智能合约. 攻击者的智能合约在右上角启动,调用左侧的withdrawBalance函数,然后调用call.value(),call.value()触发恶意智能合约的默认应付款回调函数和默认回调功能将进一步触发循环,直到左侧整个智能合约的所有余额都转移给恶意攻击者为止.
由于重入攻击,DAO合同当时损失了超过6,000万美元的ETH. 区块链具有不可篡改的特征,此类交易无法回滚,造成的损失是永久的. 当时,社区想修复这样的漏洞以返回相应的以太损失,而一些社区成员不希望这样做,这最终导致当时的以太坊分叉最优攻击方式,而该分叉现在被称为ETC /以太坊经典.
不忘记过去,但很多时候人们会忘记历史的老师,即使它与安全息息相关. 在最近的DeFi或LendF.me攻击中,我们在2016年看到了类似的重入攻击. 由于此过程实际上比2016年的前一次攻击复杂得多,因此这里有一个简化的解释.
Lendf.me存款功能在回调函数中反复使用with进行调用,导致攻击者在智能合约中的抵押总额在没有足够抵押的情况下继续上升. 这等效于调用此循环,即使攻击者没有相应的抵押品,也可以使其总抵押贷款金额增加,这最终导致攻击者积累了与imBTC对应的足够抵押品金额. 然后,攻击者借出了所有可用资产,超过2500万美元. 当然,幸运的是,攻击者通过某些方法归还了相应的资产,这也是不幸的.
重入攻击很严重. 有哪些防御措施?实际上,您可以在进行传输之前设置内部状态. 例如,当一个智能合约想要向用户转移10 ETH时,在转移与该用户相对应的余额变量之前,减去对应的10 ETH然后进行交互式转移,可以避免这种攻击. 这是一个很好的规范. 首先检查,然后执行,然后进行交互.

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

上图为示例. 可以看出,攻击者发送了很多交易,_value的对应值特别大. 特别是对于第257行,当_value特别大时,如果cnt大于2,则数量直接溢出到零,从而使所有后续安全检查都通过. 通常不应该通过第259行的第二次检查,但是由于溢出量已变为0,因此左侧的balances [msg.sender]的值必须大于或等于零,从而导致安全检查也已通过. 最终,攻击者成功地获得了大量数字资产,即使他自己的余额可能很小.
对于其他示例,您可以检查multiOverflow(CVE-2018-10706),transferFlaw(CVE-2018–10468),proxyOverflow(CVE-2018-10376). 攻击者通常使用智能合约的溢出漏洞来创建可能导致溢出的交易,然后使用溢出的变量通过智能合约的安全检查并最终获得巨额资产. 作为一种防御措施,开发人员尝试使用保证计算安全性的库,例如SafeMath.
所有权攻击
所有权攻击是指攻击者篡改了智能合约功能的所有权. 在某些攻击中,某些功能设置了只有所有者才能看到的访问控制. 但是,谁可以成为所有者?此功能不实现访问控制. 任何人都可以将交易发送到智能合约以将自己设置为所有者,然后可以操纵其他功能.
另一个例子是,任何人都可以调用公共功能,然后将自己的地址设置为CEO的地址. 一旦您的地址成为CEO的地址,就可以执行CEO相应权限的操作,并且您可以具有非常高的权限来执行任何操作. 所有权攻击利用程序开发过程中访问控制设计中的漏洞进行相应的攻击. </ p>
拥塞攻击
除了利用智能合约中的漏洞的攻击之外,某些攻击实际上还利用了区块链本身的特征. 最有趣的攻击类型之一称为“拥塞攻击”. 例如,Fomo 3D,Fomo 3D在过去几年中是一种流行的彩票游戏,最终获得密钥的人几乎可以获取合同的所有ETH. 游戏规则是什么?每个人都可以在有限的时间内购买钥匙,并且每一轮钥匙的价格都会继续上涨. 如果用户在限定时间内参与购买钥匙,则下一轮将继续. 直到本轮比赛为止,没有人在有限的时间内购买钥匙,然后在前一轮购买钥匙的用户就是最终的赢家.
Fomo3D的第一轮获胜者也是攻击者,他获得了10,000多个以太奖励. 在正常情况下,游戏规则是相当公平的,用户会在最后一轮获得最终奖励. 但是,攻击者发现了以太坊本身的拥塞问题,并通过自己的行动获得了更大的成功空间,从而使他成为最终的赢家.
以太坊是一种什么样的漏洞?实际上,这不是以太坊的漏洞,而是它的特点.
首先,以太坊本身的吞吐量不是特别高,每秒只能处理10到20个事务. 当然,现在相对较高. 以太坊2.0可能会更高.

然后,每个区块都有一个相应的燃料限制,以确保以太坊节点不受拒绝服务攻击. 胜利者和攻击者利用这两个特征: 低吞吐量和有限的燃料. 他进行了很多高费用和油耗的交易,因此智能交易无法处理其他交易对手的交易. 最终,他只用自己的高费用来处理交易,以确保他在上一轮和下一轮都获得了钥匙. 如果别人的交易无法达成,他将在有限的时间内成为最终的赢家.
攻击者获得密钥后,他发送大量耗油且高费用的交易,从而在下一个区块中仅产生少量交易. 超高的手续费允许获胜者允许其交易由节点打包. 当节点仅处理超高手续费交易时,燃料耗尽,其他交易无法进入. 最后,攻击者成为最后一轮的赢家.
如果增加平台吞吐量,是否有任何改进?攻击者将无法攻击吗?其实并不是. 您可以观看另一个区块链平台EOS,EOS上有一个EOSPlay游戏. 该游戏将Future块的哈希值用于随机数计算. 通常,用户不确定将来将哪些交易放入区块链. 但是,在拥塞的情况下,攻击者可以操纵future块中包含的交易并预先计算随机数. 在实际攻击中,攻击者在CPU价格非常低时会购买大量CPU资源,生成大量交易,并允许相应的智能合约来处理交易.
由于攻击者购买了大量计算资源,因此当时的EOS平台比较拥挤. 最终,当智能合约和节点正在计算时,只有攻击者交易被写入相应的块. 由于这些块中的事务是由攻击者进行的,因此攻击者可以执行简单的排列和组合,然后计算排列和组合中的事务,以计算可能提前出现的随机数,从而获得优于其他正常值的优势. 用户. 最终,攻击者花费了约21万个EOS,但获得了超过24万个EOS,利润约为28000个EOS.
针对这些恶意攻击的预防措施是什么?
1. 在链上开发逻辑时,请遵循某种安全范例,例如在调用外部智能合约之前更改变量.
2. 使用成熟的安全性库(例如SafeMath库),并尽量不要自己构建一些不熟悉的低级库.
3. 使用锁定机制进行关键业务操作并设置暂停开关. 这样做的好处是,即使将来发生黑天鹅事件或遭到黑天鹅攻击,您也可以中止自己的智能合约并减少经济损失.
4. 不要将链上的数据用作随机数,因为攻击者很可能在未来的区块中对信息大惊小怪,从而导致可以操纵随机数.
5. 在启动任何功能之前,请执行第三方安全审核(至少两次).
6. 部署自己的链上逻辑后,您需要监视相应的链上智能合约. 这样,可以及时发现问题并尽快解决.
上述攻击,无论是重入攻击,溢出攻击还是网络拥塞攻击,都是恶意的. 但是,某些攻击不是恶意的,只是为了最大化自身利益. 这也是区块链系统本身独特的攻击发展方向,有点像传统经济学和金融学中的博弈论.
理性攻击

下面我主要介绍块状癫痫发作和验证者困境攻击.
癫痫发作发作
从采矿开始,每个人都知道比特币本身是使用工作量证明进行开采的. 通过计算哈希值,可以看到前面有多少个数字为“ 0”. 如果前几个数字为“ 0”,则说明该矿工挖出了一个新块. 如果矿工想自己挖掘新的区块,那么硬件投资是相当大的,可能会有超过数亿美元的投资来购买采矿机.
由于不同的矿工无法确定自己是否可以独立挖块,因此他们将一起组成不同的矿池. 采矿池的优势在于,它可以分解难度,将大问题分解为小问题.
类似于Nonce,您可以将“ 11”的开头分配给一个矿工,而将“ 10”的开头分配给另一个矿工. 每个矿工完成相应的计算后,相应的结果将返回给采矿池的经理. . 目前,超过90%的矿工加入了矿池,而矿池的存在使矿工的收入更加稳定. 例如,您身边有90个矿工,其中一个挖了最后一块,然后其他90个矿工可以根据自己的计算能力获得相应的奖励.
比特币联合开采协议看起来特别合理. 矿工具有很高的计算能力和高回报. 对于矿工而言,从直觉上讲,要遵守协议,收益应该是最高的.
有什么办法可以攻击这种协议?在这里,我们将提到阻止癫痫发作. 当“区块扣押攻击”首次提出时,每个人都不同意,许多矿池运营商认为这不是一个大问题. 然而,此后,矿池发生了一次癫痫发作,造成了超过20万美元的损失,使每个人都意识到原始的癫痫发作是真实的.

图片粗略地介绍了矿工是否可以参与不同的采矿池,您可以参加左侧的采矿池还是可以参加右侧的采矿池. 根据获得相应奖励的计算能力,不同的矿池具有不同的优势. 矿工实际上可以将其计算能力资源分配给不同的矿池,而他们想要实现的最终效果是最大化利润. 那么,如何合理分配整个计算能力资源,然后最大化收益呢?
刚才提到的癫痫发作就是一个例子. 作为普通矿工,只要矿池分配不同的任务进行计算并将结果提交给矿池即可. 但是,即使挖出了通过比特币采矿获得的区块,区块扣押攻击也不会向采矿池报告,而只是向采矿池报告先前计算的无效结果以进行报告. 由于矿工与矿池共享先前计算的结果,因此矿池仍会根据矿工的采矿能力来支付相应的奖励.

比特币是一个零和游戏. 这会使其他矿池更有利可图吗?有损失吗?
现在,请取出纸和笔以计算一个非常简单的示例. 攻击者拥有整个网络25%的计算能力,而受害者的采矿池拥有75%的计算能力. %的计算能力分配给了采矿池,其余20%属于自己. 接下来,开始了癫痫发作发作. 攻击者占采矿池中5%的计算能力,但是5%的计算能力实际上是在磨削外国工人. 即使计算了相应的块,也不会告知采矿池,所以采矿池得到的结果无效. 根据当前协议,矿工只要将相应的结果计算到采矿池中,便可以获得相应的奖励,因此,采矿池仍将按5%的计算能力来分配奖励.
但是,由于这5%是外劳,因此整个网络的真实计算能力仅为95%,相应的攻击者占21%,而矿池则占79%. 根据协议,正确的采矿池将获得79%的奖励,其中79%* 5%= 4.9%将分配给魔阳宫的攻击者. 攻击者本身也为正常采矿获得了21%的奖励,总计达到25.9%. 综上所述,如果攻击者按照协议正常运行,则25%的计算能力只能获得25%的报酬,但如果实施了块状癫痫发作,则可以获得25.9%的报酬.
进一步分析区块扣押攻击,例如考虑不同情况,单个攻击者,单个采矿池;单个攻击者,多个采矿池;多个攻击者,多个采矿池. 经过大量计算,我们发现攻击者的计算能力越高,奖励就越高. 同时,如果仅一个采矿池被单独攻击,则奖励不会像攻击多个采矿池那样高. 这与我们通常的直觉不同. 我们通常认为严格遵守游戏规则可以使利润最大化. 但是在这里您可以看到,矿工略微改变了采矿方法,以实施块状癫痫发作,他们可以获得更多好处.
癫痫发作有什么解决方案?方法之一是将同一任务划分给多个矿工. 一名矿工工作不佳,另一名矿工在开采比特币区块时将向采矿池报告. 您还可以更改还款计划或方法,例如,向已开采比特币区块的矿工提供更多奖励,并鼓励矿工根据协议进行开采. 当然,也可以更改比特币协议,以便本地采矿可以支持采矿池采矿.
验证者困境
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-234324-1.html
人均GDP和收入看起来你好富啊
按今天的算有3000