نقاط الضعف في EOS Blockchain في ZeroNights 2018

الصورة

ستبحث هذه المقالة في العديد من نقاط الضعف الحقيقية في EOS blockchain (أحد منافسي Ethereum) وكيف تم دمجها في مسابقة ماكينات القمار الآمنة للجيل الجديد في ZeroNights 2018. إذا كنت مهتمًا بالتعرف على كيفية وضع الأمان في هذه الشبكة blockchain ، ثم موضع ترحيب تحت القط.

الدخول


بدأ كل شيء بحقيقة أنه في الآونة الأخيرة ، أثناء مراجعة عقود Etherium الذكية للأمان ، قدم لنا أحد أصدقائنا مقالًا حول مواطن الضعف في العقود الذكية على شبكة EOS. هذا اهتمام كبير لنا ، وقررنا التحقيق في نقاط الضعف بمزيد من التفاصيل.

كل هذا أدى في النهاية إلى إنشاء مسابقة لـ ZeroNights 2018 تسمى "قطاع الطرق المسلح" مع نقاط الضعف في العقد الذكي.

لنبدأ مباشرة من خلال النظر إلى شبكة EOS blockchain وكيفية التعامل معها وكيف يتم ترتيب كل شيء بداخلها. هناك الكثير من المقالات التي تصف التكنولوجيا على الإنترنت ، لذلك على الأرجح لن تكون هناك تفاصيل تقنية ، لكننا سنحاول إيصال المعنى العام حتى يتمكن المستخدم العادي من الحصول على فكرة أولية عن آليات عمل سلسلة المفاتيح EOS.

وصف تكنولوجيا EOS


EOS.io عبارة عن جيل جديد من blockchain من Block.one ، استنادًا إلى مفهوم PoS ( إثبات الاهتمام ).

من وصف المبدعين في الشبكة بأنفسهم: "EOS عبارة عن برنامج مجاني لشبكة blockchain مفتوح المصدر يوفر للمطورين وأصحاب المشاريع منصة لإنشاء ونشر وتشغيل التطبيقات اللامركزية عالية الأداء (DAPP)."

إذا حاولت باختصار شرح المفهوم ، فسوف ينعكس بشكل جيد مقتطف من مقالة ويكيبيديا:
فكرة إثبات المشاركة (PoS) هي حل مشكلة إثبات العمل المرتبطة باستهلاك الطاقة المرتفع. بدلاً من قوة الحوسبة للمشاركين ، فإن مقدار العملة المشفرة لديهم في حساباتهم. لذلك ، بدلاً من استخدام كمية كبيرة من الكهرباء لحل مشكلة PoW ، يكون لدى مشارك PoS نسبة مئوية محدودة من عمليات التحقق المحتملة من المعاملات. الحد يناظر مقدار عملة التشفير في حساب المشارك
الشبكة جديدة تمامًا ، وتم الإطلاق الأول للشبكة الرئيسية (mainnet) في 10 يونيو 2018. العملة المشفرة الرئيسية هي EOS ، والبوابة الرئيسية للمطورين هي developers.eos.io

يدعم EOS.io blockchain التطبيقات التي أنشأها المستخدمون باستخدام رمز WebAssembly (WASM) ، وهو معيار ويب جديد مع دعم واسع للشركات الكبيرة مثل Google و Microsoft و Apple وغيرها.

في الوقت الحالي ، فإن أحدث مجموعة أدوات لإنشاء التطبيقات التي تقوم بترجمة التعليمات البرمجية في WASM هي clang / llvm باستخدام برنامج التحويل البرمجي C / C ++ الخاص بها.

من أجل تحسين التوافق ، يوصي المطورون باستخدام EOSIO CDT (مجموعة أدوات تطوير العقود) - وهي مجموعة من الأدوات المساعدة من المطورين أنفسهم للعمل الملائم والصحيح على إنشاء عقود ذكية.

لقد تم بالفعل إهمال برنامج التحويل البرمجي eosiocpp السابق وغير المدعوم ، لذلك ينصح الجميع بالترقية إلى الجديد (وقت كتابة هذا التقرير) EOSIO CDT 1.5.

على عكس الأثير


