تدقيق العقود الذكية: منع Reentrancy و Overflow

Article author

يظل تدقيق العقود الذكية حجر الأساس لبنية Web3 تحتية قوية، لا سيما مع جذب DeFi وحوكمة السلسلة التراكمية لقيم تريليونية محجوزة. مع أكثر من 280 تدقيقًا أنجزناها في Soken، نُحدد باستمرار ثغرات حرجة مثل إعادة الدخول و overflow الحسابي، التي إذا تُركت دون معالجة تؤدي إلى استغلالات بملايين الدولارات. تفكك هذه المقالة المتجهات الأساسية للتهديد—مثل إعادة الدخول، overflow الحسابي، وثغرات الصلاحيات—وتقدم أفضل الممارسات المثبتة للتطوير والتدقيق لتقوية العقود قبل النشر.

سوف نستعرض أيضًا أنماط كود Solidity التي تكشف الثغرات ونقترح التخفيفات المستفادة من تدقيقات العالم الواقعي. وأخيرًا، نقارن نماذج التحكم في الوصول لتسليط الضوء على مقايضاتها في الحفاظ على أذونات العقود الذكية بأمان. الهدف هو مساعدة المطورين، مؤسسي DeFi، وفرق الأمان على تصميم عقود ذكية منيعة تقلل المخاطر على مستويي الكود والبنية المعمارية.

ما هي إعادة الدخول في العقود الذكية وكيف يمكن منعها؟

إعادة الدخول في العقد الذكي هي ثغرة تنشأ عندما يسمح اتصال خارجي للمهاجم بإعادة الدخول المتكرر إلى وظيفة العقد قبل انتهاء التنفيذ الأولي، مما يمكنه من التلاعب بالحالة بشكل غير مصرح به. هذا العيب يؤدي غالبًا إلى استنزاف خطير في الأصول، كما برهن عليه اختراق DAO الشهير في 2016 واستغلالات DeFi الحديثة. الدفاع الأساسي يتضمن ترتيب تغييرات الحالة والاتصالات الخارجية بعناية، استخدام الأقفال Mutexes، والاستفادة من ReentrancyGuard المدمج في Solidity.

من خلال خبرتنا في تدقيق عقدًا، تظل إعادة الدخول أكثر الأخطاء انتشارًا وتأثيرًا، حيث تمثل حوالي 18% من التنبيهات الحرجة خلال 2026. من أفضل الممارسات أن تسبق تغييرات الحالة الاتصالات الخارجية، أو بدلاً من ذلك استخدام مُعدل nonReentrant في مكتبات OpenZeppelin.

مثال كود لإعادة دخول ساذجة:

mapping(address => uint256) public balances;

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient funds");
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
    balances[msg.sender] -= amount;  // عرضة للخطر: تحديث الحالة بعد الاتصال الخارجي
}

نموذج آمن بتحديث الحالة قبل الاتصال:

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient funds");
    balances[msg.sender] -= amount;  // تم تحديث الحالة أولاً
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
}

رؤية خبراء Soken:

نوصي باستخدام ReentrancyGuard من OpenZeppelin كافتراضي لكل الوظائف التي تعدل الحالة وتتفاعل مع الخارجي، مع تدقيق يدوي شامل خلال الفحص. هذا النهج المزدوج قلل من مخاطر إعادة الدخول في العقود التي قمنا بتدقيقها بأكثر من 90% منذ 2024.

كيف يؤثر overflow و underflow الحسابي على أمن العقود الذكية؟

يحدث overflow أو underflow الحسابي عندما تتجاوز عمليات الأعداد الصحيحة القيم القصوى أو تنخفض دون الحد الأدنى لنوع رقمي معين، مما يسبب تجاوزات غير متوقعة. تؤدي هذه الأخطاء إلى تلف الأرصدة أو العدادات أو أعلام الصلاحيات، مما يمكّن استغلالات مثل سك رموز مفرطة أو تجاوز الحدود. بالرغم من أن Solidity 0.8+ تدعم الحسابات المضمونة أصلًا، إلا أن الأنماط التي تعطل التحقق أو تستخدم كتل unchecked ما زالت تسبب ثغرات.

وفقًا لبيانات Chainalysis من 2025، استغل حوالي 12% من اختراقات DeFi أخطاء حسابية غير محمية. تكشف تدقيقاتنا في Soken أن المشاريع عادة تعطل فحص المترجم لتحسين الأداء، مما يؤدي إلى underflow صعب الاكتشاف وقابل للاستغلال، خاصة في العقود القديمة.

