上传者: 26763955
|
上传时间: 2021-11-24 16:14:30
|
文件大小: 1.98MB
|
文件类型: -
第四章 智能合约的安全问题
目前,以太坊中总计约有一亿以太币,按市场价(1以太价值 150美元),
总市值约为 150亿美元。广泛的应用也暴露了以太坊的一些漏洞,并被一些攻击
者利用,出现了 TheDao Bug(损失 6000万美元)、Parity Bug(300万以太币无
法取出)等严重的漏洞。这些漏洞使人们对以太坊的安全性产生了怀疑。由于其
他智能合约平台大多都参考了以太坊的底层架构,这些平台同样会受到这些攻击
的威胁。智能合约的安全机制与漏洞涉及到整个以太坊架构的各个层次。目前,
智能合约的安全已经成为智能合约开发者必须考虑且重视的问题[5]。
4.1 智能合约中的漏洞分类
在本节中,我们先对以太坊智能合约的安全漏洞进行归纳。此外,我们通过
一个代码片段说明每个在 Solidity层级的漏洞。所有这些漏洞可以被利用(实际
上,大多数漏洞)来进行攻击,例如从合约中盗取以太币。
Call to the unknown. Solidity中用于调用函数和转移以太币的某些语法可能
具有调用被调用者/接收者的 fallback函数的副作用[3]。我们在下面说明它们。
-call调用一个函数(另一个合约的或本身的函数),并将以太币转移给被调
用者。 例如,可以按以下方式调用合约 c的函数 ping:
c.call.value(amount)(bytes4(sha3("ping(uint256)")),n);
其中,被调用函数由其哈希签名的前 4个字节标识,amount决定必须将多
少 wei传递给合约 c,而 n是 ping函数的实际参数。值得注意的是,如果在地址
c处不存在具有给定签名的函数,则执行合约 c的 fallback函数作为替代。
-send用于将以太币从运行中的合约转移到某个接收者 r,如 r.send(amount)
所示。以太币被转移后,send执行接受者的 fallback函数。与 send相关的其他
漏洞在“exception disorders”和“gasless send”中进行了详细说明。
-delegatecall与 call非常相似,区别在于被调用函数的调用在调用者环境中
运行。 例如,执行 c.delegatecall(bytes4(sha3(“ping(uint256)”)),n),
如果 ping包含变量 this,它将引用调用者的地址而不是合约 c的,并且在以太
币转移到某个接收者 d的情况下-通过 d.send(amount)-从调用者 balance中提
取以太币。