المصدر: Beosin
توقيت بكين في 30 يناير 2024، وفقًا لمراقبة المخاطر الأمنية EagleEye من Beosin والإنذار المبكر وحظر عرض مراقبة المنصة، تعرض بروتوكول التمويل اللامركزي MIM_Spell لهجوم من قبل قراصنة للحصول على قروض سريعة، مما أدى إلى خسارة أكثر من 6 ملايين دولار أمريكي. في الوقت الحالي، قام المهاجم بتحويل الأموال المسروقة إلى ETH ونقلها إلى عنوانين للمهاجمين. وسيستمر Beosin KYT في مراقبة الأموال بينما نقوم بتحليل هذه الثغرة الأمنية.
تحليل الثغرات الأمنية
السبب الرئيسي للحادث هو استغل المهاجم عقد المشروع لاستخدام خوارزمية التقريب، وتحكم في المعلمة إلى 1 لتعظيم خطأ التقريب، مما تسبب في عدم توازن دفتر الأستاذ.
للعقد وظيفتان، هما الاقتراض والسداد، إحداهما اقتراض المال من العقد، والأخرى سداد المال إلى صاحبه. العقد.
ستقوم وظيفة الاقتراض بتحديد مبلغ الاقتراض، وحساب قيمة الدين من خلال التحويل النسبي، وتحديثها إلى إجمالي قيمة دين المتصل. كما هو موضح في الشكل أدناه، تستخدم خوارزمية إضافة العقد هنا التقريب.
ستحدد وظيفة الاقتراض قيمة دين السداد، وحساب مبلغ السداد من خلال التحويل النسبي، وتحويل مبلغ السداد إلى هذا العقد. كما هو موضح في الشكل أدناه، لا تزال الخوارزمية الفرعية للعقد هنا تستخدم التقريب التصاعدي.
فهم عملية الاقتراض والسداد، هيا بنا ألقِ نظرة على كيفية استغلال المتسللين لهذه الثغرة الأمنية.
يتحكم المتسلل أولاً في مبلغ القرض وقيمة دين العقد إلى 0 و97 (سيتم تقديم كيفية التحكم في القسم التالي) .
بعد ذلك، يتم استدعاء وظيفتي الاقتراض والسداد بشكل مستمر، وتكون قيمتي الاقتراض والسداد 1. وأخيرًا، مبلغ الاقتراض وقيمة الدين يتم التحكم فيها إلى 0 و120080183810681886665215049728. مما يؤدي إلى خلل خطير في النسب.
وفقًا لقواعد الكود المذكورة أعلاه (elastic=0, base=97)، عندما يستدعي المهاجم الاقتراض مرة واحدة ويمرر في 1، سيصبح الدفتران مرنين =1، القاعدة = 98 (عندما تكون المرونة 0، ستزداد بشكل متزامن وفقًا للقيمة)، عندما يتم استدعاء الاقتراض مرة أخرى وتمرير 1، ستصبح مرنة = 2، القاعدة = 196 (عندما لا تكون المرونة 0، ستتم مزامنتها بشكل متناسب) زيادة).
بعد ذلك، يستدعي المهاجم دالة السداد ويمرر الرقم 1، الذي سيستدعي الدالة الفرعية. في هذا الوقت، يجب أن تكون المرونة المحسوبة متساوية إلى 1*1/196= >0، لكن الخوارزمية تقرب لأعلى، مما يؤدي إلى حساب المرونة=1، وستصبح النتيجة مرنة=1، الأساس=195. ويمكن ملاحظة أن المرونة تظل دون تغيير في هذا الوقت، لكن القاعدة تضاعفت.
استخدم المهاجم الطريقة المذكورة أعلاه عدة مرات لتعيين Elastic=0 وbase=120080183810681886665215049728. وفي النهاية، تم إقراض أكثر من 5 ملايين MIM في العقد من خلال الاقتراض.
عملية الهجوم
الآن بعد أن فهمنا مشكلة الوظيفة، فلنبدأ ألقِ نظرة على الهجوم كيف نفذ المهاجم الهجوم (أحد المعاملات مثال على ذلك).
1. اقترض المهاجم أولاً 300000 MIM.
2. بعد ذلك، يستعلم المهاجم عن مبلغ القرض وقيمة الدين في رد الاتصال الدالة، يمكنك أن ترى أنها 240,000 و230,000 في هذا الوقت.
3. بعد ذلك، يستدعي المهاجم وظيفة repayForAll، ويعيد 240,000 رمز MIM، ويتحكم في المرونة بحجم صغير جدًا.
4. بعد ذلك، أعاد المهاجم ديون المستخدمين الآخرين من خلال وظيفة السداد، وأخيرًا سيطر على مبلغ القرض وقيمة الدين إلى 0 و97.
5. ينشئ المهاجم عقدًا جديدًا ويتحكم في مبلغ الاقتراض وقيمة الدين إلى 0 ومن خلال الاستئناف للاقتراض والسداد. 120080183810681886665215049728 .
6. أخيرًا، تم إقراض 5 ملايين MIM من خلال الاقتراض وتم إرجاع القرض السريع.
تتبع التمويل
اعتبارًا من وقت كتابة المقالة، تم تحويل الأموال المسروقة البالغة أكثر من 6 ملايين دولار أمريكي إلى ETH من قبل المهاجمين، وتم تفريقها في عنوان المتسلل ولم يتم نقلها.Beosin KYT عكس منصة غسيل الأموال ستقوم بمراقبة الأموال بشكل مستمر.