فهم هجمات تجاوز وتدفق على العقود الذكية

دليل هجمات تجاوز وتجاوز التدفق على العقود الذكية.

ضع في اعتبارك الرسم التخطيطي التالي:

فهم هجمات تجاوز وتدفق على العقود الذكية

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

هذا هو عداد المسافات العادي الذي يحسب المسافة التي قطعتها سيارتك. ينتقل عداد المسافات هذا من 000000 إلى 999999. وهذا هو السبب في أن اللحظة التي تعبر فيها مسافة 1،000،000 كم سيعود عداد المسافات إلى 000000.

قد يكون لهذا بعض التداعيات الخطيرة.

فهم هجمات تجاوز وتدفق على العقود الذكية

فكر في مطلع الألفية و مشكلة عام 2000. كانت Y2K فئة من أخطاء الكمبيوتر التي كانت تهدد بإحداث فوضى في مطلع الألفية. لتبسيط الأمر قدر الإمكان ، مثلت العديد من البرامج سنوات مكونة من أربعة أرقام مع آخر رقمين فقط. لذلك ، تم تخزين 1998 كـ 98 و 1999 كـ 99. ومع ذلك ، سيكون هذا مشكلة عندما يتغير العام إلى 2000 ، حيث سيحفظه النظام كـ 00 ويعود إلى عام 1900.

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

خطأ تجاوز السعة

يحدث الفائض عندما يزداد رقم فوق قيمته القصوى. لنفترض أننا أعلنا عن متغير uint8 ، وهو متغير بدون إشارة ويمكن أن يستغرق ما يصل إلى 8 بتات. هذا يعني أنه يمكن أن يحتوي على أرقام عشرية بين 0 و 2 ^ 8-1 = 255.

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

مع وضع ذلك في الاعتبار ، ضع في اعتبارك المثال التالي.

uint أ = 255 ؛

أ ++ ؛

سيؤدي هذا إلى تجاوز لأن الحد الأقصى لقيمة هو 255.

يمكن للصلابة التعامل مع أرقام تصل إلى 256 بت. الزيادة بمقدار 1 ستؤدي إلى حالة تجاوز:

سيؤدي هذا إلى تجاوز ، لأن الحد الأقصى لقيمة هو 255.

يمكن للصلابة التعامل مع أرقام تصل إلى 256 بت. الزيادة بمقدار 1 ستؤدي إلى حالة تجاوز:

0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

+ 0x000000000000000000000000000000000001

——————————————-

= 0x000000000000000000000000000000000000

دعنا نتحقق من خطأ تجاوز السعة باستخدام عقد نقل رمز بسيط (الرمز مأخوذ من جيثب):

تعيين (العنوان => uint256) التوازن العام ؛

// غير آمن

نقل الوظيفة (العنوان _to ، uint256 _value) {

/ * تحقق مما إذا كان لدى المرسل رصيد * /

تتطلب (BalanceOf [msg.sender] >= _value) ؛

/ * إضافة وطرح أرصدة جديدة * /

BalanceOf [msg.sender] – = _value؛

التوازن من [_to] + = _value ؛

}

// يؤمن

نقل الوظيفة (العنوان _to ، uint256 _value) {

/ * تحقق مما إذا كان لدى المرسل رصيد ومن وجود فيضانات * /

تتطلب (BalanceOf [msg.sender] >= _value && التوازن من [_to] + _value >= BalanceOf [_to]) ؛

/ * إضافة وطرح أرصدة جديدة * /

BalanceOf [msg.sender] – = _value؛

التوازن من [_to] + = _value ؛

}

لذا ، ماذا لدينا هنا?

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

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

خطأ تحت التدفق

الآن ، نصل إلى الطرف الآخر من الطيف ، خطأ Underflow. هذا يعمل في الاتجاه المعاكس بالضبط. تذكر كيف يمكن لـ uint8 أن يأخذ قيمًا بين 0 و 255 فقط؟ ضع في اعتبارك الكود التالي.

unint8 أ = 0 ؛

أ-؛

لقد تسببنا للتو في تدفق منخفض سيؤدي إلى الحصول على أقصى قيمة ممكنة وهي 255.

تطبيق نفس المنطق في عقود Solidity الذكية:

0x000000000000000000000000000000000000

– 0x000000000000000000000000000000000001

——————————————-

= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

كما ترى ، يمكن أن يؤدي إلى تحريف خطير للبيانات.

