2020年9月17日,solidity官方发现该漏洞。

影响范围 version < 0.7.3, 中危。

漏洞简述

如果有两个长度不相等的动态数组类型。

将较短的数组赋值给较长的数组时,并不会完全清除较长数组的值。

举例如下:

contract C {
    uint128[] x; // 较长数组
    function f() public returns(uint128[] memory) {
        x.push(42); x.push(42); x.push(42); x.push(42);
        uint128[] memory y = new uint128[](1); 
        y[0] = 23; // 较短数组
        x = y;
        x.push(); x.push(); x.push();  
        return x; // 返回[23,0,0,42] 而非 [23,0,0,0]
    }
}