مدخل الى العقود الذكية وكيف يتم تأمينها من الهجمات شائعة الاستخدام والتي تكون خطيرة جدا في التطبيق اللامركزي المبني على شبكات البلوكتشين المختلفة.
نبذة عن العقود الذكية
العقد الذكي هو ببساطة برنامج مثل برامج الكمبيوتر لكن يعمل على شبكة البلوكتشين، نمى عدد حالات استخدم العقود الذكية في البلوكتشين بشكل كبير خلال السنوات السابقة حيث تم اضافة العديد من المميزات.
بمعنى آخر، يمكن تشبيه العقد الذكي باتفاق بين شخصين موجودين على شبكة البلوكتشين، الجانب الأكثر أهمية في هذا الاتفاق هو أنه ذاتي التنفيذ وأمن ولا يتطلب تدخل أطراف ثالثة مثل المحامين أو البنوك. كما أنه يزيل مخاطر الطرف المقابل من خلال السماح للمستخدمين بالتحقق من أرصدتهم في أي وقت والتأكد من عدم قيام أي شخص بتعديلها دون إذن متبادل، لفهم أكثر للعقود الذكية يمكننا تقسيم العقد الذكي إلى:
- العقود: كان هناك العديد من القوانين فوق بعضها البعض في هيئة عقود على مدار الوقت لأسباب مختلفة. تطور مفهوم العقد إلى أكثر من مجرد تبادل شيء ما بين شخصين. يشمل العقد اتفاقية مصاغة جيداً مع مجموعة متنوعة من البيانات والضمانات والأحكام التي تهدف إلى حماية كلا الطرفين من الأحداث غير المتوقعة التي حدثت أثناء المعاملة.
- الذكية: يشير هذا إلى مدى نجاح هذه الاتفاقيات في التنفيذ الذاتي كونة ذكي ويعرف متى سيتم تنفيذة وفقا لشروط منطقية برمجية.
الآن بعد أن حددنا ما هي العقود الذكية، فلنلقِ نظرة على بعض الأمثلة في العالم الحقيقي، من الأمثلة البسيطة على ذلك تحويل الأموال من حسابك المصرفي إلى حساب صديقك مرة واحدة شهريا دون أن تقوم أنت (أو صديقك) بأي شيء يدويا، لربما دفع اجار او مستحقات الكهرباء.
تتيح العقود الذكية التنفيذ غير الموثوق به للكود نظراً لطريقة بنائها؛ يشير هذا المفهوم الى أننا قد نشكل مجموعات مستقلة لا تخضع لسيطرة مركزية، حيث تخفض تكاليف المعاملات عن طريق إزالة متطلبات الأطراف الثالثة الجديرة بالثقة.
لكن ما أهمية جعل كل شيء تلقائي بالنسبة للعقود الذكية، تمكننا من أتمتة المعاملات مع بعضنا البعض والتأكد من حدوثها بالطريقة المتفق عليها من قبل جميع الأطراف، يتم إرسال المبلغ المناسب من المال في الوقت المناسب. كما أنه يقلل من متطلبات الأطراف الثالثة لإجراء هذه العملية يدويا مثل البنوك أو المحامين.
كيف تعمل العقود الذكية وماهي التقنيات المستخدمة؟
باعتبار العقد الذكي هو بروتوكول كمبيوتر مصمم للإسراع في العمليات بشكل رقمي وتقليل كمية البيروقراطية أو التحقق والتنفيذ. تتيح العقود الذكية تفعيل معاملات موثوقة دون مشاركة أطراف ثالثة، حيث يمكن تتبع هذه المعاملات وهي غير قابلة للإلغاء.
تتكون العقود الذكية من كود برمجي يتم تنفيذه باستخدام تقنية البلوكتشين عندما يتم استيفاء معايير معينة، ويتفاعل هذا الكود مع شبكة البلوكتشين لتنفيذ وظائف محددة. بالاعتماد على نوع البلوكتشين المستخدم لنشر العقد الذكي، يمكن كتابة الكود بعدة لغات برمجة مثل Solidity (المستخدمة بواسطة الايثيريوم) و Simplicity (المستخدمة بواسطة Blockstream) وغيرها.
بشكل عام، يتم إنشاء العقد الذكي لسببين رئيسيين:
- للاحتفاظ بالبيانات المتعلقة باتفاقية بين شخصين بطريقة شفافة وخالية من النزاعات مع التخلص من خدمات الوسيط.
- على أساس هذه الاتفاقية المنطقية بين الطرفين يتم تنفيذ العقد او البرنامج بشكل تلقائي عند استيفاء هذه الشروط.
لغة Solidity
لغة Solidity هي لغة البرمجة الأكثر استخداماً لإنشاء العقود الذكية على شبكة بلوكتشين الايثيريوم. هي لغة برمجية موجهة نحو العقود الذكية، مما يعني أنها مصممة لإنشاء عقود ذكية وتكرار ميزات العقد في العالم الحقيقي مثل الفئة ومتغيرات الحالة والوظائف والميراث والمكتبات، حيث تتضمن لغة Solidity البناء من لغات برمجة مثل جافاسكربت (JavaScript) و بايثون (Python).
يتم بناء كود لغة Solidity في ECMAScript (أو JavaScript) ويتم تجميعه إلى EVM bytecode، فهي لغة شبيهة جدا بلغة البرمجة جافاسكربت.
اختبار اختراق العقود الذكية
فهمنا الآن فكرة العقود الذكية، اذا كيف نقوم باختبار الاختراق عليها؟
لبدء اختبار اختراق العقد الذكي، يجب عليك أولاً:
- تثبيت ميتاماسك (Metamask).
- صنع محفظة جديدة في ميتاماسك وتذكر تخزين عبارة البذور الخاصة بك.
- الاتصال بشبكة اختبار الايثيريوم (Ropsten) عبر خيار القائمة المنسدلة في أعلى صفحة المحفظة.
- اطلب عملات الايثيريوم المجانية على شبكة الاختبار بشكل مجاني.
- تثبيت محرر Remix.
- تثبيت Truffle عن طريق npm install -g truffle.
الثغرات الشائعة والاستغلال
تحتوي العقود الذكية (Smart Contracts) على عدد من نقاط الضعف التي قد يتم إساءة استخدامها من قبل الأطراف السيئة، حيث يمكن أن تمنح هذه الثغرات للمهاجم السيطرة على تنفيذ بعض الاكواد البرمجية، مما يسمح له بسرقة الأموال أو إزالة البيانات أو تغيير حالة العقد.
تُعرف نقطة الضعف الأكثر شيوعاً باسم هجمات اعادة التشغيل (Replay attacks)، وهي عبارة عن هجمات تسمح بإجراء أنشطة مستمرة على عقد ذكي على سبيل المثال إرسال المعاملات دون إنفاق أي أموال من أموالهم الخاصة وبالتالي هزيمة الهدف من استخدام النظام الأساسي.
إذا قمت بإرسال معاملة وقبلها رمز العقد الخاص بك لأي سبب (على سبيل المثال، إصدار الرموز)، فيجب رفض أي معاملة لاحقة ذات مدخلات مختلفة وفقاً لمنطق العقد الخاص بك باعتبارها غير قانونية، لأنه لم يتم تحويل أي أموال بين هذه الحسابات.
بتعريف آخر، هجمة اعادة التشغيل او يطلق عليها تسمية “هجوم عبر الرد”، هي عملية حصول المخترق على معلومات المصادقة (اسم المستخدم، كلمة السر أو توكن معين) لكي يقوم بإعادة استخدامها. يحصل المهاجم على المعلومات إذا كان في منتصف جلسة الاتصال (Man in the middle) أو التنصت للحصول على نسخ من البيانات. إذا نجحت هذه الهجمة فسيكون للمهاجم نفس صلاحيات صاحب البيانات، لذا فهي خطيرة جدا وشائعة.
على سبيل المثال، احمد يريد ان يثبت هويته مع سارة لغرض الاتصال بها، حيث يكون بينهم نوع من أنواع كلمات السر. هنالك متنصت يسمع كلمة السر، فيقوم بإعادة الاتصال مع سارة (على الانترنت) واخبارها بكلمة السر (نوع من أنواع إثبات الهوية)، وعندها سيتم الاتصال فيما بينهم ضنا منها انه احمد.
نوع آخر من الهجمات هو Integer Overflow and Underflow؛ تحدث هذه الهجمة عند تجاوز حجم المتغير للعدد، أي عندما يتم تجاوز نطاق العدد لوظيفة ما، على سبيل المثال إضافة مليون دولار إلى عدد بحجم رقم واحد.
طريقة هجوم نموذجية أخرى هي Reentrancy، حيث يتمكن المهاجم الذي يتحكم في الأكواد البرمجية الخاصة بك من استخدام هذا الوصول لإجراء المزيد من العمليات على المحفظة لربما من أجل استغلال مناطق أخرى من الاكواد البرمجية أو حتى الوصول إلى الحسابات الأخرى التي تمتلكها على هذه المنصة.
إعادة الهجوم (Replay attack)
يحدث هجوم الإعادة عندما يستخدم المخترق نفس قيم المعاملة في الشبكة ثم يكررها بعد أن يتم تعدينها في كتلة. عندما ينشر المهاجم معاملة إلى الشبكة ثم يحاول إعادة بث نفس المعاملة قبل أن يتاح للمعدنين الوقت لتعدينها في كتلة، يُعرف هذا باسم هجوم الإعادة. نظراً لأن المعدنين سيرفضون معاملات أخرى مع مرسلين متشابهين، فقد يتم إبطال النشر الأصلي لهذه المعاملة.
يمكن الحماية من هذه الهجمة عن طريق التأكد من أن حساب المرسل و الـ nonce الخاصة بالمعاملة مميزان.
على سبيل المثال افترض أن احمد أرسل 10 ايثيريوم الى سارة، لكن كان هنالك خالد (الذي لديه حق الوصول إلى مفتاح أحمد الخاص) الذي أعاد النشر لإرسال 10 ايثيريوم مرة أخرى الى سارة قبل أن يتم تعدينها في كتلة. في هذه الحالة، لن تنجح سوى محاولة واحدة فقط من محاولتي إرسال الايثيريوم التي تم إجراؤها.
تجاوز العدد الصحيح والتدفق (Integer Overflow and Underflow)
هاتان الوظيفتان تسمحان بالتدفق الزائد الى متغير ما لحفظ قيمة معينة، تعتبر هذه من الهجمات الشائعة، والتي لا يمكن تصورهما وقد يؤديان إلى عواقب وخيمة على الشبكة.
العدد الصحيح هو عدد مثل 1 أو 5 أو 45 وهو الوحدة الأساسية لبيانات الكمبيوتر. ينتج عن التدفق الزائد والنقصان قيمة عددية أعلى من، تساوي، أو اقل من الرقم الأصلي.
هجمات Reentrancy Attack
وهو عبارة عن مشكلة في البلوكتشين تسمح للمخترقين بسرقة رصيد العقد الذكي، يحدث ذلك عندما يتصل العقد الذكي بعنوان خارجي غير موثوق به، ويكون هذا العنوان الخارجي قادراً على إعادة الاتصال بالعقد الأصلي قبل انتهاء المعاملة الأولية. يسمح هذا للمهاجم باستنزاف الأموال من الحساب الأول قبل اكتمال التنفيذ.
الحل لهذه المشكلة يتمثل بخطوتان يمكنك اتباعها للحفاظ على تأمين العقد:
- في كل مرة ترسل فيها الدالة بعض الايثيريوم، يجب عليك التأكد من عدم وجود عمليات سحب معلقة من نفس الحساب. ضع في اعتبارك أن هذا قد لا يغطي جميع السيناريوهات، لأن أخذ جزء من رصيدك قد يسمح للمهاجم بسحب المزيد عبر إعادة الدخول.
- التصميم الدقيق هو أعظم طريقة للدفاع عن العقد من هذه الهجمات. على سبيل المثال، في بعض الحالات قد يكون من الأفضل استخدام طرق مثل أنماط السحب بدلاً من مجرد إرسال الايثيريوم خارج عقودك.
لماذا يعد اختبار الاختراق مهم لمشاريع التطبيقات اللامركزية؟
العقود الذكية مكتوبة في كود برمجي، وكما نعلم جميعًا يمكن اختراق الكود. نظراً للمصلحة العامة في العقود الذكية، لا ينبغي أن يُصدم أحد إذا سعى المخترقين إلى استغلال الثغرات الأمنية في العقود الذكية.
لذلك، لا يجب أن يعتبر أمان العقد الذكي أمر متروك للشبكة خلف العقد الذكي، يجب عليك اختبار عقدك الذكي باستخدام أدوات أتمتة الاختبار والتحقق من أمانه بمساعدة المهندسين المؤهلين والمتخصصين الآخرين في تكنولوجيا البلوكتشين.
من المهم ايضاً أن تفهم الأدوات التي تستخدمها، وكذلك كيفية عمل كود الأشخاص الآخرين، حتى تتمكن من اكتشاف الصعوبات المحتملة قبل ظهورها أثناء تنفيذ المعاملة.