
PoC تعليمي للالتباس في حجم بيانات الإرجاع في تجميع Solidity؛ يتضمن عقدًا ضعيفًا، ومحاكاة استغلال، وإرشادات تخفيف لفك ترميز 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;
}
}
يستخدم عقد سوليديتي التجميع المضمّن لقراءة قيمة مُرجَعة دون التحقق من أن طول بيانات الإرجاع كافٍ. يمكن للمهاجم إرجاع بيانات فارغة، مما يجعل التجميع يقرأ بيانات عشوائية من المكدس، ما يؤدي إلى تلف الذاكرة أو تجاوز الحماية الأمنية.
انشر العقد القابل للاستغلال وعقدًا للمهاجم يعيد استجابة فارغة. تقرأ mload بيانات قديمة.
ret قبل الوصول إليه عبر التجميع.abi.decode) بدلًا من التجميع الخام.git clone https://github.com/yourorg/CVE-2026-23008.git
cd CVE-2026-23008
# Use Foundry to test