原理
eth智能合约整数溢出漏洞, 原理是uint256类型当取最大整数值,上溢之后直接回绕返回值为0 , 当取0下溢之后直接回绕,返回值为 2^256-1,这是 solidity中整数溢出场景的常规情况。智能合约可参看:
https://github.com/jige003/blockchainsec/blob/master/eth/overflow_vul/overflow.sol
回顾 smt 整数溢出漏洞
合约代码:
https://github.com/jige003/blockchainsec/blob/master/eth/overflow_vul/smtvul.sol
exp smt上溢漏洞
查看存在漏洞的函数transferProxy 还需要对转账人对这笔交易执行签名, 校验签名的代码如下:
使用ganache-cli 搭建eth私链并部署合约, 并使用web3 部署合约, 可参考此脚本 :
https://github.com/jige003/blockchainsec/blob/master/eth/overflow_vul/deploy.js
部署合约后需要记下合约地址,value和feeSmt参数直接复制黑客攻击成功的,参考tx链接:
https://etherscan.io/tx/0x1abab4c8db9a30e703114528e31dee129a3a758f7f8abc3b6494aad3d304e43f 设置value 为:0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff设置feeSmt 为:0x7000000000000000000000000000000000000000000000000000000000000001
使用web3和ethereumjs-util的web3.utils.soliditySha3 消息摘要函数、 ethereumjs-util.ecsign 签名函数生成剩余的参数, 代码如下:
最后调用合约的transferProxy函数exp此合约, exp之前账户地址为0, exp后65133050195990359925758679067386948167464366374422817272194891004451135422463
exp log 如下
完整的exp测试代码链接:
https://github.com/jige003/blockchainsec/blob/master/eth/overflow_vul/expvul.js
漏洞防范
使用safemath 库执行基本运算
使用assert、 require执行校验
代码review
参考链接
https://ethereumdev.io/safemath-protect-overflows/https://web3js.readthedocs.io/en/1.0/getting-started.htmlhttp://www.freebuf.com/vuls/169741.htmlhttps://medium.com/loom-network/how-to-secure-your-smart-contracts-6-solidity-vulnerabilities-and-how-to-avoid-them-part-1-c33048d4d17dhttps://github.com/ethereum/solidity/issues/796#issuecomment-253578925
领取专属 10元无门槛券
私享最新 技术干货