// ReturnSizeConfusion.sol
contract Victim {
function callExternal(address target) external returns (bytes memory) {
(bool success, bytes memory ret) = target.call(abi.encodeWithSignature("someFunc()"));
require(success, "call failed");
// Vulnerability: assumes ret is at least 32 bytes, but could be empty
uint256 value;
assembly {
value := mload(add(ret, 32))
}
return ret;
}
}
Solidity 合约使用内联汇编读取返回值,但未验证返回数据长度是否足够。攻击者可以返回空数据,导致汇编读取任意栈数据,进而造成内存损坏或安全绕过。
部署存在漏洞的合约以及一个返回空响应的攻击者合约。mload 将读取到过期数据。
ret 的长度。abi.decode)而不是原始汇编。git clone https://github.com/yourorg/CVE-2026-23008.git
cd CVE-2026-23008
# Use Foundry to test