当前位置:  首页 →区块链百科 →正文

区块链安全问题有哪些?

2019-01-31 12:05:05 区块链百科

很多人说交易所被黑、钱包被盗,区块链是不是不安全。其实很多问题是来自在区块链上搭建DApp、系统或相关应用程序的开发者,因为不熟悉区块链、没有做安全审计,导致程序上出现漏洞,而非区块链本身的问题。

如果从智能合约的漏洞来讲的话,之前有一个十大漏洞的整理,里面最著名的是溢出漏洞(overflow)。一般出现在加法减法或是对数值做运算的时候,如果没有上下限,或者任何检查的话,有可能数值会加超过存储空间,就会溢出使数值归零。这在很多的合约上都遭到攻击,现在大家都用一个叫safe math的模组库来做修正。

另外还有编译器版本造成的问题,像是solidity 0.4.13这个版本,它会直接忽略空字串,如果在调用一个函数时,第一个函数若是空字串,第二个字串会直接递补上去。那这样的递补就可能造成原本打算转钱给自己或其他人,但产生其他结果。

还有比较酷的东西就是,有人开始会在网路上搜寻大量的智能合约看看有什么漏洞,借此获得钱财。而介于白帽与黑帽黑客之间的「灰帽」,就发明了蜜罐合约(honey pot)。蜜罐合约有趣的地方就是,它是用来反黑客的,合约内容会故意显现一些明显的漏洞,吸引比较弱或经验少的黑客攻击,蜜罐合约则会透过抵押的方式把黑客的钱锁进这个合约里面。

安全漏洞

最近大家可能比较关心的是,以太坊计划更新时所发现的re-entrancy漏洞。从技术上来讲,你要让一个合约将钱转给其他人的时候,有三种路径:call/transfer/send。早期来说只有用call这个指令,但它没有gas上限,假设当一个合约出现漏洞时,它可能会持续被执行。所以出现了transfer/send两种路径,将gas上限设置在2300个gas,基本上做完一次传送之后,就不会再次执行。

也就是说,如果你的合约有re-entrancy漏洞,但用的指令是transfer/send两种路径的话,发生这种错误的可能性就几乎是零。

如果君士坦丁堡让部分逻辑优化,让资料存储与更新时所需要的gas下降,也就是说让转送钱财过程之后,你仍然可以执行一些错误逻辑,这就会使得re-entrancy漏洞又再度被允许。

其实如果是按照正常的智能合约开发程序,是不会发生这样的重复访问漏洞(re-entrancy)。

现在在市场上最建议的合约开发顺序,在一个函数内应该是先检查放入的变数是否符合期望,再去执行内部逻辑,直到最后一两行,再去调用外部逻辑。

重复访问漏洞(re-entrancy)做错的就是,我先调用外部逻辑,再做内部逻辑。那如果外部逻辑是有问题的话,那你的函数有可能就不会结束,内部逻辑就不会被调用到,而是一直执行错误,或者是恶意的外部逻辑。其他还有许多安全议题可以说,不仅是以太坊,EOS也有自己的问题。

大家看待区块链安全问题时不用太惊慌,技术人员应借漏洞累积经验,而一般用户则了解不同开发环境的状况去做一些策略上的调整。

BB财经原创,作者区块链百科,转载请注明出处:http://www.bbcaijing.cn/baike/49617.html