// 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