دعنا نتحقق من جزء من التعليمات البرمجية ونرى كيف يمكن أن يتسبب التدفق البسيط في إحداث فوضى في العقد الذكي (الرمز مأخوذ من GitHub):

تعيين (العنوان => uint256) التوازن العام ؛

// غير آمن

نقل الوظيفة (العنوان _to ، uint256 _value) {

/ * تحقق مما إذا كان لدى المرسل رصيد * /

تتطلب (BalanceOf [msg.sender] >= _value) ؛

/ * إضافة وطرح أرصدة جديدة * /

BalanceOf [msg.sender] – = _value؛

التوازن من [_to] + = _value ؛

}

// يؤمن

نقل الوظيفة (العنوان _to ، uint256 _value) {

/ * تحقق مما إذا كان لدى المرسل رصيد وللتحقق من وجود فائض * /

تتطلب (BalanceOf [msg.sender] >= _value && التوازن من [_to] + _value >= BalanceOf [_to]) ؛

/ * إضافة وطرح أرصدة جديدة * /

BalanceOf [msg.sender] – = _value؛

التوازن من [_to] + = _value ؛

}

في مثال الكود الموضح أعلاه ، يمكن للمتسلل الاستفادة من manipulateMe لأن المصفوفات الديناميكية مخزنة بطريقة متسلسلة. كل ما يحتاجه المخترق هو:

استدعاء popBonusCode إلى underflow

احسب موقع تخزين manipulateMe

تعديل وتحديث قيمة manipulateMe باستخدام editBonusCode

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

مخاطر هجمات تجاوز وتحت التدفق

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

تخيل موقفًا يحتوي فيه حامل الرمز المميز على رموز X فقط. لنفترض أنه يحاول إنفاق X + 1 الرموز. إذا لم يتحقق البرنامج من ذلك ، فهناك احتمال أن ينتهي الأمر بالمهاجم برموز أكثر مما لديه بالفعل ويحصل على أقصى حد من الرصيد.

تأمل المثال التالي (مأخوذ من nethemba):

صلابة براغما ^ 0.4.22 ؛

رمز العقد {

تعيين (العنوان => uint) أرصدة ؛

نقل الوظيفة (العنوان _to ، uint _value) عام {

تتطلب (أرصدة [msg.sender] – _value >= 0) ؛

أرصدة [msg.sender] – = _value ؛

أرصدة [_to] + = _value ؛

}

}

في الكود الموضح أعلاه ، قد يبدو الشرط المطلوب في وظيفة “النقل” صحيحًا للوهلة الأولى ، ولكن فقط حتى تدرك أن العمليات بين وحدتين تنتج قيمة الوحدة.

ما يعنيه هذا في النهاية هو أن قيمة أرصدة [msg.sender] – _value >= 0 سيكون دائمًا صحيحًا بغض النظر عن الحالة.

بسبب هذا الشرط ، يمكن للمتسلل امتلاك أموال أكثر مما يمتلكه بالفعل وتحقيق أقصى قدر من رصيده. على سبيل المثال إذا كان المخترق يمتلك 100 رمزًا ويحاول امتلاك 101 رمزًا ، فسينتهي به الأمر بـ 100-101 رمزًا ، مما يمنحه 2 ^ 256-1 رمزًا نتيجة لانخفاض التدفق!

هذا يمكن ببساطة كسر النظام بأكمله.

تحدث مشاكل العالم الحقيقي من خلال هجمات Underflow

قامت 4chan’s / biz / grouped بإنشاء “إثبات عملة الأيدي الضعيفة” أو POWH. لقد كان مخطط بونزي شرعيًا ، ومع ذلك ، ما زال الناس يشترونه ونما إلى أكثر من مليون دولار.

ومع ذلك ، اتضح أن مطوري عملات POWH لم يؤمنوا جميع العمليات ولم يكونوا قادرين على وضع الدفاعات المناسبة ضد هجمات تجاوز التدفق والتدفق. لهذا السبب بالذات ، تمكن مخترق غير معروف من الاستيلاء على 2000 ETH والتي كانت تساوي حوالي 2.3 مليون دولار.

كما ترى ، من المهم للمطور تقوية دفاعاته ضد هجمات التدفق الزائد والتدفقات السفلية. بصفتك صائدًا للمكافآت ، يجب أن تكون على اطلاع على هجمات الفائض / التدفق السفلي.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map