Cybermiles

Cybermiles

创建一个安全的加密代币

今天,又有一个黑客在以太坊上盗取了10亿美元…

这一次,由于Solidity 上编写的智能合约中的一个bug,黑客黑掉了超过价值20亿美元的token。而CyberMiles 区块链不仅可以向后完全兼容以太坊,而且可以杜绝这种bug的发生。

The Beauty Chain(BEC)在中国颇有知名度,其目标是“构建真正去中心化的美丽生态链”。2018年2月23日,BEC 上线OKEX 交易所,上线第一天就猛涨4000%。 4月22日盗币事件发生,BEC 的市值从峰值:约700亿美元逐渐下降到20亿美元左右,然后其交易价值突然下降至零。随后,OKEX 暂停了BEC 的交易。

当然,BEC 不是唯一一个遭遇黑客攻击的加密货币。另一个被广泛交易的加密货币SmartMesh(SMT)也遇到了和BEC 一样的事件,其市场份额超过3亿美元(代币的总供应量)。SmartMesh 是一个去中心化的兼容有网和无网两种情况的点对点分布式网络。虽然SMT 的市场份额小于BEC,但它的交易更为广泛,可能会造成更大的实际损失。这件事发生后,火币网暂停了SMT 的交易。

发生了什么?

据显示,黑客利用BEC / SMT 智能合约向自己发送价值63个零的token。显然,多个ERC 20 token 合约都很容易受到这个问题的影响,因此多名业内人士发出了安全警示。

配图为BEC和SMT智能合约上发生的黑客交易和账户余额,你能数得清有多少个零吗?

这是怎么发生的?

从技术上讲,用于发布和管理加密货币的ERC20智能合约中存在着一个bug。SMT 和BEC 的情况非常相似。以BEC 为例,开发人员在合约中添加了一个名为batchTransfer()的方法,以便token 能在一次或一批交易中同时传送给多方。

图片来自the CVE-2018–10299 security alert

但是,开发人员在下面这行代码中犯了一个严重的错误。

uint256 amount = uint256(cnt)* _value

这里的cnt 是token 交易中收款人的数量;_value 是每个收款人应该收到的BEC 数量,而amount 是从打款人账户中转走的总金额。

请注意,cnt 通常是一个很小的数字。

 

但如果它是一个很大的数字呢?

如果有人将一个很大的cnt 使用到batchTransfer 函数中,以至于这个函数超出了计算机跟踪256位整数(uint256)的能力,那该怎么办?

这就会导致臭名昭著的“缓存溢出”,并导致amount 的计算为零。此时,就可以将任意数量的BEC 转给任何人,但打款人的账户却不会被划走任何金额。因此,利用这个bug,只要拥有1个BEC,就可以将数百亿的BEC发送给其他人。

 

如何预防?

防止这种情况发生的方法是在执行整数运算时使用SafeMath 库函数。 SafeMath 能够检测并解决“整数溢出”问题。有趣的是,BEC / SMT 合约的开发者确实使用了SafeMath,除了被黑客发现的那一处。

为什么?一个猜测是,在ICO 淘金热时,开发人员可能只是从互联网上复制和粘贴了一些ERC 20合约代码,但并未充分了解其含义。

 

CyberMiles 如何防止这种情况发生?

CyberMiles 正在致力于把整个Ethereum 虚拟机(EVM)堆栈从编译器改进为虚拟机运行。我们使用的一个重要安全措施就是在token合约,例如ERC 20、ERC 223、ERC 721和ERC 884,强制使用SafeMath。

它的工作原理如下:

编译器优化:如果编译器检测到源代码符合上述token 标记中的任意一个,它则会在任何未包含SafeMath 的“裸”整数操作中指出错误。

当然,这种行为可以用编译器标志覆盖,从而忽略这些错误。但SafeMath 默认执行,确保了token 合约的安全。

运行时优化:在虚拟机运行时,我们将实时自动分析整数赋值操作,并在发生溢出时停止执行有错误的合约。

这些只是CyberMiles 为以太坊开发人员带来的一些增强安全功能。

未来几周将发布CyberMiles 虚拟机测试版,敬请期待!

 

一些启示

你要试着理解从互联网上得到的代码,特别是涉及到了钱的代码!

在CyberMiles 区块链上部署你的token 智能合约,可以获得更好的安全性、更高级的语言功能和更低的费用。

至少你可以使用CyberMiles Lity /Solidity 编译器来避免一些常见的错误。

 

Recent Posts