谈谈智能合约中的中心化威胁

区块链:去中心化的世界



在写本文之前,笔者曾今深度思考过区块链技术目前为何如此被人看好,它到底解决了人们的什么问题,区块链技术的诉求是什么等等。


首先,我们都知道区块链中的程序源码和产生的数据都是开放透明的,任何一个节点都有权力监督数据的有效性。

其次,区块链网络中是没有中心化节点的,一切都是去中心化(多中心化)的。


于是我得到了一个结论:区块链技术最大的诉求是权力分散、多方监督,以此来解决单点故障以及单点威胁。


于是区块链技术与网络金融领域一拍即合,产生了各种区块链币。


智能合约:区块链世界的法律



现实中,有律师为了保护辩护人不惜利用法律漏洞。

区块链世界中也一样,有些合约所有者也会为了利益去钻智能合约的漏洞。


在以太坊智能合约中,是允许存在特权账户的,特权账户甚至可以销毁代币,可以增发代币,可以窃取任意账户的代币,这都是有可能的,关键得看代码怎么写。


有人可能会说,这是业务需要,是为了空投,为了自动交易等等....


业务需要是没错,但是我们再回到前面提到的,区块链技术不就是为了权力分散么,既然如此,和银行又有什么区别?(甚至不如银行有保障)

一些智能合约的特权账户几乎可以为所欲为,这和区块链技术的初衷简直南辕北辙。


在这些智能合约面前,一切又回到了权力集中的时代,区块链去中心化的工作变得毫无意义。


之前就有过这样的案例:ERC20代币Soarcoin (SOAR) 存在后门,合约所有者撤回已转账的代币。


经过BCSEC团队调查,发现这样的合约还不在少数。


GOLDBITSCOIN0xC8058D59e208399B76E66Da1EC669dD6B1BeE2ea
etherecash0xc8ffd394421e09cb48b620dda56168171ca35ab7
OTPPAY0xa04ebf9bf9994ec776b6e8621b8ac75e32767dcd
Crowdsale0x24dc97fb4fd3517fa82943b00a60b0fd3bcf0688
Goldcub0xe780c49fe4b9022a0781b2dfcd34bbb337d946e7
CarbonTOKEN0xf1d9139c6512452db91f25635457b844d7e22b8b
SoarCoin0xD65960FAcb8E4a2dFcb2C2212cb2e44a02e2a57E
CarbonTOKEN0x52514e3acaeb06cab050a69b025083082ebe5b54
SolomexCrowdSale0xd7dc42b78b5ca37ff5493598d5b6978dc98c3b38
BAF0x405c5e9804206cfe4f982310c48cda4e3b8471a3
SolomexCrowdSale0xa3a07912e74acf57f3362d8b4cda85ce652fc887
SolomexCrowdSale0xeb4844a87937c9ee3ae6c89268806c0ab5bd5dff


代码都如出一辙:


  1. function transferby(address _from,address _to,uint256 _amount) public onlycentralAccount returns(bool success) {

  2.  if (balances[_from] >= _amount &&

  3.       amount > 0 &&

  4.       balances[_to] + _amount > balances[_to]) {

  5.  

  6.   balances[_from] -= _amount;

  7.   balances[_to] += _amount;

  8.   Transfer(_from, _to, _amount);

  9.   return true;

  10.  } else {

  11.   return false;

  12.  }

  13. }


只要这些掌权者愿意,他们随时可以把你的余额拿走。


不仅如此,甚至peckshield公司披露还有些合约利用正常业务函数肆意增发代币(利用mintToken函数实现)。


  1. function mintToken(address target, uint256 mintedAmount) onlyOwner {

  2. balanceOf[target] += mintedAmount;

  3. Transfer(0, owner, mintedAmount);

  4. Transfer(owner, target, mintedAmount);

  5. }


可以看到直接将目标账户的余额增加了,发行总量之类的,统统都没有进行修改。

这里说一下mintToken函数在以太坊官网上是有示例的。


图片.png


官方的意思是:增发可以,但你得告诉别人发行总量增加了。(官方大概也没想到会被人恶意利用)


存在此问题的合约也不在少数。


很多人在审计合约的过程中就把onlyOwner的函数自动忽略了,其实不对。

对于只有特权账户能调用的函数也同样需要安全审计。


因为,不能被大众调用的函数不代表没有问题





*文章为作者独立观点,不代表BSCEC立场

转载此文章须经作者同意,并请附上出处(BCSEC)及本页链接。原文链接 https://bcsec.org

白帽汇安全研究院转载2018-06-12 22:30:34 BCSEC 1446