تحليل هجوم إعادة إدخال القروض السريعة على مشروع Jarvis Network
تشير البيانات إلى أنه في 15 يناير 2023 الساعة 17:43:37 بالتوقيت العالمي المنسق، تعرض مشروع Jarvis_Network لهجوم، مما أسفر عن خسارة 663,101 من MATIC.
تحليل مكدس استدعاء المعاملات يكشف أن هناك منطق إعادة الدخول أثناء عملية إزالة السيولة. الاستدعاءات الوظيفية لنفس العقد قبل وبعد إعادة الدخول تستخدم نفس المعلمات، لكن القيم العائدة تختلف اختلافًا كبيرًا:
قبل إعادة الدخول: 1,002,157,321,772,769,944
إعادة الدخول: 10,091,002,696,492,234,934
تحدث إعادة الإدخال في دالة remove_liquidity. تقوم هذه الدالة بإرجاع الرموز المميزة التي أضافها المستخدم عند إزالة السيولة. نظرًا لأن Polygon و EVM هما سلسلة متجانسة، سيتم تنشيط إعادة الإدخال للعقد عند تحويل MATIC إلى العقد.
أظهر التحليل المتعمق أن المشكلة تكمن في تنفيذ دالة getUnderlyingPrice. تتضمن هذه الدالة سلسلة من الحسابات الداخلية والاستدعاءات الخارجية، حيث أن القيمة المرجعة من دالة get_virtual_price هي المفتاح.
تتأثر قيمة العودة لدالة get_virtual_price بالمتغير self.D. في دالة remove_liquidity، يحدث تحديث self.D بعد تحويل الرموز. يقوم المهاجم بنقل MATIC إلى عقد الهجوم عند إزالة السيولة، وفي وقت استدعاء دالة fallback، يتم استعلام عن سعر الرمز أولاً. نظرًا لأن self.D لم يتم تحديثه بعد، فإن ذلك يؤدي إلى الحصول على سعر خاطئ.
عملية دالة remove_liquidity:
تدمير LP المستخدم
إرسال أموال المستخدم المرهونة
تحديث self.D
استغل المهاجم إعادة الإدخال في الخطوة الثانية، مستخدمًا قيمة self.D غير المحدثة للاقتراض، وحصل على أموال تعادل 10 أضعاف السعر الطبيعي.
على الرغم من أن دالة remove_liquidity تستخدم @nonreentrant('lock') لمنع إعادة الدخول، إلا أن المهاجمين تمكنوا من تجاوز هذه الآلية الواقية من خلال إعادة الدخول عبر العقود.
كشفت هذه الهجمة عن عدة مشاكل رئيسية:
منطق تعديل المتغيرات بعد الاستدعاء الخارجي أدى إلى استثناء في الحصول على السعر
إعادة الدخول عبر العقود تجعل قفل إعادة الدخول غير فعال
عدم اتباع نمط "الفحص - التأثير - التفاعل" (Checks-Effects-Interactions)
لزيادة الأمان، يجب على فريق المشروع:
إجراء تدقيق أمني صارم
ضع تعديل المتغيرات قبل الاستدعاء الخارجي
استخدام مصادر بيانات متعددة للحصول على الأسعار
اتبع "تقييم ثم كتابة إلى المتغير ثم إجراء الاستدعاء الخارجي" معيار البرمجة
من خلال هذه التدابير، يمكن تحسين أمان واستقرار المشروع بشكل كبير، مما يساهم في الوقاية الفعالة من هجمات مماثلة.
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 11
أعجبني
11
5
مشاركة
تعليق
0/400
DisillusiionOracle
· 07-25 05:19
تم تفجير المزيد من الأسماك حتى الموت
شاهد النسخة الأصليةرد0
FlatlineTrader
· 07-23 14:13
لقد حصل حمقى آخر على صندوق الغداء!
شاهد النسخة الأصليةرد0
MidnightGenesis
· 07-23 14:09
درجة تشويش الكود غير كافية، كان يجب أن يحدث هذا منذ زمن.
شاهد النسخة الأصليةرد0
CryptoGoldmine
· 07-23 13:59
دليل بيانات آخر: العقود الذكية تسترجع خسائر بقيمة 65w
تعرضت شبكة جارفيز لهجوم إعادة دخول بواسطة القروض السريعة وخسرت 663,101 MATIC
تحليل هجوم إعادة إدخال القروض السريعة على مشروع Jarvis Network
تشير البيانات إلى أنه في 15 يناير 2023 الساعة 17:43:37 بالتوقيت العالمي المنسق، تعرض مشروع Jarvis_Network لهجوم، مما أسفر عن خسارة 663,101 من MATIC.
تحليل مكدس استدعاء المعاملات يكشف أن هناك منطق إعادة الدخول أثناء عملية إزالة السيولة. الاستدعاءات الوظيفية لنفس العقد قبل وبعد إعادة الدخول تستخدم نفس المعلمات، لكن القيم العائدة تختلف اختلافًا كبيرًا:
تحدث إعادة الإدخال في دالة remove_liquidity. تقوم هذه الدالة بإرجاع الرموز المميزة التي أضافها المستخدم عند إزالة السيولة. نظرًا لأن Polygon و EVM هما سلسلة متجانسة، سيتم تنشيط إعادة الإدخال للعقد عند تحويل MATIC إلى العقد.
أظهر التحليل المتعمق أن المشكلة تكمن في تنفيذ دالة getUnderlyingPrice. تتضمن هذه الدالة سلسلة من الحسابات الداخلية والاستدعاءات الخارجية، حيث أن القيمة المرجعة من دالة get_virtual_price هي المفتاح.
تتأثر قيمة العودة لدالة get_virtual_price بالمتغير self.D. في دالة remove_liquidity، يحدث تحديث self.D بعد تحويل الرموز. يقوم المهاجم بنقل MATIC إلى عقد الهجوم عند إزالة السيولة، وفي وقت استدعاء دالة fallback، يتم استعلام عن سعر الرمز أولاً. نظرًا لأن self.D لم يتم تحديثه بعد، فإن ذلك يؤدي إلى الحصول على سعر خاطئ.
عملية دالة remove_liquidity:
استغل المهاجم إعادة الإدخال في الخطوة الثانية، مستخدمًا قيمة self.D غير المحدثة للاقتراض، وحصل على أموال تعادل 10 أضعاف السعر الطبيعي.
على الرغم من أن دالة remove_liquidity تستخدم @nonreentrant('lock') لمنع إعادة الدخول، إلا أن المهاجمين تمكنوا من تجاوز هذه الآلية الواقية من خلال إعادة الدخول عبر العقود.
كشفت هذه الهجمة عن عدة مشاكل رئيسية:
لزيادة الأمان، يجب على فريق المشروع:
من خلال هذه التدابير، يمكن تحسين أمان واستقرار المشروع بشكل كبير، مما يساهم في الوقاية الفعالة من هجمات مماثلة.