
PoC éducatif pour la confusion de taille des return-data de l'assembly Solidity ; inclut un contrat vulnérable, une simulation d'exploitation et des recommandations d'atténuation pour un décodage ABI sécurisé.
// 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 contrat Solidity utilise de l'assembly inline pour lire une valeur retournée, mais ne valide pas que la longueur des données de retour est suffisante. Un attaquant peut renvoyer des données vides, ce qui fait lire à l'assembly des données de pile arbitraires, entraînant une corruption de la mémoire ou un contournement de sécurité.
Déployez le contrat vulnérable et un contrat attaquant qui renvoie une réponse vide. Le mload lit des données obsolètes.
ret avant d'y accéder via l'assembly.abi.decode) au lieu de l'assembly brut.git clone https://github.com/yourorg/CVE-2026-23008.git
cd CVE-2026-23008
# Use Foundry to test