2021年6月1日,通过差分fuzzing,发现了legacy code generation pipeline存在 写入赃数据 的bug。触发点是copy bytes from calldata
or memory
to storage
原以为这个脏数据只能通过inline assembly来访问。但是发现bytes.push()
函数也可以将脏数据暴露出来。
该漏洞仅在早期版本触发,而且目前没有在野利用,所以定位为低危害。
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;
}
}