中金网|贾瑶琪:攻击无处不在 区块链安全和隐私问题有点与众不同( 三 )


所有权攻击
所有权攻击是指智能合约的函数的所有权被攻击者篡改 。 在一些攻击中 , 有些函数设置了只有Owner才能看的访问控制 。 然而 , 谁可以作为Owner呢?这个函数没有实施访问控制 , 任何人可以发送交易给智能合约把自己设置成Owner , 然后就可以操纵其他函数 。
还有一个例子是任何人可以通过调用公开函数 , 然后将自己的地址设置为CEO的地址 , 一旦你的地址变为CEO地址 , 你就可以进行CEO对应权限的操作 , 也就可以有很高的权限进行任何操作了 。 所有权攻击利用了程序开发时访问控制设计的漏洞 , 进行对应的攻击 。
拥塞攻击
除了利用智能合约漏洞的攻击外 , 还有些攻击其实是利用区块链本身的特性进行攻击 。 其中最有意思的一类攻击叫做"拥塞攻击" 。 比如Fomo3D , 前几年Fomo3D是很流行的彩票游戏 , 最终获得钥匙的人可以获得该合约的几乎所有ETH 。 游戏规则是怎样的?在每一轮限定时间内大家都可以买钥匙 , 每轮钥匙价格会持续增高 。 如果在限定时间内有用户参与买钥匙 , 那么下一轮就会继续进行 。 直至当前轮在限定时间内没有人买钥匙 , 那么上轮的买到钥匙的用户就是最终赢家 。
Fomo3D的第一轮赢家也是攻击者 , 他获得了超过1万以太的奖励 。 正常情况下 , 游戏规则是挺公平的 , 最后一轮用户获得最终奖励 。 然而 , 攻击者发现了以太坊本身的拥塞问题 , 通过自己的操作获得了更高的成功空间 , 让自己变成了最终的赢家 。
这是以太坊什么样的漏洞呢?其实这个也不算以太坊的漏洞 , 是它的特性 。
首先 , 以太坊本身的吞吐量不是特别高 , 每秒只能处理10到20个交易 , 当然现在相对高一点 , 未来以太坊2.0可能会更高 。
然后 , 每一个区块都有对应的燃料限制 , 为了保证以太坊的节点不受拒绝服务攻击 。 赢家、攻击者利用了这两个特性:吞吐量低、有燃料限制 。 他制作了大量高手续费和可以消耗尽燃料的交易 , 使得其他对手交易不能被智能合约处理 , 最终只处理自己超高手续费的交易 , 保证自己在最后一轮拿到钥匙 , 接下来一轮别人的交易进不去 , 在限定时间内他就变成了最终赢家 。
攻击者在自己拿到钥匙以后就发送大量消费燃料和高手续费的交易 , 导致接下来的区块只处理很少的交易 。 超高的手续费使得赢家可以让自己的交易被节点进行打包 , 当节点只处理超高手续费交易的时候 , 燃料也耗尽了 , 其他交易进不来了 。 最终攻击者就变成了最后一轮获胜的赢家 。
如果增加平台吞吐量会不会有改进?攻击者会不会完全没办法进行攻击?其实不然 。 大家可以看另一个区块链平台EOS , EOS上有一款EOSPlay游戏 。 这款游戏利用未来区块的哈希值进行随机数计算 。 通常情况下用户是不清楚未来有哪些交易放入区块链的 , 然而在拥塞的情况下 , 攻击者是可以操作未来区块包含的交易 , 提前计算出随机数 。 实际攻击中 , 攻击者在CPU价格很低的时候买入大量的CPU资源 , 生成大量交易 , 让对应的智能合约处理交易 。
由于攻击者购买大量运算资源 , 导致当时的EOS平台有比较大的拥塞 , 最终导致智能合约和节点在进行运算时只有攻击者交易是被写到对应的区块里的 。 这些区块里的交易由于是攻击者制作的 , 攻击者可以进行简单的排列组合 , 然后对排列组合里交易进行计算 , 提前算出可能出现的随机数 , 之后获得远超于其他正常用户的优势 。 最终攻击者花费了大约21万EOS , 但是获得了超过24万EOS , 收益大约2.8万EOS 。
针对这些恶意攻击 , 有哪些防范措施?
1、在开发链上逻辑的时候按照一定的安全范式 , 比如先改变变量再调用外部智能合约 。
2、使用成熟的安全库 , 例如SafeMath库 , 尽量不要自己造一些不太熟悉的底层库轮子 。
3、对关键业务操作要使用加锁机制 , 设置暂停开关 。 好处是即使未来发生黑天鹅事件或者被攻击 , 可以暂停自己的智能合约 , 减少经济损失 。


推荐阅读