تعتبر تجاوز سعة الأعداد الصحيحة مشكلة شائعة في البرمجة. في معظم لغات البرمجة، يتم تخزين قيم الأعداد الصحيحة في ذاكرة ذات طول ثابت. تنقسم الأعداد الصحيحة إلى نوعين: غير موقعة وموقعة، والفرق يكمن في ما إذا كانت تستخدم البت الأعلى كبت علامة. على سبيل المثال، يمكن لذاكرة 32 بت تخزين الأعداد الصحيحة غير الموقعة في النطاق من 0 إلى 4,294,967,295 (uint32)، أو الأعداد الصحيحة الموقعة في النطاق من -2,147,483,648 إلى 2,147,483,647 (int32).
عندما تتجاوز نتائج الحسابات النطاق الذي يمكن لنوع البيانات الصحيحة تمثيله، يحدث تجاوز. معظم لغات البرمجة والمترجمات لا تتحقق من هذه الأخطاء، بل تنفذ ببساطة عملية المودول أو تنتج سلوكاً غير محدد. قد يؤدي ذلك إلى نتائج غير متوقعة في تشغيل البرنامج. في كتابة العقود الذكية على blockchain، وخاصة في مجال التمويل اللامركزي، تعد حسابات الأعداد الصحيحة شائعة، لذا من الضروري الانتباه بشكل خاص إلى ثغرات تجاوز الأعداد الصحيحة.
يمكن تقسيم تجاوز العدد الصحيح إلى حالتين: تجاوز علوي وتجاوز سفلي:
تجاوز السعة: تكون نتيجة الحساب أكبر من القيمة القصوى التي يمكن لنوع البيانات تمثيلها. على سبيل المثال، عند إضافة 1 إلى 0xFFFFFFFF في uint32، سيتحول إلى 0x00000000.
الانخفاض: تكون نتيجة الحساب أقل من الحد الأدنى الذي يمكن لنوع البيانات تمثيله. على سبيل المثال، 0 مطروحًا منها 1 من نوع uint32 ستتحول إلى 0xFFFFFFFF.
!
في أبريل 2018، تم اختراق عقد توكن BeautyChain(BEC) بسبب ثغرة تجاوز السعة العددية، حيث حصل المهاجم على كميات هائلة من التوكنات. ظهرت هذه الثغرة في دالة batchTransfer، حيث لم يتم التحقق من تجاوز سعة الضرب، مما أدى إلى إمكانية تحويل كميات كبيرة من التوكنات باستخدام رصيد توكنات قليل.
!
لتجنب تجاوز السعة الرقمية، يمكن اتخاذ التدابير التالية:
قم بتكوين خيارات تجميع Rust، للتحقق من تجاوزات الأعداد الصحيحة في وضع الإصدار أيضًا وإثارة panic.
استخدم حزمة uint لدعم أنواع الأعداد الصحيحة الأكبر، مثل U256، U512، وما إلى ذلك.
استخدم دالة تحويل من نوع uint لاكتشاف الفائض، مثل as_u128().
استخدم دالة Safe Math مثل checked_add() للتحقق مما إذا كانت الحسابات قد تجاوزت.
من خلال هذه الطرق، يمكن تجنب ثغرات تجاوز السعة بشكل فعال، وزيادة أمان العقود الذكية. عند كتابة العقود التي تتضمن حسابات كبيرة، من الضروري التعامل بحذر مع مشكلة تجاوز السعة.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
العقود الذكية整数溢出漏洞:防护措施详解
ثغرة تجاوز العدد الصحيح ووسائل الحماية منها
تعتبر تجاوز سعة الأعداد الصحيحة مشكلة شائعة في البرمجة. في معظم لغات البرمجة، يتم تخزين قيم الأعداد الصحيحة في ذاكرة ذات طول ثابت. تنقسم الأعداد الصحيحة إلى نوعين: غير موقعة وموقعة، والفرق يكمن في ما إذا كانت تستخدم البت الأعلى كبت علامة. على سبيل المثال، يمكن لذاكرة 32 بت تخزين الأعداد الصحيحة غير الموقعة في النطاق من 0 إلى 4,294,967,295 (uint32)، أو الأعداد الصحيحة الموقعة في النطاق من -2,147,483,648 إلى 2,147,483,647 (int32).
عندما تتجاوز نتائج الحسابات النطاق الذي يمكن لنوع البيانات الصحيحة تمثيله، يحدث تجاوز. معظم لغات البرمجة والمترجمات لا تتحقق من هذه الأخطاء، بل تنفذ ببساطة عملية المودول أو تنتج سلوكاً غير محدد. قد يؤدي ذلك إلى نتائج غير متوقعة في تشغيل البرنامج. في كتابة العقود الذكية على blockchain، وخاصة في مجال التمويل اللامركزي، تعد حسابات الأعداد الصحيحة شائعة، لذا من الضروري الانتباه بشكل خاص إلى ثغرات تجاوز الأعداد الصحيحة.
يمكن تقسيم تجاوز العدد الصحيح إلى حالتين: تجاوز علوي وتجاوز سفلي:
تجاوز السعة: تكون نتيجة الحساب أكبر من القيمة القصوى التي يمكن لنوع البيانات تمثيلها. على سبيل المثال، عند إضافة 1 إلى 0xFFFFFFFF في uint32، سيتحول إلى 0x00000000.
الانخفاض: تكون نتيجة الحساب أقل من الحد الأدنى الذي يمكن لنوع البيانات تمثيله. على سبيل المثال، 0 مطروحًا منها 1 من نوع uint32 ستتحول إلى 0xFFFFFFFF.
!
في أبريل 2018، تم اختراق عقد توكن BeautyChain(BEC) بسبب ثغرة تجاوز السعة العددية، حيث حصل المهاجم على كميات هائلة من التوكنات. ظهرت هذه الثغرة في دالة batchTransfer، حيث لم يتم التحقق من تجاوز سعة الضرب، مما أدى إلى إمكانية تحويل كميات كبيرة من التوكنات باستخدام رصيد توكنات قليل.
!
لتجنب تجاوز السعة الرقمية، يمكن اتخاذ التدابير التالية:
قم بتكوين خيارات تجميع Rust، للتحقق من تجاوزات الأعداد الصحيحة في وضع الإصدار أيضًا وإثارة panic.
استخدم حزمة uint لدعم أنواع الأعداد الصحيحة الأكبر، مثل U256، U512، وما إلى ذلك.
استخدم دالة تحويل من نوع uint لاكتشاف الفائض، مثل as_u128().
استخدم دالة Safe Math مثل checked_add() للتحقق مما إذا كانت الحسابات قد تجاوزت.
من خلال هذه الطرق، يمكن تجنب ثغرات تجاوز السعة بشكل فعال، وزيادة أمان العقود الذكية. عند كتابة العقود التي تتضمن حسابات كبيرة، من الضروري التعامل بحذر مع مشكلة تجاوز السعة.
!