DeFiVulnLabs靶场全系列详解(三十九)错误的删除数组方式导致数据泄露

admin 2025年5月12日12:33:32评论20 views字数 1238阅读4分7秒阅读模式
01
前言
此内容仅作为展示Solidity常见错误的概念证明。它严格用于教育目的,不应被解释为鼓励或认可任何形式的非法活动或实际的黑客攻击企图。所提供的信息仅供参考和学习,基于此内容采取的任何行动均由个人全权负责。使用这些信息应遵守适用的法律、法规和道德标准。
DeFiVulnLabs一共有47个漏洞实验,包括各种经典的合约漏洞和一些少见的可能造成安全问题的不安全代码,本系列将逐一解析每个漏洞,包括官方的解释和自己的理解。
02
错误的删除数组方式
漏洞解析:
    delete 关键字能够删除数组里的元素,但是delete其实只是让元素的值变成0,如果要进行真正的删除,需要自己手动将要删除的元素之后的元素全部左移,然后pop掉最后一元素。
代码解析:
    代码非常的简单,定义了数组里有5个元素,然后进行删除,但是删除实际上并不是真正的删除,而是将该位置的元素赋值为0,这样可能会在某种业务情况下存在问题。
pragma solidity ^0.8.0;contract ArrayDeletionBug {//定义数组    uint[] public myArray = [12345];//删除数组里的元素functiondeleteElement(uint index) external{require(index < myArray.length, "Invalid index");delete myArray[index];    }//获取数组的长度functiongetLength() publicviewreturns (uint) {return myArray.length;    }}
03
复现

可以看到,我调用了删除数组位置第三个(从0开始)的数组[2],尽管调用成功了,但是数组的长度却没有任何变化,而且该位置的值原本是3(1,2,3),现在却变为了0。

因此可以说明使用delete函数删除的值仅仅是"伪删除",把该位置的值置为了空

DeFiVulnLabs靶场全系列详解(三十九)错误的删除数组方式导致数据泄露
04
如何修复该问题
functiondeleteElement(uint index) external{        require(index < myArray.length, "Invalid index");// Swap the element to be deleted with the last elementfor (uint i = index; i < myArray.length - 1; i++) {        myArray[i] = myArray[i + 1];    }// Delete the last element        myArray.pop();}
可以看到使用修复后的delete方法后,数组长度变为了4,说明该位置的值真正的不见了,而不是置为0。
DeFiVulnLabs靶场全系列详解(三十九)错误的删除数组方式导致数据泄露
05
感谢关注
个人语雀账号:https://www.yuque.com/iceqaq

原文始发于微信公众号(Ice ThirdSpace):DeFiVulnLabs靶场全系列详解(三十九)错误的删除数组方式导致数据泄露

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月12日12:33:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DeFiVulnLabs靶场全系列详解(三十九)错误的删除数组方式导致数据泄露https://cn-sec.com/archives/4054175.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息