نمط عرضة للخطر (Solidity <0.8 أو unchecked):

uint256 public totalSupply;

function mint(uint256 amount) external {
    totalSupply += amount; // احتمال overflow إذا لم يكن محميًا
}

نمط آمن مع حسابات Solidity 0.8+ المضمونة:

function mint(uint256 amount) external {
    totalSupply += amount; // تم التحقق أوتوماتيكيًا، revert عند overflow
}

كتلة unchecked صريحة عند الحاجة لأداء عالٍ:

function addUnchecked(uint256 a, uint256 b) internal pure returns (uint256) {
    unchecked {
        return a + b;
    }
}

تُستخدم كتل unchecked فقط مع تحقق صارم خارجي وتقليل سطح الهجوم. خلال التدقيق، نعلم عن تعطيل الفحص المدمج كخطورة حرجة.

ما هي نماذج التحكم بالوصول في العقود الذكية وأيها الأكثر أمانًا؟

التحكم في الوصول بالعقود الذكية يحدد من يمكنه تنفيذ وظائف حساسة أو تعديل حالة العقد. النماذج الشائعة تشمل Ownable، Role-Based Access Control (RBAC)، و Multisig. كل نموذج يوازن بين سهولة الاستخدام والأمان بشكل مختلف. Ownable هو الأبسط لكنه معرض لفشل المفتاح الواحد. RBAC يوفر ترخيصًا دقيقًا لكنه أكثر تعقيدًا. Multisig يرفع مستوى الأمان عبر حسابات متعددة موافقة لكنه قد يؤثر على تجربة المستخدم.

استعراضنا لمشاريع DeFi وNFT الحديثة يظهر ارتفاع تبني RBAC بنسبة 34% بين 2024-2026 بسبب قابلية تعيين الصلاحيات المرنة التي تتوافق مع احتياجات الحوكمة المعقدة. ومع ذلك، 40% من العقود المدققة تعتمد فقط على Ownable، مما يعرض المشاريع لخطر نقطة فشل واحدة.

مقارنة بين نماذج التحكم بالوصول:

النموذج دقة الصلاحيات مستوى الأمان التعقيد الاستخدام الصناعي
Ownable مالك واحد معتدل (خطر مفتاح واحد) منخفض مشاريع صغيرة، MVP أولية
RBAC أدوار متعددة عالي (تفويض متعدد الأدوار) متوسط بروتوكولات DeFi، DAOs، تطبيقات متعددة الخدمات
Multisig مواقع متعددة عالي جدًا (إجماع متعدد الأطراف) عالي إدارة الخزائن، خزائن ذات قيمة عالية

مقتطف Solidity يستخدم RBAC من OpenZeppelin:

import "@openzeppelin/contracts/access/AccessControl.sol";

contract MyContract is AccessControl {
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");

    constructor() {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(ADMIN_ROLE, msg.sender);
    }

    function secureFunction() external onlyRole(ADMIN_ROLE) {
        // منطق حساس هنا
    }
}

رؤى خبراء Soken:

صلاحيات العقود الذكية الفعالة تنفذ RBAC أو multisig لكل الوظائف الحرجة وتتجنب مفاتيح إدارة مالك واحد. خلال التدقيق، نتحقق من أن المفاتيح الإدارية مخزنة على محافظ الأجهزة أو multisig لتحمل هجمات الهندسة الاجتماعية واختراق المفاتيح الخاصة.

كيف تنفذ ممارسات تطوير العقود الذكية الآمنة لتجنب الثغرات؟

يتطلب تطوير العقود الذكية الآمن دمج الأمان طوال دورة الحياة: التصميم، الترميز، الاختبار، والنشر. تشمل الممارسات استخدام مكتبات موثوقة (مثل OpenZeppelin)، تقليل الاتصالات الخارجية، تجنب المنطق المعقد في المنشئين، والاختبارات الصارمة باستخدام تقنيات fuzzing والتنفيذ الرمزي. يجب على العقود الثابتة تطبيق أنماط التحديث بحذر مع حوكمة شفافة.

تدمج منهجية Soken تدقيقات يدوية متعددة المراحل مع أدوات تحليل ثابت وديناميكي أوتوماتيكية، لتحديد الأنماط المعروفة والإشارات الجديدة للثغرات التي قد لا تكتشفها الماسحات.

قائمة تحقق للتطوير الآمن:

