智能合约安全 | 合约无效化攻击
视频教程在我主页简介或专栏里
(不懂都可以来问我 专栏找我哦)
自我摧毁机制 selfdestroymechanism
智能合约安全
合约无效化攻击
为了更好地理解这一概念, 我们选取一个典型案例来进行详细阐述。合同无效化攻击本质上等同于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}(""); } }}
浏览代码时似乎没有问题。requires关键字确保了每个人每次只能发送一次该功能,并且能够顺利运行。
合约自毁函数 selfdestruct
为了更好地理解这一机制及其重要性,在区块链环境下运行的智能合约代码是无法直接进行修改或更新的。为了更好地理解这一机制及其重要性,在区块链环境下运行的智能合约代码是无法直接进行修改或更新的。
攻击实现
这一漏洞的原理也变得清晰起来。如果我们设置一个智能合约,并通过自动销毁代币的方式进行转账操作,在向该智能合约注入8 ETH后(注:8 ETH表示8以太),就会触发特定逻辑。具体来说,在该智能合约中包含了一个条件判断:如果当前账户余额等于7以太(即balance == 7 ether),则执行某些操作。然而由于我们的设计中始终不满足这个条件(即balance != 7 ether),因此这一机制无法正常运转并失去了执行功能。
攻击代码如下
contract Attack { function draw() public payable {} // 用来存eth, 方便测试
function over(address addr) public {
selfdestruct(payable(addr)); }}
先转账8eth到攻击合约中

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

可以看出目标合约中的 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}(""); } }}
总结
本文旨在探讨 自毁函数 在攻击场景中的潜在风险。其中的核心问题是代码逻辑上的缺陷。此外,在分析本篇中的漏洞时,我们发现漏洞代码可以通过回滚攻击来规避检测。作为练习供参考。
视频教程在我主页简介或专栏里
(不懂都可以来问我 专栏找我哦)
本账户仅限于网络安全技术领域的技术交流与分享信息内容。所有分享的信息都不得用于非法途径的技术活动。执行渗透活动前必须经过合法程序获取授权。任何违反上述规定的个人都将承担相应法律责任与发布方无关。