الأثير في مفهومه يستخدم PoW (Proof of Work) ، والذي يتطلب حسابات باهظة الثمن وتعطى المكافأة لأول شخص لحل مشكلة رياضية. هذا هو ، أولئك الذين قرروا بالتوازي ، ولكن لم يكن لديهم الوقت لاتخاذ قرار ، تضيع الطاقة. في هذه الحالة ، يقاتل عمال المناجم فيما بينهم للحصول على مزيد من التقنيات والمعدات المتقدمة. لتوليد كتل أسرع وبالتالي كسب.

بخلاف Ether ، في شبكة EOS ، سيختار النظام مُنشئ الكتلة الجديدة وفقًا لمفهوم PoS ، ويتحدد ذلك بعدد الأحوال الشخصية - وهو جزء صغير من إجمالي عدد العملات المشفرة. وبالتالي ، فإن الشخص الذي يتمتع بثروة أكبر لديه فرصة أفضل لاختياره بواسطة النظام. ولكن على عكس PoW (الأثير) ، لا توجد مكافأة لإنشاء كتلة جديدة من حيث المبدأ ، ودخل عمال المناجم هو فقط عمولة من المعاملات.

الخلاصة - يمكن أن تكون العملات المشفرة المستندة إلى PoW أكثر كفاءة من الطاقة بمقدار 1000 مرة.

نحن نطور بيئة التطوير


لذلك ، يبدو أننا قد انتهينا من النظرية ، ننتقل إلى الممارسة. ولكن في الممارسة العملية ، كل شيء يبدو أكثر إثارة للاهتمام. مع الوثائق في الوقت الذي كنا نحاول اكتشافه في الصيف والبدء في عمل شيء ما في ZeroNights 2018 ، كان كل شيء سيئًا للغاية ، وكانت بوابة التطوير الرئيسية عربات التي تجرها الدواب ، وكانت نصف فارغة وأحيانًا لا تعمل.

لم يتم إطلاق شبكات الاختبار بعد ، لذا اضطررت إلى نشر العقدة الخاصة بي. بالمناسبة ، على عكس الآراء على الإنترنت ، فإن الحصول عليها تبين أنها ليست صعبة للغاية. باستخدام الوثائق الرسمية ، أطلقناها من مطوري السفن. eos.io/eosio-nodeos/docs/docker-quickstart

دعنا نتحدث عن الأدوات المساعدة الرئيسية وبرامج العمل مع EOS blockchain ، والتي كان علي التعامل معها في وقت العمل في المسابقة:

  • Nodeos - في الواقع ، خدمة العقدة EOSIO نفسها ؛ يمكنك تكوين وتكوين المكونات الإضافية المختلفة ، على سبيل المثال CORS ، والتاريخ وغيرها.
  • Cleos هي أداة مساعدة لوحدة التحكم في العمل مع عقدة ، واستدعاء أساليب العقد والتفاعل مع محفظة ومفاتيح ووصول. الأداة الأكثر شيوعا عند العمل مع EOS.
  • Keosd هي محفظة تعزية ، أو بتعبير أدق ، خدمة محفظة ، ومتجر مفاتيح خاص.
  • Eosio.cdt - مجموعة أدوات تطوير العقود ، ما يسمى مجموعة أدوات المطور لتصحيح الأخطاء وتجميع العقود ، وإنشاء ملفات ABI وأكثر من ذلك.
  • Eos.js - مكتبة API Javascript للعمل المريح مع العقدة والعقود عبر الويب ، المضمنة في الموقع.
  • Scatter هي محفظة سطح مكتب لتخزين آمن لمفاتيح حسابك. هناك scatter.js مكتبة الويب ، التي تتفاعل مع محفظة سطح المكتب Scatter على مآخذ الويب وبالتالي تساعد على العمل مع تطبيقات DAPP في المستعرض.

Uff! .. نعم ، هناك الكثير من البرامج ، وفهمها ليس بالأمر السهل تمامًا. وصف كل هذا يستحق مشاركة منفصلة وهو خارج نطاق هذه المقالة. ولكن دعونا نتخيل أننا قمنا بتثبيت عقدة على الخادم الخاص بنا وتعلمنا حتى كيفية استخدام أساليب العقد لاستدعاء طرق العقد إذا كان لدينا واحدة.

