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);
    }
}

很怪没有什么异常