DEVCON2:Joseph Chow:BTC Relay中有关安全性的启示
记者:Cathy
BTC Relay是一个确认比特币交易的智能合约。这个合约已经在主网上发布,它完全去中心化的特性导致它如果不能生存就只能消亡,因为没有人能够对它进行改动。在此我们会探讨安全性调查的结果以及BTC relay的以太坊程序中的bug。以及以太坊赏金计划发现的BTC Relay的问题。
一行代码可以谱写区块链的重要历史,也就是图中这行红色代码。我们可以看到,这行代码使攻击者可以用账户引发DAO攻击。我们知道,DAO攻击事件后,引起了人们对安全方面的考虑与建议,重要的一点是,我们在调用时,千万不要调用不可靠的代码,因为会出现不被信任的账户。所以,我们需要进行一些修改,并作出预测。我们可以用到信息发送者,但是他们也不是那么可靠,所以需要改善。
这里我们列举了在以太坊社区的关于智能合约安全的建议.首先,这样做的基本哲学是,我们要为失败做好准备,这不是说我们一定会失败,而是要承认有未知因素存在。第二,我们要小心谨慎的推出系统,这个系统推出需要时间,对于智能合约而言我们需要时间。所以,合约要先在测试网测试,然后发布beta测试,最后再发行。第三,要简化合约。第四要及时更新。最后,就是要了解区块链的一些属性,有一个失败的例子:如果说账户里的余额比我们预计的少,那么就会需要紧急调用函数,所以如果是这样,那么紧急调用就会将这笔钱转移出去,如果我们发现有任何违规操作,那么所有资金会被发回原来的账户。合约之间可以相互调用,这里我们也要小心,尤其是在外部调用的时候,所以要尽可能避免未被信任的合约的调用,也就是不是你自己写的合约。所以这样不被信用的合约会是恶意的,所以我们要让这些合约做一些什么。
其次,在这类合约中,我们要谨慎调用代码。所以在任何不可靠调用情况下,我们就要防止自己被操纵。这里有个外部调用的例子。重要的一点就是,合约可以用任何函数,比如攻击者可以使用G函数等,所以在这种情况下会导致XY值的变化。我们要使用send函数,而非call value函数,如果用send函数,会比较安全,不会给攻击者足够多的机会来递归重录。如果用call value,他会将所有gas传递到call back 函数里,这就很危险。我们也要纠正原始函数的一些错误。原始函数不会检查异常,所以我们要进行检查。
如果用send函数,那么获得以太币后,你的call back函数就有2300个gas,来记录事件。但是用call value就很危险,那么攻击者会导致整个故障。这个我们称为调用深度攻击。这个EVM call back最大深度是1024.但是用深度调用就是1023,这样所有子调用都会失败。递归调用会让接受者账户余额为零,这样他们就无法取出他们的钱。我们可以进行检查,确保信息发送者可以自己取出退款,而不是让合约自己发送。这里我们还有其他参考信息,比如取出而非发送,在外部调用时。还有一些其他攻击,我想简单归纳一下。首先,我们要为失败做好准备,第二小心研发,谨慎测试。第三,合约要简单。第四在调用不信任代码时,很危险。如果代码不被信任就会导致很多风险,并导致编译器出现漏洞。
这个就是拒绝服务的攻击,会出现你预料不到的抛出,这个就和区块链gas因素相关。在这个合约里 ,我们看到抛出这行就表示目前账户接收者会成为地址的目前的领导,这样就会发起bid,如果有其他人想竞争这个bid,就可以替代之前的领导,成为新的领导。所以我们就提倡取出而非发送的系统。这个就是另一个例子了,在这里合约的工作就是检查退款,而右边就是取出方法的使用。通过这个,攻击者只能攻击自己。
作者:Cathy | 来源:Chainb
Scan QR code with WeChat