披露:令人沉思的KickICO代币被盗原因
KickICO是一个基于区块链的资金募集平台,根据KickICO的官方公告,KickICO遭黑客入侵,损失了770万美元。
根据公告,安全漏洞发生在7月26日09:04。这一漏洞导致黑客成功获得了“KICK智能合约账户”的访问权限,从而控制了KickICO代币平台。
很明显,又是一个权限原因,中心化的问题。
中心化问题:
去中心化程度也是区块链项目抗攻击能力很重要的一个指标。以太坊的创始人V神曾经给真正的“去中心化”这个概念给过一个具体的定义,不满足定义的实际上都属于“假去中心化”。
衡量是否为真正的去中心化V神给了一个具体的判断依据如下:
1.结构去中心化 :系统由几台物理计算机组成?系统最多可以承受几台计算机同时崩溃?
2.政治去中心化:有多少个体或者组织拥有系统的实际控制权?
3.逻辑去中心化: 系统呈现和维护的接口和数据结构看起来更像一个整体,还是非晶群?一个简单的启发是:如果将系统分为提供者和用户两部分,那么这两个部分是否作为独立单元继续正常运行。
纵览目前市面上大部分的以太坊智能合约,大多都设立的owner特权角色。即使一份智能合约没有代码上的缺陷,它也会有很大的风险,被称之为“单点威胁”,因为owner特权角色在一定程度上可以影响该智能合约的运行秩序,而我们并不能保证owner自己不作恶又或是owner特权不会被攻击者窃取。
而这次的KickICO盗币事件就是由于owner私钥被窃取导致。
KickICO盗币事件解析:
在事件发生之后,官方也发表了声明称是由于owner私钥被窃取导致,但是并没有说明为什么私钥会被窃取,这里不排除有合约owner为一己私利监守自盗的可能。
那攻击者拿到owner私钥后是如何进行盗币操作的呢?我们来看如下图:
通过上面的图可以看到,攻击者调用了一个名为issue的函数从合约地址中转出了大量的代币。在转出大量的代币之前,攻击者为了躲避流通总量异常监控,攻击者先调用了另外一个函数:
通过上面的图可以看到,攻击者调用destroy函数将他人大量的代币转入了合约内,这一进一出数个回合,代币的流通总量没有发生变化,攻击者很高明地利用这种方式变相转移了他人大量代币,同时又躲避了流通总量异常监测,给自己预留了很多时间来抛售代币获利。但,重点不是这个。
看到这里所有的Kick项目的投资人都应该捏一把汗,因为你的资产可以被某个人随意操控,同时这个人还具有“随意印钞”的无上权利。
我们来看看合约对这两个特权函数是如何定义的:
issue函数的代码量很少,我们可以看到,这个函数虽然是有onlyOwner限制,但是此函数居然能直接对某个账户进行发币,而没有任何限制,我们再来看看destroy函数。
这个函数虽然没有onlyOwner修饰符,但是从417行可以看出来,owner还是有特权的,若调用者是owner的时候,就不验证_from参数是否为调用者了。
我们在看两行关键代码(420-421),可以看到这两行代码是作用是控制_from地址中的代币数量减少,由于上面提到的417行,所以owner可以直接把任意账户的代币减少。
其他隐患
经调查:目前市面上70%的Token智能合约都存在特权角色,不同的是他们的特权大小不一,所以从理论上来说,这70%的智能合约都存在单点威胁,已发生的案例就有:
1.去中心化交易所Bancor钱包私钥被窃取,25000个eth被盗;
2.具有相关报导的tradeTrap问题,大量代币mintToken函数存在整型溢出,owner可重置他人账户余额;
曲速未来实验室表示:KickICO代币被盗的根本原因是因为Kick合约中为owner权限设立了太多特权函数,而直接原因是因为Kick合约owner的私钥被攻击者窃取。
总结
虽然,KickICO重新控制了智能合约,并且保证所有被盗的资金都将归还到原钱包账户中。但目前大部分智能合约设立特权角色,虽然说从业务角度来说是可以理解的,但是这是与区块链的核心思想相悖的,区块链去中心化的目的之一就是消除单点威胁,而设立特权角色实际上是制造单点威胁。
面对“假去中心化”的项目,投资人需要谨慎以及提高警惕,因为特权账户随时可能会监守自盗亦或是特权账户被窃取而产生大量经济损失。