مرحبًا بك في دليل المبتدئين للتدقيق الذكي للعقود! تتمثل إحدى أفضل الطرق لبدء تدقيق العقود الذكي في القفز وإلقاء نظرة على بعض الأنواع الشائعة من نقاط الضعف في العقود الذكية.
سيكون من المفيد إذا كان لديك بالفعل فهم أساسي للغة برمجة Ethereum's Solidity. كما سنلقي نظرة على بعض الأكواد التي كتبها مبرمجو صلابة Noob.
هجوم إعادة الدخول
سيناريو العالم الحقيقي:
تخيل أن لديك 50 قطعة شوكولاتة. لديك أخت صغيرة شقية سمحت لها بأخذ قطعتين من الشوكولاتة منك في أي وقت. أنت أيضًا لا ترغب في تقديم أكثر من 2 شوكولاتة لها في يوم واحد ، خوفًا من إصابتها بتسوس الأسنان. لضمان ذلك ، تقوم كل مساء بحساب عدد الشوكولاتة المتبقية معك. هل تعتقد أن هذا من شأنه أن يعمل؟ أو هل ستتعرض للاختراق من قبل أختك الصغيرة؟
لسوء الحظ ، لن يعمل! تكتشف أختك أنك لا تعرف عدد الشوكولاتة التي لديك حتى حلول المساء. لذلك في اليوم التالي ، تزورك أختك الصغيرة 6 مرات قبل المساء وتأخذ شوكولاتة في كل مرة! هذا ما نسميه هجوم إعادة الدخول.
هنا تقوم بتحديث عدد الشوكولاتة التي لديك في المساء بدلاً من تحديث العدد في كل مرة تأخذ أختك شوكولاتة منك. هذا أيضًا ما يحدث مع العقد الذكي. يفترض العقد الذكي توازنًا معينًا بينما يكون المهاجم مشغولًا بالفعل بسحب قدر من العملة المشفرة من العقد عدة مرات.
مثال على رمز العالم الحقيقي:
هذا الرمز ينتمي إلى عقد ذكي يسمى غير المتعاملين مع البنوك. يمكن لأي شخص سحب الأثير من العقد غير البنكي طالما أرصدة مرسل الرسالة (أي طالب withdraw
الوظيفة) أكبر من أو يساوي المبلغ المطلوب سحبه.
function withdraw(uint _amount) { require(balances[msg.sender] >= _amount); msg.sender.call.value(_amount)(); balances[msg.sender] -= _amount;
}
لاحظ أن هناك كلمة أساسية للاتصال تستخدم لإرسال الكمية المطلوبة من الأثير إلى msg.sender
. يمكن للمهاجم استغلال ذلك من خلال إنشاء عقد يسمى Thief يستدعي فيه وظيفة السحب في a fallback()
وظيفة. أ fallback()
الوظيفة في Solidity هي وظيفة خاصة يتم تنفيذها عند إرسال الأثير إلى العقد الذكي.
هذا يعني أن المهاجم قادر على قم باستدعاء وظيفة السحب بشكل متكرر. وبالتالي ، قبل تحديث العقد الذكي ، فإن أرصدة msg.sender
في السطر الأخير من التعليمات البرمجية ، قام المهاجم بالفعل بسحب الأثير عدة مرات. يمكن تجنب ذلك إذا تم تحديث الأرصدة قبل استخدام الكلمة الأساسية للاتصال ، وبالتالي اتباع a يتحقق من الآثار والتفاعلات .
تأثير:
• أول هجوم عودة من أي وقت مضى حدث في عام 2016 على DAO (منظمة مستقلة لامركزية) نتج عنها ما يقرب من 50 مليون دولار أمريكي. لعكس هذا الاختراق ، قام مجتمع Ethereum بتقسيم Ethereum blockchain مما أدى إلى ETC (Ethereum Classic) و ETH (Ethereum).
الفائض والتخفيض الحسابي
سيناريو العالم الحقيقي:
لنلعب لعبة التفكير. تتكون من عجلة تدور ، ويتم تحديد الفائز بناءً على أكبر عدد يمكنه الحصول عليه في تدوير العجلة. تم تمييز العجلة بالكامل من 256 إلى -256.
قواعد اللعبة هي أن مؤشر جميع اللاعبين يستقر على 0 في بداية كل دورة. ولا يُسمح للاعب بالدوران إلا في اتجاه الأرقام السالبة. كيف ستفوز بهذه اللعبة؟
تتمثل الإستراتيجية الجيدة للفوز بهذه اللعبة في كل مرة في تدوير العجلة بهذه القوة بحيث تدور العجلة حتى -256 ثم تتحول إلى 256 دفعة واحدة. هذا ممكن لأن 256 تأتي بعد -256 مباشرة على العجلة. هذا ما نسميه التدفق الحسابي. والفيضان الحسابي هو العكس بالعكس.
مثال على رمز العالم الحقيقي:
An تحت أو تجاوز يحدث عندما تصل العملية الحسابية إلى الحد الأدنى أو الحد الأقصى.
function withdraw(uint _amount) public { require(balances[msg.sender] - _amount > 0); address payable to = payable(msg.sender); to.transfer(_amount); balances[msg.sender] -= _amount;
}
• _amount
معلمة وظيفة السحب هي عدد صحيح بدون إشارة. قيمة تعيين الأرصدة (التي تشبه قاموسًا بلغة بيثون أو زوج قيمة مفتاح في C ++ أو Java) هي أيضًا عدد صحيح بدون إشارة.
mapping(address => uint256) public balances
البيان المطلوب يتحقق مما إذا كانت أرصدة msg.sender
هو إيجابي أم لا. لكن هذه العبارة ستظل صحيحة دائمًا حتى لو كان المبلغ أكبر من أرصدة msg.sender
. هذا لأن كلا من balances
و _amount
المتغيرات هي من نوع عدد صحيح بدون إشارة وستكون نتيجتها الحسابية (بعد التدفق السفلي) أيضًا عددًا صحيحًا بدون إشارة!
وكما قد تتذكر ، فإن العدد الصحيح بدون إشارة يكون دائمًا موجبًا. هذا يعني أن المهاجم قادر على سحب كمية غير محدودة من إيثر من العقد الذكي! يمكنك العثور على مثال مفصل ورمز تنفيذ لهذه الثغرة الأمنية هنا.
شيء مهم آخر يجب ملاحظته هنا هو أن العملية الحسابية بين عددين صحيحين بلا إشارة هي أيضًا عدد صحيح بدون إشارة. قد يكون الأمر خطيرًا إذا تم التغاضي عن ذلك في العقود الذكية ، حيث يمكن أن يؤدي إلى انتهاكات أمنية غير مرغوب فيها!
function votes(uint postId, uint upvote, uint downvotes) { if (upvote - downvote < 0) { deletePost(postId) }
}
كما لاحظت في المثال أعلاه ، فإن عبارة if لا معنى لها تمامًا مثل upvote - downvote
ستكون دائمًا إيجابية. وسيتم حذف المنشور حتى لو downvotes
أكبر من upvotes
. لتجنب مثل هذه الهجمات ، يوصى باستخدام إصدار مترجم Solidity أكبر من 0.8.0.
تأثير:
عملة تسمى عملة PoWH تم إطلاقها في عام 2017. على الرغم من أنها كانت لعبة Ponzi ، إلا أنها نفسها تعرضت للاختراق بسبب خطأ في التدفق الحسابي أدى إلى خسارة حوالي 866 ETH أو 950,000،XNUMX دولار في ذلك الوقت. يمكنك أن تقرأ عن هذا بالتفصيل هنا.
يجب أن يقرأ: الدروس المستفادة من الهجوم على Tinyman ، أكبر DEX على Algorand
هجوم قطع الخدمة
سيناريو العالم الحقيقي:
تخيل أنك في جامعة Bitcoin Tech. يبدو كل شيء على ما يرام باستثناء وجود طاولة طعام مشتركة للجميع. ولسوء الحظ ، هناك عدد قليل من الأشخاص من فصل آخر الذين يتمكنون دائمًا من شغل مائدة الطعام قبل أي شخص من فصلك.
في السيناريو العملي ، فإنهم يرفضون الخدمة الأساسية للجميع مما يؤدي إلى ضياع الوقت الثمين. هذا ما نسميه "هجوم الحرمان من الخدمة".
مثال على رمز العالم الحقيقي:
في لعبة تسمى ملك الأثيريمكن لأي شخص أن يصبح ملكًا. لكن القاعدة لتصبح ملكًا هي أن الشخص يجب أن يودع المزيد من الأثير من الملك الحالي. يمكن القيام بذلك عن طريق استدعاء claimThrone()
وظيفة عقد ملك الأثير حيث يرسل الشخص الأثير مباشرة إلى الملك السابق ويصبح الملك الجديد.
function claimThrone() external payable { require(msg.value > balance, "Need to pay more to become the king"); (bool sent, ) = king.call{value: balance}(""); require(sent, "Failed to send Ether"); balance = msg.value; king = msg.sender; }
كما قد تكون خمنت ، هذا الرمز عرضة لهجوم DoS ، لكن كيف؟ لهذا ، ستحتاج إلى فهم أن هناك نوعين من العناوين في Ethereum- الأول هو عنوان خارجي حساب مملوك أو ببساطة عنوان المحفظة ، والثاني هو عنوان العقد. يمكن الآن إرسال الأثير من أي من أنواع العناوين هذه.
إذا تم إرسال الأثير عن طريق عنوان العقد ، فسيصبح العقد هو الملك. ولكن لنفترض أن هذا العقد الجديد لا يحتوي على ملف fallback()
وظيفة ضرورية إذا كان العقد يريد قبول الأثير. ثم إذا جاء شخص جديد وحاول الاتصال بـ claimThrone()
وظيفة ، وسوف تفشل دائما!
لاحظ أن هذا يحدث جزئيًا أيضًا لأن ملف claimThrone()
تتحقق الوظيفة صراحةً مما إذا كان نقل الأثير ناجحًا أم لا في العبارة الثانية المطلوبة. يمكنك العثور على الكود الكامل والقيام بهجوم DoS عليه هنا.
من الممكن أيضًا أن يكون الرمز عرضة لهجوم DoS إذا كان الرمز يحتوي على حلقة عبر مجموعة من الأحجام الكبيرة. يحدث هذا لأن ملف حد الغاز يمكن تجاوزها في مثل هذه الحالات. يمكنك أن تقرأ عنها هنا.
تأثير:
لعبة تسمى الحوكمة العقلية، التي كانت على ما يبدو مخطط بونزي ، تعطلت بـ 1100 إيثر لأن كمية كبيرة من الغاز كانت مطلوبة لمعالجة المدفوعات.
العشوائية غير الآمنة
سيناريو العالم الحقيقي:
ذات مرة كان هناك رجل يُدعى هسكي كان دائمًا برفقة قرده المزعج. أجرى هسكي ألعاب اليانصيب وحقق أرباحًا جيدة. ذات يوم لاحظت أليس هسكي يحدق باهتمام في قرده المزعج. ثم رأته يكتب شيئًا على قطعة من الورق ويغلقه في مظروف. بدافع الفضول ، قررت إجراء مزيد من التحقيق.
في وقت لاحق من ذلك المساء ، رأت أليس أن الفائز في اليانصيب قد تم تحديده من خلال فتح الظرف المختوم علنًا. بعد مشاهدته لبضعة أيام ، اكتشفت أليس أن Hesky قرر رقم اليانصيب الفائز من خلال النظر إلى إيماءات Pesky (على سبيل المثال ، إذا حك القرد رأسه ، كتب هيسكي 10)! الآن أليس لديها الصيغة للفوز بكل يانصيب وكان عليها فقط شراء تذكرة اليانصيب بالرقم الصحيح!
افترض هسكي أن طريقته "العشوائية" في تحديد الفائز في اليانصيب لا يمكن تحديدها أبدًا ، لكنه كان غير صحيح حقًا.
مثال على رمز العالم الحقيقي:
في هذا المثال ، يتم إنشاء رقم عشوائي بناءً على تجزئة مجموعة رقم الكتلة والطابع الزمني للكتلة. ثم يتم تعيين هذه التجزئة إلى متغير الإجابة. الآن أي شخص يخمن هذا الرقم العشوائي (على ما يبدو) يكافأ 1 إيثر. هل تعتقد أن هذا غير قابل للاختراق؟
function guess(uint _guess) public { uint answer = uint( keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp)) ); if (_guess == answer) { (bool sent, ) = msg.sender.call{value: 1 ether}(""); require(sent, "Failed to send Ether"); } }
لا! لا يزال بإمكان المهاجم تخمين هذا الرقم العشوائي عن طريق نسخ لصق الرمز ببساطة لإنشاء القيمة المخصصة لمتغير الإجابة ، وتمرير متغير الإجابة نفسه إلى guess()
وظيفة!
guessTheRandomNumber.guess(answer);
يمكنك العثور على الكود الكامل هنا. لتجنب هذا الهجوم ، يوصى باستخدام وظيفة عشوائية يمكن التحقق منها مثل تشينلينك VRF.
تأثير:
تم فقد حوالي 400 ETH بسبب هجوم على يانصيب المليارات الذكية عقد. والمثير للدهشة أن حتى يانصيب العقد نفسه كان مخطط بونزي (أوه!).
التلاعب بالوقت
سيناريو العالم الحقيقي:
يحب ساتوشي أكل البسكويت. يحب جميع أنواع ملفات تعريف الارتباط التي تصنعها والدته. لكن والدته صارمة للغاية وتشعر أن تناول الكثير من البسكويت ليس جيدًا بالنسبة له. لذلك تضع والدته قاعدة بأنه سيحصل على ملفات تعريف الارتباط فقط في الساعة 8 مساءً.
في ذلك اليوم بالذات في الساعة 7:45 مساءً ، ركض ساتوشي إلى والدته وطلب ملفات تعريف الارتباط. تسأل والدته: "كم الساعة؟"
"فمن 8:XNUMX!" - هو يجيب.
"تمام. ثم خذ ملفات تعريف الارتباط من خزانتي ".
وبالتالي ، تمكن ساتوشي من التلاعب بالوقت بنجاح بمقدار 15 دقيقة حتى يتمكن من الحصول على ملفات تعريف الارتباط الخاصة به! يا له من شاب متعطش لملفات تعريف الارتباط!
مثال على رمز العالم الحقيقي:
يمكن التلاعب بالطابع الزمني للكتلة بحوالي 15 ثانية بواسطة عامل منجم. بهذه الطريقة ، يمكن لعامل التعدين تعيين طابع زمني مناسب وتضمين معاملته في نفس الكتلة التي يقوم بالتعدين عليها. الوظيفة play()
ينتمي إلى عقد لعبة يسمى G-Dot.
function play() public { require(now > 1640392200 && neverPlayed == true); neverPlayed = false; msg.sender.transfer(1500 ether);
}
يكافئ هذا العقد 1500 إيثر للاعب الذي هو أول من دعا وظيفة اللعب. ولكن كما ترى ، لا يمكن استدعاء وظيفة التشغيل إلا إذا كانت الآن أو block.timestamp للمعاملة التي تحتوي على المكالمة إلى play()
الوظيفة ، أكبر من وقت العصر 1640392200
يمكن لعامل المناجم التعامل بسهولة مع هذا الطابع الزمني وتضمين معاملته لاستدعاء play()
تعمل في نفس الكتلة بحيث يكون هو نفسه اللاعب الأول. وبهذه الطريقة نضمن أن يفوز عامل المنجم باللعبة!
تأثير:
تم استخدام block.timestamp لإنشاء أرقام عشوائية في ملف حكومي وبالتالي كان عرضة لهجمات التلاعب بالوقت.
تواصل مع QuillAudits
QuillAudits هي عبارة عن منصة ذكية آمنة لتدقيق العقود تم تصميمها بواسطة ريشة
التقنيات.
إنها منصة تدقيق تقوم بتحليل العقود الذكية والتحقق منها بدقة للتحقق من نقاط الضعف الأمنية من خلال المراجعة اليدوية الفعالة باستخدام أدوات التحليل الثابتة والديناميكية ، وأجهزة تحليل الغاز وكذلك أجهزة الاستيعاب. علاوة على ذلك ، تتضمن عملية التدقيق أيضًا اختبارًا شاملاً للوحدة بالإضافة إلى التحليل الهيكلي.
نقوم بإجراء كل من عمليات تدقيق العقود الذكية واختبارات الاختراق للعثور على الإمكانات
الثغرات الأمنية التي قد تضر بسلامة النظام الأساسي.
إذا كنت بحاجة إلى أي مساعدة في تدقيق العقود الذكية ، فلا تتردد في التواصل مع خبرائنا هنا!
لتكون على اطلاع دائم بعملنا ، انضم إلى مجتمعنا: -
تويتر | لينكدين: | فيسبوك | تیلیجرام
وظيفة دليل المبتدئين للتدقيق الذكي للعقود: الجزء الأول ظهرت للمرة الأولى على مدونة Quillhash.
المصدر: https://blog.quillhash.com/2022/01/19/beginners-guide-to-smart-contract-auditing-part-1/
- "
- &
- 000
- 2016
- 7
- من نحن
- حسابي
- العنوان
- الكل
- سابقا
- بالرغم ان
- تحليل
- التدقيق
- مستقل
- البداية
- أفضل
- إلى البيتكوين
- سلسلة كتلة
- علة
- يشترى
- دعوة
- الحالات
- الشيكات
- كلاسيكي
- الكود
- عملة
- مجموعة
- مشترك
- مجتمع
- يحتوي
- عقد
- عقود
- ملفات تعريف الارتباط ( الكوكيز )
- استطاع
- خلق
- التشفير
- حالياًّ
- DAO
- يوم
- اللامركزية
- الحرمان من الخدمة
- التفاصيل
- التنفيذ المباشر
- إلى أسفل
- بسهولة
- أكل
- ETH
- الأثير
- ethereum
- Ethereum blockchain
- Ethereum كلاسيكي
- مثال
- استغلال
- فيسبوك
- نهاية
- الاسم الأول
- مجانًا
- وظيفة
- لعبة
- ألعاب
- GAS
- توليد
- GitHub جيثب:
- الذهاب
- خير
- توجيه
- الإختراق
- الخارقة
- مزيج
- رئيس
- هنا
- كيفية
- HTTPS
- بحث
- IT
- جافا
- الانضمام
- قفز
- ملك
- لغة
- كبير
- خط
- لينكدين:
- طويل
- أبحث
- اليانصيب
- رجل
- مليون
- الأم وطفلها الجديد
- أرقام
- منظمة
- ورق
- نمط
- مجتمع
- قطعة
- المنصة
- بلايستشن
- لاعب
- بونزي
- مخطط بونزي
- قوة
- عملية المعالجة
- المبرمجين
- برمجة وتطوير
- جمهور
- رديت
- عكس
- مراجعة
- الجوائز
- القواعد
- ساتوشي
- أمن
- طقم
- سمارت
- عقد الذكية
- العقود الذكية
- So
- صلابة
- شيء
- غزل
- انقسم
- بدأت
- ملخص الحساب
- الإستراتيجيات
- ناجح
- بنجاح
- التكنولوجيا
- اختبارات
- عبر
- الوقت
- أدوات
- صفقة
- غير المتعاملين مع البنوك
- جامعة
- آخر التحديثات
- قيمنا
- نقاط الضعف
- الضعف
- الضعيفة
- محفظة
- ابحث عن
- تذكار لعبة العجلة
- من الذى
- كسب
- للعمل
- جاري الكتابة