نعم ، الشيء الأكثر أهمية. نحن بحاجة إلى رسم العقد الذكي نفسه. سنكتبها في C ++ ، ولكي أفعل شيئًا معقولًا على الأقل ، كان علي قراءة الكثير من الوثائق.

لفهم العقود ، يقدمون مثالًا لعقد Hello في كل مكان. الملف الرئيسي هو hello.cpp ويتم وصف العقد بالكامل فيه.

#include <eosiolib/eosio.hpp> using namespace eosio; class hello : public eosio::contract { public: using contract::contract; /// @abi action void hi( account_name user ) { print( "Hello, ", name{user} ); } }; EOSIO_ABI( hello, (hi) ) 

إذا كنت تحاول باختصار شرح ذلك ، فكل شيء هنا بسيط . نقوم بتحميل مكتبة eosio.hpp ، ثم ننشئ فئة الترحيب (تُعرف أيضًا بالعقد) ونرث عقد الفصل. نقوم بإنشاء طريقة hoid void وإدخال متغير المستخدم type account_name في المعلمات ، كما أنه uint64_t. في هذه الطريقة ، قم بطباعة "Hello" والاسم الذي نحدده عند استدعاء الطريقة. السطر الأخير الذي يوجد به EOSIO_ABI هو ماكرو إضافي يقبل طرقنا الخاصة والعامة من هذه الفئة ، ويشارك أيضًا في تكوين ملف .abi ، حيث تتم الإشارة إلى جميع الطرق العامة للعقد.

استكشاف نقاط الضعف


لذلك ، في إطار هذه المقالة ، تم وصف العديد من نقاط الضعف - دعونا الآن ننظر فيها بمزيد من التفصيل.

تجاوز العددية - تجاوز العددية


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

ماذا يمكن أن تعطي؟ على سبيل المثال ، هناك فحص لنوع من المعلمات العددية ، على سبيل المثال int Number <0 ، ومن المعروف أن int هو رقم موقَّع ، وإذا تجاوز العدد ، فسوف تتغير علامة الرقم للقيم الكبيرة إلى سالبة. وبالتالي ، سيتم تجاوز الشيك. وهنا ، بالطبع ، كل هذا يتوقف على أهمية هذا الاختيار.

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

 //      typedef struct acnts { account_name name0; account_name name1; account_name name2; account_name name3; } account_names; //     (   1 EOS) //  ,     , //      «» void batchtransfer( symbol_name symbol, account_name from, account_names to, uint64_t balance ){ //    require_auth(from); //    account fromaccount; //      require_recipient(from); require_recipient(to.name0); require_recipient(to.name1); require_recipient(to.name2); require_recipient(to.name3); // ,       . //   is_balance_within_range   ( eosio_assert(is_balance_within_range(balance), "invalid balance"); // ,      «» //  , «» 1111111111111111  0,     eosio_assert(balance > 0, "must transfer positive balance"); //   amount    4 //     ,  amount   int64_t amount = balance * 4; //     from,    int itr = db_find_i64(_self, symbol, N(table), from); // ,    eosio_assert(itr >= 0, "wrong name"); //    fromaccount   db_get_i64(itr, &fromaccount, (account)); // ,       // ,    0.1 EOS //    ,    amount eosio_assert(fromaccount.balance >= amount, "overdrawn balance"); //   sub_balance(symbol, from, amount); //    4  add_balance(symbol, to.name0, balance); add_balance(symbol, to.name1, balance); add_balance(symbol, to.name2, balance); add_balance(symbol, to.name3, balance); } 

على الأرجح نفذت القرصنة على النحو التالي. قام المهاجم مسبقًا بإنشاء 4 حسابات ودعا طريقة نقل batchtransfer مباشرةً ، وهو ما يشبه هذا:

 cleos push action contractname batchtransfer \'{"symbol ":"EOS", "from":”attacker”, "to":{ “name0”:”acc0”, “name1”:”acc1”, “name2”:”acc2”, “name3”:”acc3”}, "balance":"111111111111111111 EOS"}' -p attacker@active 


