eth智能合约安全整形溢出漏洞

原理

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180710G1RUJL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券