本文作者:darren94me[1]
随着 Web3 的迅猛发展,各种智能合约[2]层出不穷,某些智能合约中的漏洞很致命的:无论是以代币还是以太币的形式,合约可以管理重要的财产资源,漏洞造成的损失将可能以数百万美元计。不过,以太坊区块链上的代码比任何单个合约都更重要:智能合约库代码。
除了使库产生不正确的结果之外,此类漏洞可能会产生其他后果;如果攻击者可以强制库代码意外恢复,那么他们就有了潜在的拒绝服务攻击的机会。如果攻击者可以使库函数进入失控循环,他们可以将拒绝服务与昂贵的 gas 消耗结合起来。
下面介绍下 Echidna 的使用。
docker pull trailofbits/eth-security-toolbox
docker run -it --rm -v $PWD:/code trailofbits/eth-security-toolbox
rm:在容器启动时设置--rm 选项,这样在容器退出时就能够自动清理容器内部的文件系统
控制台出现如下,则说明安装成功。
┌── ┌──┐ ──┬──
├─ └──┐ │
└──THEREUM─┴──┴ECURITY─┴OOLBOX
https://github.com/trailofbits/eth-security-toolbox
by ################
##########TRAIL#
####
#### ###########
#### ###########
\### #### ####
/\\# of #### ####
/ \ ############
\__/ #### ####
\### ####
/\\#########
/__\\##BITS#
Security Tools and Resources Installed:
https://github.com/trailofbits/echidna
https://github.com/trailofbits/etheno
https://github.com/trailofbits/manticore
https://github.com/trailofbits/slither
https://github.com/trailofbits/rattle
https://github.com/trailofbits/not-so-smart-contracts
solc --version
solc, the solidity compiler commandline interface
Version: 0.8.9+commit.e5eed63a.Linux.g++
ethsec@36ba204276db:/code$ solc-select install 0.7.6
Installing '0.7.6'...
Version '0.7.6' installed.
ethsec@36ba204276db:/code$ solc-select use 0.7.6
Switched global version to 0.7.6
ethsec@36ba204276db:/code$ solc --version
solc, the solidity compiler commandline interface
Version: 0.7.6+commit.7338295f.Linux.g++
参考源码:https://github.com/darrenli6/echidna_example
ethsec@36ba204276db:/code$ echidna-test TestEchidna.sol --contract TestCounter
ethsec@36ba204276db:/code$ echidna-test TestEchidna.sol --test-limit 500 --contract TestCounter
function echidna_test_fails() public view returns(bool){
return false;
}
源码[3]
当执行第六次的时候,就出现 failed.
ethsec@36ba204276db:/code$ echidna-test TestEchidna4.sol --contract TestAssert --check-asserts
当输入 10 的时候,会出现失败。
源码[5]
ethsec@36ba204276db:/code$ echidna-test TestEchidna4.sol --contract TestAssert --check-asserts
源码[6]
ethsec@36ba204276db:/code$ echidna-test TestEchidnaTestTimeAndCaller.sol --test-limit 5000
当修改源码为
uint delay =70 days;
说明 Echidna 无法快进 70 天,因此没有修改 pass 的状态。
ethsec@36ba204276db:/code$ echidna-test TestEchidnaTestTimeAndCaller.sol --test-limit 5000 --config time.yaml
[1]
darren94me: https://learnblockchain.cn/people/4859
[2]
智能合约: https://learnblockchain.cn/2018/01/04/understanding-smart-contracts
[3]
源码: https://github.com/darrenli6/echidna_example/blob/master/TestEchidna2.sol
[4]
assert: https://github.com/darrenli6/echidna_example/blob/master/TestEchidna3.sol
[5]
源码: https://github.com/darrenli6/echidna_example/blob/master/TestEchidna4.sol
[6]
源码: https://github.com/darrenli6/echidna_example/blob/master/TestEchidnaTestTimeAndCaller.sol