الصورة

سأقوم بالحجز على الفور ، هذا مجرد تخمين ؛ ما مدى دقة قيامهم بالاختراق - لا نعرف ، وإذا كانت هناك أفكار أخرى حول هذه المعلومات أو معلومات أكثر دقة ، فاكتب في التعليقات.

التحقق من المصادقة


عدم التحقق من طريقة العقد require_auth () للحصول على إذن المستخدم سيؤدي إلى حقيقة أن أي شخص ليس لديه الحقوق اللازمة يمكنه استخدام الأساليب المميزة للعقد ، على سبيل المثال ، سحب الأموال من العقد.

عدم التحقق من طريقة الاحتجاج


عند إرسال الأموال إلى عقد (EOS) ، يمكنك الإشارة في ماكرو خاص إلى ما سيحدث بعد ذلك وما يجب القيام به. لنفترض أنه عندما تتلقى الأموال ، سيتم استدعاء خوارزمية معينة ، على سبيل المثال ، لبدء لعبة الروليت أو أي شيء آخر ، بالإضافة إلى شيك:

 if( code == self || code == N(eosio.token) || action == N(onerror) ) { \ TYPE thiscontract( self ); \ switch( action ) { \ EOSIO_API( TYPE, MEMBERS ) \ } } //    action == N(transfer) 

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

مسابقة ZeroNights 2018


ولدت فكرة المسابقة بمفردها: نظرًا لأن كل شيء مرتبط بالألعاب وثلاث نقاط ضعف ، لذلك ، سنجعل اللعبة على آلية التعاقد الذكية في EOS.io blockchain. يجب أن تكون اللعبة بسيطة قدر الإمكان ، ولكنها ممتعة.

فتحة آلة "العصابات المسلحة"! لقد فاجأني دائمًا الأشخاص الذين يتوقون إلى المال السهل - تذكر أنه لا توجد هدايا مجانية في العالم أو لا شيء تقريبًا. هنا ، بالمناسبة ، إنه موجود تمامًا ، أو بالأحرى ، سوف يظهر عند استخدام الثغرات الأمنية.

الواجهة الأمامية


قرروا جعل الألعاب الأمامية عصرية وجميلة وثلاثية الأبعاد. شكرًا لك vtornik23 لعدم رفضك المشاركة وساعدنا في إنشاء واجهة كاملة على محرك Unity3d.

الصورة

آلة الألعاب ثلاثية الأبعاد "قطاع الطرق المسلح" ؛ إرسال 1 EOS على ذلك وسحب ذراع ذكية ، يحصل اللاعب على فرصة لبدء عجلة الحظ وضرب الفوز بالجائزة الكبرى!

نقاط الضعف العقد


وفقًا لفكرة اللعبة ، يعتبر الفوز هو خسارة ثلاث دمى من ZeroNights ، والتي ستكون في المعامل العددي إما 777 أو 0. وكانت فرص الفوز معادلة بنسبة 0.02 ٪ ، وحاول بعض المبرمجين غير الواثقين تعقيد الخوارزمية العشوائية عن طريق إضافة تجاوزات الضرب العشوائي فقط مبلغ الأموال المرسلة ، وكان كسولًا جدًا للتفكير في الشروط بمزيد من التفصيل ، لذلك كتبت للتو إذا (نتيجة = 777 || نتيجة <1) ، مما يجعل من الممكن التراجع عن قيمة سالبة.

  int rnd = random(999); int result = rnd * price.amount; uint64_t prize = 0; print("Result:", result); // BINGO 777 or 000 !!! ~ 0.02% if(result == 777 || result < 1 ) { prize = 100; sendtokens(from); } 

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

قواعد المشاركة


قواعد المشاركة بسيطة للغاية: كان من الضروري محاولة الفوز أو اختراق آليات النظام. عندما تسقط 3 ماتريوشكاس - الفوز بالجائزة الكبرى !!! يشحن النظام 100 وحدة من العملة المشفرة. إذا حصل أحد المشاركين على جائزة الفوز بالجائزة الكبرى 3 مرات على التوالي ، فإنه يصبح فائزًا ويتلقى جوائز من المنظمين - هوديس ذات علامات تجارية وشارات ومجموعة متنوعة من الأعلام.

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

