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)
        }
    }
}