
Образовательный PoC для путаницы с размером возвращаемых данных в Solidity assembly; включает уязвимый контракт, симуляцию эксплуатации и рекомендации по смягчению для безопасного декодирования 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;
}
}
Контракт Solidity использует встроенный ассемблер для чтения возвращаемого значения, но не проверяет, что длина возвращаемых данных достаточна. Атакующий может вернуть пустые данные, в результате чего ассемблер прочитает произвольные данные стека, что приведёт к повреждению памяти или обходу защиты.
Разверните уязвимый контракт и контракт атакующего, который возвращает пустой ответ. В этом случае mload считывает устаревшие данные.
ret перед доступом через ассемблер.abi.decode) вместо прямого использования ассемблера.git clone https://github.com/yourorg/CVE-2026-23008.git
cd CVE-2026-23008
# Use Foundry to test