نتائج المنافسة


نتيجة لذلك ، المنافسة ، في رأينا ، كانت مثالية. تم تخطيط المكافآت لثلاثة أشخاص ، وتمكّن ثلاثة منهم فقط من التغلب على المنافسة قبل تاريخ الانتهاء المحدد. عقدت المسابقة لمدة يومين ، حيث كان على المشاركين حل المهمة. كانت الجائزة الرسمية وهدية الهدايا في ختام المؤتمر على المسرح الرئيسي ل ZeroNights 2018.

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

مراجعات المشاركين


أليكسي (مكان واحد)
ZeroNights هو أحد المؤتمرات المفضلة لدي ، بدءًا من الأول ، في مدينة سانت بطرسبرغ ، لم يفوتني أحد. إنه يعطي الحماس دائمًا لمدة ستة أشهر بالتأكيد ، وهناك في الربيع PHDays :). آخر 3 سنوات كنت أفعله تطوير blockchain. في هذا العام ، وصلت لعبة blockchain إلى ZeroNights (في الماضي ، يبدو أن الحقيقة هي نفسها ، لقد كانت على المتسلل ، لكني فاتتها). بادئ ذي بدء ، بعد التسجيل في المؤتمر ، ذهبت لمعرفة ما وكيف كان هناك مع blockchain. اعتقدت أنه سيكون شيء مثل PHDays ، نوع من المنحنى عشوائي أو حالة السباق على الهواء. ولكن هنا كان EOS ، الذي تعرفت عليه قليلاً في hackathon EOS الأول ، لكنه لم يمض وقت طويل ، وإلى جانب ذلك ، فقد كل الإعدادات الخاصة بالتطوير. سقطت روح القتال ، وذهبت لانتظار بدء المؤتمر. لكن الفضول أصبح أفضل ، بعد كل شيء ، ما هو الخطأ في EOS!

ستانيسلاف بوفولوتسكي ( مكانان )
بالنسبة لي كانت مسابقة طويلة ولكنها مثيرة للاهتمام. وكانت فرصة رائعة للتعرف على بنية EOS blockchain. بدأت المسابقة بمفاجأة أنك لن تحصل على شبكة EOS (mainnet) - فقط من أجل $$$. بعد المطالبة بنشر العقد على شبكة الاختبار ، والتسجيل على هذه الشبكة ، وإعداد الانتثار وعرض سجل المعاملات لعقد اللعبة ، أصبح من الواضح على الفور كيفية خداع آلة القمار (قام صاحب العقد بذلك عدة مرات أثناء الاختبار). لكن الثقة في أن إدارة المنافسة سريعة وسهلة للغاية قد اختفت بسرعة بمجرد أن الشبكة لم توافق على جميع معاملاتي ذات معلمات مماثلة للمعاملة الفائزة.

ايرينا (المركز الثالث)
قبل المشاركة في المسابقة ، قدمت عمل العقود الذكية فقط من الناحية النظرية ، لذلك كان من المثير للاهتمام للغاية "أن نلتقي بهم على الهواء مباشرة" ، انظر الكود المصدري ، جرب الأدوات (وتأكد مرة أخرى من أن الثعبان هو الأفضل)). تحولت المهمة إلى أن تكون مثيرة للغاية حقا. شكرا لك

وفي الختام


كي لا نقول أن الجميع تعاملوا بسهولة. بالنسبة لشخص ما ، كان ذلك يومًا صعبًا ، وفقط في النهاية تمكن المحظوظون من الفوز باستخدام أوجه القصور في أي blockchain - إذا وصلت المعلومات إلى blockchain ، فسيكون الوصول إليها متاحًا للجميع ، وإذا قام أحدهم بالفعل باختراق شيء ما ، يمكن للآخر مشاهدته الطريق.

نشكر جميع المشاركين وأولئك الذين ساعدوا في تنظيم المسابقة.
نراكم في ZeroNights 2019 ، مغامرات جديدة في انتظاركم!

Source: https://habr.com/ru/post/ar433552/


All Articles