الخطوة الوصف الأدوات / المكتبات
استخدام مكتبات آمنة إعادة استخدام عقود مجربة مثل OpenZeppelin OpenZeppelin Contracts
تقليل الاتصالات الخارجية تقليل سطح الهجوم بتقييد التفاعل الخارجي مراجعة يدوية + اختبارات reentrancy
اختبار شامل تنفيذ fuzzing، تنفيذ رمزي، اختبارات وحدات وتكامل Echidna, MythX, Slither
تطبيق نماذج صلاحيات فرض RBAC أو multisig في العمليات الحساسة OpenZeppelin AccessControl
تنفيذ الترقية بحذر استخدام أنماط proxy مع ضوابط حوكمة قوية OpenZeppelin Upgrades, Transparent Proxy
توثيق ومراجعة الكود الحفاظ على تعليقات واضحة ومراجعات الأقران تدقيقات داخلية + مراجعات أمان خارجية

أفضل ممارسة Solidity: تصفير متغيرات الحالة قبل الاتصالات الخارجية

mapping(address => uint256) public balances;

function safeWithdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient balance");
    balances[msg.sender] = 0; // إعادة تعيين الرصيد لمنع إعادة الدخول
    (bool sent, ) = msg.sender.call{value: amount}("");
    require(sent, "Failed to send Ether");
}

ما هي الثغرات الشائعة في إعادة الدخول والصلاحيات التي تم العثور عليها في التدقيقات الأخيرة؟

تكشف تدقيقات Soken الحديثة عن ثغرات إعادة دخول خاصة في عقود الزراعة والحصاد القديمة التي تفتقر إلى ترتيب صحيح للمعاملات و/أو ReentrancyGuard. أخطاء الصلاحيات تشمل وجود مفاتيح إدارية مدمجة بدون multisig، غياب وظائف التنصل من الإدارة، واتصالات خارجية غير مقيدة لأي شخص، مما يؤدي لخروقات تحكم كبيرة.

في تدقيق عام 2025، تم الكشف عن بروتوكول DeFi يسمح لعقد خارجي متخفٍ بالاتصال المتكرر بوظيفة سحب المكافآت بسبب غياب القفل، مخاطر تعرض لأصول تبلغ قيمتها ~45 مليون دولار. أظهرت المشاريع ذات تكوين RBAC غير الصحيح مخاطر تصعيد صلاحيات مرتفعة، خصوصًا عندما كانت دوال الضبط غير مقيدة بالأدوار.

ملخص الثغرات الشائعة:

نوع الثغرة الوصف السبب الجذري التأثير
إعادة الدخول تنفيذ الاتصالات الخارجية قبل تحديث الحالة ترتيب الاتصال السيئ أو غياب قفل استنزاف مفاجئ للأموال
overflow الحسابي عمليات جمع أو طرح بدون تحقق تعطيل فحوص Solidity 0.8+ تأثير على سك الرموز أو التحويلات
تحكم وصول غير صحيح وظائف متاحة لأي مستخدم أو خطر مالك واحد غياب RBAC أو multisig تغييرات غير مصرح بها في الأموال أو المعاملات
مفاتيح مدمجة تضمين مفاتيح خاصة أو عناوين إدارية إدارة مفاتيح غير آمنة استيلاء إداري أو تسرب مفاتيح

مقارنة أدوات وتقنيات تدقيق العقود الذكية

التدقيق الحديث يجمع بين التحليل الثابت الأوتوماتيكي، التنفيذ الرمزي، والمراجعات اليدوية للكود لتحديد الأخطاء العامة والخاصة بسياق معين. المحللات الثابتة (Slither, Mythril) تكتشف المشاكل عالية المستوى بسرعة لكنها قد تفوت أخطاء منطقية. أدوات التنفيذ الرمزي (Echidna, Manticore) تختبر سيناريوهات إدخال متباينة. التدقيق اليدوي يتحقق من أمن البنية وصحة المنطق بعمق.

نوع الأداة مثال نقاط القوة القيود
محلل ثابت Slither سريع، يكتشف أنماط مثل إعادة الدخول، أخطاء أعداد صحيحة إيجابيات كاذبة، يفوت تعقيدات المنطق
تنفيذ رمزي Echidna يخلق سيناريوهات تنظيف الإدخال، يكشف أخطاء حافة تكلفة حسابية، تعقيد
تدقيق يدوي مراجعة بشرية رؤى منطقية عميقة وشامل يستغرق وقتًا، متطلب خبرة

تستخدم Soken هذا النهج الهجين، مستفيدة من الأتمتة لتصفية الأخطاء الواضحة والمراجعين الخبراء لاستكشاف متجهات استغلال جديدة حسب سياق البروتوكول والابتكار.

