2020年10月4日, John Toman 发现该漏洞。
影响范围 version < 0.7.4, 中危。
依次执行以下三个操作将造成,bytes、string被非零值初始化。
memory/calldata copy 空的bytes/string 到 storage 中bytes/string 做 .push() 操作,使length增长。举例如下:
contract C {
bytes data;
function f() public returns (bytes memory) {
uint[2] memory x;
x[0] = type(uint).max; // 先在memory中存点别的东西
bytes memory t;
data = t;
data.push();
return data; // 这里会越界读到 x 的值,返回值会是 0xff 而非 0x00
}
}