漏洞解析:
solidity提供delete了关键字来删除数据,但是如果只是使用delete删除数据还是不完全的,不完全的使用delete函数来删除数据,可能会导致数据残留、数据泄露。
代码地址:
https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Struct-deletion.sol
代码解析:
代码设置了一个Mapping的映射,在solidity里mapping是特殊的,当删除一个包含映射(mapping
)的结构体时。
而我们如果 使用 delete
关键字实际上只会重置结构体的基本字段,而不会删除结构体内部的映射,因此只能逐个删除其中的值,如果直接删除它的上层元素,则会残留。因为我们虽然还是要使用delete删除元素,但是需要做额外的处理。
pragma solidity ^0.8.0;
contract StructDeletionBug {
//设置一个结构 包含id 和flags {uint256:bool}
struct MyStruct {
uint256 id;
mapping(uint256 => bool) flags;
}
mapping(uint256 => MyStruct) public myStructs;
//允许新增数据到MyStructs里
function addStruct(uint256 structId, uint256 flagKeys)public{
MyStruct storage newStruct = myStructs[structId];
newStruct.id = structId;
newStruct.flags[flagKeys] = true;
}
//获取数据
function getStruct(
uint256 structId,
uint256 flagKeys
) public viewreturns (uint256, bool) {
MyStruct storage myStruct = myStructs[structId];
bool keys = myStruct.flags[flagKeys];
return (myStruct.id, keys);
}
//删除结构体,这里直接通过删除id来删除
function deleteStruct(uint256 structId)public{
MyStruct storage myStruct = myStructs[structId];
delete myStructs[structId];
}
}
部署完合约后,首先调用我们addStruct ,赋值1,2,第一个值会被记录,而第二个值则会进行bool值判断,默认没有传入值的时候是false,传入值后就变为true。
调用getStruct方法查看具体值
例如我未传入2,3 所以bool为false
然后再调用deleStruct删除,这里直接delete结构体的下标的值
function deleteStruct(uint256 structId) public{
MyStruct storage myStruct = myStructs[structId];
delete myStructs[structId];
}
}
可以看到,并没有删除干净,按照预期应该第二位是bool值为false,而不是true,而第一个值可以看到uint256的值为0,是预期内的值,被正确删除了。
主要原因是因为flags的值是一个mapping,mapping在solidity是一种特殊的结构,delete 关键字只会重置结构体的基本字段,而不会删除结构体内部的映射。这意味着映射中的数据仍然会保留在存储中,导致数据残留。
需要先删除结构体里的值,然后再删除结构体才可以,这样就不会有数据残留了,注意看我用了三个delete函数
delete myStructs[structId].id; 重置id字段为默认值为0
delete myStruct.flags[i]; 重置flag为默认值false
delete myStructs[structId]; 再次确保整个结构体为被重置为默认值
function deleteStruct(uint256 structId) public{
MyStruct storage myStruct = myStructs[structId];
delete myStructs[structId].id;
for (uint256 i = 0; i < 100; i++) {
delete myStruct.flags[i];
}
delete myStructs[structId];
}
原文始发于微信公众号(Ice ThirdSpace):DeFiVulnLabs靶场全系列详解(三十八)结构体不完全的删除导致数据残留可能数据泄露
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论