2021年2月5日,Nicolas Venturo上报了该漏洞。
重载函数的参数,会从memory非预期变成calldata。
漏洞存在于solidity 0.6.9 版本之后。
漏洞严重性为 极低。
编译器未区分,memory指针和calldata指针。重载函数如果更换了同参数的location。
则会引发内存越界读。
举例如下
abstract contract I {
function f(uint[] calldata x) virtual internal returns(uint[] memory);
}
contract C is I {
function f(uint[] memory x) override internal returns(uint[] memory){
return x;
}
function test() external returns(uint[] memory){
uint[] memory p = new uint[](3);
p[0] = 1;
return f(p);
}
}
很怪没有什么异常