
PoC educativo per la confusione sulla dimensione dei dati di ritorno nell'assembly di Solidity; include un contratto vulnerabile, la simulazione dell'exploit e indicazioni di mitigazione per una decodifica ABI sicura.
// 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;
}
}
Un contratto Solidity usa l'assembly inline per leggere un valore restituito, ma non valida che la lunghezza dei dati di ritorno sia sufficiente. Un attaccante può restituire dati vuoti, facendo sì che l'assembly legga dati arbitrari dello stack, portando a corruzione della memoria o a bypass delle misure di sicurezza.
Distribuisci il contratto vulnerabile e un contratto attaccante che restituisce una risposta vuota. L'mload legge dati obsoleti.
ret prima di accedervi tramite assembly.abi.decode) invece dell'assembly grezzo.git clone https://github.com/yourorg/CVE-2026-23008.git
cd CVE-2026-23008
# Use Foundry to test