2022年6月5日,John Toman of Certora开发团队发现了Solidity 0.8.13 Yul优化器的漏洞。
危害为,在inline assembly中,内存的写入可能失效。
漏洞被认定为中危。
在一个inline assembly中写入一个memory,若该inline assembly后面没有read到该memory,则该memory会被Yul优化器非预期清除掉。
contract C {
function f() external pure returns (uint256 x) {
assembly {
mstore(0, 0x42)
}
assembly {
x := mload(0)
}
}
}
例如左侧代码中mstore会被优化掉。x值为0,而非0x42
右侧代码中的mstore则不会被优化掉,因为return中读了一下0位置的值。
contract C {
function f() external {
assembly {
mstore(0, 0x42)
return(0, 32)
}
}
}