
PoC educacional para confusão de tamanho de return-data em assembly do Solidity; inclui contrato vulnerável, simulação de exploração e orientações de mitigação para decodificação segura de ABI.
// 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;
}
}
Um contrato Solidity usa assembly embutido para ler um valor retornado, mas não valida se o comprimento dos dados de retorno é suficiente. Um atacante pode retornar dados vazios, fazendo com que o assembly leia dados arbitrários da pilha, resultando em corrupção de memória ou bypass de segurança.
Implante o contrato vulnerável e um contrato atacante que retorna uma resposta vazia. O mload lê dados obsoletos.
ret antes de acessar via assembly.abi.decode) em vez de assembly puro.git clone https://github.com/yourorg/CVE-2026-23008.git
cd CVE-2026-23008
# Use Foundry to test