
Lehrreicher PoC zur Return-Data-Größenverwirrung in Solidity-Assembly; enthält einen verwundbaren Vertrag, Exploit-Simulation und Hinweise zur Risikominderung für eine sichere ABI-Dekodierung.
// 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;
}
}
Ein Solidity-Vertrag verwendet Inline-Assembly, um einen zurückgegebenen Wert zu lesen, validiert jedoch nicht, dass die Länge der Rückgabedaten ausreichend ist. Ein Angreifer kann leere Daten zurückgeben, wodurch die Assembly beliebige Stack-Daten liest, was zu Speicherkorruption oder Sicherheitsumgehung führen kann.
Stellen Sie den verwundbaren Vertrag und einen Angreifervertrag bereit, der eine leere Antwort zurückgibt. Der mload-Befehl liest veraltete Daten.
ret, bevor Sie über Assembly darauf zugreifen.abi.decode) anstelle von roher Assembly.git clone https://github.com/yourorg/CVE-2026-23008.git
cd CVE-2026-23008
# Use Foundry to test