تحليل هجوم إعادة الإدخال للقروض السريعة على مشروع Jarvis Network
في 15 يناير 2023، تعرض مشروع Jarvis_Network لهجوم على شبكة Polygon، مما أدى إلى خسارة حوالي 663,000 MATIC. أظهرت التحليلات أن المهاجمين استغلوا القروض السريعة وثغرات إعادة الدخول لتنفيذ الهجوم.
يظهر تحليل مكدس استدعاء المعاملات للهجمات أنه أثناء إعادة الإدخال، عند استدعاء نفس الوظيفة لنفس العقد، تكون المعلمات المدخلة متشابهة ولكن القيم العائدة تختلف بشكل ملحوظ. تكون القيم العائدة قبل وبعد إعادة الإدخال على النحو التالي:
إعادة الدخول قبل: 1002157321772769944
إعادة الدخول بعد: 10091002696492234934
تحدث إعادة الدخول في دالة remove_liquidity. تقوم هذه الدالة بإرجاع الرموز المميزة التي أضافها المستخدم عند إزالة السيولة. نظرًا لأن Polygon متوافق مع EVM، تم تنشيط إعادة الدخول عند نقل MATIC إلى العقد.
أظهرت التحليلات المتعمقة أن المشكلة تكمن في تنفيذ دالة getUnderlyingPrice. تتضمن هذه الدالة سلسلة من الحسابات الداخلية والاستدعاءات الخارجية، حيث أن القيمة المرجعة من دالة get_virtual_price هي المفتاح. تتأثر القيمة المرجعة لهذه الدالة بالمتغير self.D، في حين أن تحديث self.D يحدث بعد تحويل الرمز.
عند إزالة السيولة، قام المهاجم بنقل MATIC إلى عقد الهجوم، ثم استعلم من خلال الاستدعاء عن سعر الرمز. نظرًا لأن self.D لم يتم تحديثه بعد، أدى ذلك إلى الحصول على سعر خاطئ. استغل المهاجم هذا الفارق الزمني، وعند إعادة الدخول، رفع سعر الاقتراض بنحو 10 أضعاف.
على الرغم من أن دالة remove_liquidity تستخدم الزخرفة @nonreentrant('lock') لمنع إعادة الدخول، إلا أن المهاجمين تجاوزوا هذه الآلية للحماية من خلال إعادة الدخول عبر العقود.
كشفت هذه الهجمة عن عدد من القضايا الرئيسية:
منطق تعديل المتغيرات يقع بعد الاستدعاء الخارجي، مما يؤدي إلى استرجاع الأسعار بشكل غير طبيعي.
إعادة الدخول عبر العقود تجعل قفل إعادة الدخول غير فعال.
لم يتم اتباع نمط "التحقق - التأثير - التفاعل" (Checks-Effects-Interactions).
من خلال هذه التدابير، يمكن تعزيز أمان المشروع واستقراره بشكل كبير.
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تعرض Jarvis Network لهجوم إعادة الدخول للقروض السريعة وخسارة 66.3 ألف MATIC
تحليل هجوم إعادة الإدخال للقروض السريعة على مشروع Jarvis Network
في 15 يناير 2023، تعرض مشروع Jarvis_Network لهجوم على شبكة Polygon، مما أدى إلى خسارة حوالي 663,000 MATIC. أظهرت التحليلات أن المهاجمين استغلوا القروض السريعة وثغرات إعادة الدخول لتنفيذ الهجوم.
يظهر تحليل مكدس استدعاء المعاملات للهجمات أنه أثناء إعادة الإدخال، عند استدعاء نفس الوظيفة لنفس العقد، تكون المعلمات المدخلة متشابهة ولكن القيم العائدة تختلف بشكل ملحوظ. تكون القيم العائدة قبل وبعد إعادة الإدخال على النحو التالي:
تحدث إعادة الدخول في دالة remove_liquidity. تقوم هذه الدالة بإرجاع الرموز المميزة التي أضافها المستخدم عند إزالة السيولة. نظرًا لأن Polygon متوافق مع EVM، تم تنشيط إعادة الدخول عند نقل MATIC إلى العقد.
أظهرت التحليلات المتعمقة أن المشكلة تكمن في تنفيذ دالة getUnderlyingPrice. تتضمن هذه الدالة سلسلة من الحسابات الداخلية والاستدعاءات الخارجية، حيث أن القيمة المرجعة من دالة get_virtual_price هي المفتاح. تتأثر القيمة المرجعة لهذه الدالة بالمتغير self.D، في حين أن تحديث self.D يحدث بعد تحويل الرمز.
عند إزالة السيولة، قام المهاجم بنقل MATIC إلى عقد الهجوم، ثم استعلم من خلال الاستدعاء عن سعر الرمز. نظرًا لأن self.D لم يتم تحديثه بعد، أدى ذلك إلى الحصول على سعر خاطئ. استغل المهاجم هذا الفارق الزمني، وعند إعادة الدخول، رفع سعر الاقتراض بنحو 10 أضعاف.
على الرغم من أن دالة remove_liquidity تستخدم الزخرفة @nonreentrant('lock') لمنع إعادة الدخول، إلا أن المهاجمين تجاوزوا هذه الآلية للحماية من خلال إعادة الدخول عبر العقود.
كشفت هذه الهجمة عن عدد من القضايا الرئيسية:
لمنع هجمات مماثلة، يُنصح الأطراف المعنية بالمشروع بـ:
من خلال هذه التدابير، يمكن تعزيز أمان المشروع واستقراره بشكل كبير.