
PoC educativo sobre la confusión del tamaño de los datos de retorno en assembly de Solidity; incluye contrato vulnerable, simulación de explotación y guía de mitigación para una decodificación ABI segura.
// 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 contrato Solidity usa ensamblador en línea para leer un valor devuelto, pero no valida que la longitud de los datos de retorno sea suficiente. Un atacante puede devolver datos vacíos, lo que hace que el ensamblador lea datos arbitrarios de la pila, provocando corrupción de memoria o evasión de seguridad.
Implementa el contrato vulnerable y un contrato atacante que devuelva una respuesta vacía. El mload lee datos obsoletos.
ret antes de acceder mediante ensamblador.abi.decode) en lugar de ensamblador en bruto.git clone https://github.com/yourorg/CVE-2026-23008.git
cd CVE-2026-23008
# Use Foundry to test