نصيحة احترافية: دمج أدوات اختبار أوتوماتيكية مستمرة ضمن CI/CD مع تدقيقات مهنية منتظمة مهيأة لتعقيد عقدك ونمط المخاطر.


أمان العقود الذكية يتطور بسرعة، لكن ثغرات مثل إعادة الدخول، overflow الحسابي، وضعف التحكم في الوصول تظل قائمة حتى 2026. المشاريع التي تنشر عقودًا دون تصميم أمني دقيق وتدقيق شامل معرضة لخسائر كارثية، كما رأينا في حوادث بارزة عدة.

تُبرز الرؤى من هذه المقالة أهمية مذهلة لدمج الترميز الآمن (مثل تغييرات الحالة قبل الاتصالات الخارجية)، ميزات الأمان الأصلية للغة (حسابات Solidity 0.8+ المضمونة)، ونماذج صلاحيات قوية (RBAC أو multisig). علاوة على ذلك، لن يوفر أفضل دفاع ضد الاستغلالات الناشئة سوى نهج تدقيقي متعدد الطبقات—يجمع بين الفحوص الثابتة والمؤتمتة وتحليلات البشر الخبيرة. النظر الشامل لتطوير العقود الذكية الآمنة يقلل بشكل كبير من المخاطر المالية والسمعة.

لفِرَق التحضير لإطلاق عقودهم أو تحديث الأنظمة القديمة، التحقق من نماذج الصلاحيات المتينة إلى جانب الحماية من إعادة الدخول ضروري. الخطوة القادمة الفورية هي إجراء تدقيق شامل للصلاحيات وإعادة الدخول، وضمان التزام العقد بأفضل الممارسات الموضحة أعلاه. خدمات Soken لـ تدقيق واختبار اختراق العقود الذكية تقدم هذه التحقق الخبير بدقة، مدعومة بمراجعات أمان DeFi المكملة لحماية تدفقات أصول بروتوكولك. تأكد أيضًا من استشارة خريطة التشفير لسياقات الامتثال التنظيمي المتطورة واستخدام Security X-Ray المجاني للتعرف على نقاط الضعف قبل التدقيقات الرسمية.


الخلاصة: أفضل حماية ضد ثغرات العقود الذكية الحرجة هي تبني الحسابات المضمونة في Solidity ونمط ReentrancyGuard مقترنًا بنماذج تحكم وصول دقيقة ومتعددة الموقعين، مدعومة بتدقيقات هجينة شاملة تجمع بين أدوات آلية ومراجعة بشرية خبيرة.

Article author

الأسئلة الشائعة

ما هو reentrancy في العقود الذكية ولماذا هو خطير؟

يحدث reentrancy عندما يستدعي العقد عقدًا خارجيًا قبل إتمام تغييرات الحالة، مما يسمح للمهاجمين بالاستغلال المتكرر. قد يؤدي ذلك إلى استنزاف الأموال أو تغيير المنطق، مما يسبب استغلالات وخسائر مالية كبيرة.

كيف يؤثر arithmetic overflow على العقود الذكية؟

يحدث overflow عندما تتجاوز العمليات الحسابية الحد الأقصى للقيمة التي يمكن للنوع تخزينها، ما يسبب نتائج غير متوقعة. هذا يعرقل منطق العقد، مما يمكن المهاجمين من التلاعب بالأرصدة أو تجاوز الفحوصات.

ما هي أفضل الممارسات للتحكم في الصلاحيات بالعقود الذكية؟

تتضمن الاستخدام الواضح لأدوار الصلاحيات، وتنفيذ التحكم بالدور (RBAC) أو التوقيعات المتعددة، والتدقيق الدوري للصلاحيات لمنع العمليات غير المصرح بها.

كيف يُحسّن تدقيق العقود الذكية الأمان؟

يكتشف التدقيق الثغرات مثل reentrancy والoverflow ومشاكل الصلاحيات قبل النشر. يضمن قوة الكود عبر مراجعة يدوية وأدوات آلية، مما يقلل مخاطر الاستغلال.

ما الأدوات الموصى بها لتطوير عقود ذكية آمنة؟

تشمل الأدوات الموصى بها محللات ثابتة مثل Slither وMythX وأدوات التحقق الرسمية. الجمع بينها وبين التدقيق اليدوي الدقيق يساعد المطورين على اكتشاف وإصلاح المشاكل الأمنية مبكراً.

دردشة