2021年6月1日,通过差分fuzzing,发现了legacy code generation pipeline存在 写入赃数据 的bug。触发点是copy bytes from calldata or memory to storage

原以为这个脏数据只能通过inline assembly来访问。但是发现bytes.push() 函数也可以将脏数据暴露出来。

该漏洞仅在早期版本触发,而且目前没有在野利用,所以定位为低危害。

POC

contract C {
    bytes s;
    constructor() {
        bytes memory m = new bytes(63);
        s = m;
    }
    function h() external returns (bytes memory) {
        s.push();
        return s;
      }
}

constructor中将memory copy给storage。这个时候s中有脏数据…but直接view应该还是0

调用h()后,s将出现脏数据。

右侧是calldata to storage 的poc

contract C {
    bytespublic s;
    function f(bytes calldata c) external returns (bytes memory)
    {
        s = c;
        s.push();
        return s;
    }
}

Reference

原文链接