في 3 يناير 2024، وفقًا لـ Beosin EagleEye، وقع مشروع Radiant Capital ضحية لهجوم قرض فوري من قبل مهاجم. من خلال ثلاث معاملات، سرق المهاجم أكثر من 1900 ETH، تقدر قيمتها بأكثر من 4.5 مليون دولار. تم الاحتفاظ بالأموال المسروقة حاليًا في عنوان المهاجم، وقام فريق أمان Beosin بتحليل الحادث على الفور.
تحليل الثغرات
السبب الجذري لهذا الحادث يكمن في حساب كمية الرمز المميز لمشروع Radiant Capital، والذي يتضمن توسيع الدقة والتقريب. استغل المهاجم القدرة على التحكم في الدقة، وبالاقتران مع التقريب، وسع هوامش الربح للهجوم.

في الكود المُلاحظ، تأخذ دالة rayDiv بيانات uint256 اثنتين، a و b. يمكن تبسيط العملية بالكامل على النحو التالي: (a * RAY + b/2) / b، حيث إن RAY هو بيانات التوسع لزيادة الدقة، ويساوي 10²⁷. يؤدي ذلك إلى الحصول على RAY / b + 0.5، وبالتالي تحقيق وظيفة التقريب. المصدر الرئيسي للخطأ في هذا الحساب يأتي من b. إذا كانت b أصغر بكثير من a، يصبح الخطأ مهملًا. ومع ذلك، إذا كانت b بحجم مماثل لحجم a، فقد يكون الخطأ كبيرًا.
على سبيل المثال، إذا كان RAY = 10000 و b = 3، فإن النتيجة المحسوبة هي 3333، وهي أقل بمقدار 1/10000 من القيمة الفعلية. إذا كان RAY = 10000 و b = 3000، فإن النتيجة المحسوبة هي 3، وهي أقل بمقدار 1/10 من القيمة الفعلية.
في هذا الحادث، قام المهاجم بتلاعب قيمة b بحيث تصبح بحجم مماثل لـ a، مما جعل الحساب مكافئًا لـ 3/2.0001 = 1. القيمة المحسوبة هي أقل بمقدار 1/3 من القيمة الفعلية.
عملية الهجوم
قام المهاجم في البداية باقتراض 3 ملايين USDC عبر قرض فلاش من AAVE كـ رأس مال تمهيدي للهجوم.

2. تم رهن 2 مليون USDC في عقد Radiant، وقد حصل المهاجم على شهادات رموز 2 مليون rUSDCn.

3. استخدم المهاجم قرضًا فلاشًا عبر عقد Radiant لاقتراض 2 مليون USDC. في دالة الاستدعاء (callback)، تم سداد 2 مليون USDC، مع استخراج USDC المُرهَن من الخطوة الثانية في الوقت نفسه. استدعت دالة قرض الفلاش وظيفة transferfrom، حيث تم نقل USDC الخاص بالمهاجم إلى العقد، مع تحصيل رسوم قدرها 9/10000 كسيولة لبركة (pool).

4. من خلال تكرار الخطوة 3، تمكن المهاجم من التحكم في liquidityIndex إلى حد كبير، وصولًا إلى liquidityIndex=271800000000999999999999998631966035920.

5. بعد ذلك، أنشأ المهاجم عقدًا جديدًا وأودع 543,600 USDC داخله. يتوافق هذا المبلغ مع ضعف قيمة liquidityIndex من الخطوة 4، مما يسهّل التحكم عبر التقريب.

6. قام المهاجم برهن كامل 543,600 USDC في عقد Radiant، وحصل على مقدار مكافئ من rUSDCn.

7. قام المهاجم بسحب 407,700 USDC. وعلى الرغم من أنه كان من المفترض حرق 407,700 rUSDCn، كما ورد أعلاه، فإن دالة الحرق تضمنت حسابات توسع الدقة والتقريب. 407700000000000000000000000000000000000/271800000000999999999999998631966035920 = 1.49999999، لكن التقريب أدى إلى 1، مما جعل النتيجة أقل بمقدار 1/3 من القيمة الفعلية. كما هو موضح أدناه، بدلًا من حرق 407,700، تم حرق 271,800 فقط، مما أتاح للمهاجم سحب 407,700 USDC.

8. بالاستفادة من الثغرة المذكورة في الخطوة 7، كرر المهاجم عمليات الرهن والسحب، مع انسحاب مستمر يزيد بمقدار 1/3 عن المبلغ المُرهَن، وفي النهاية قام بتبادل جميع USDC من البركة.

تتبع الأموال
اعتبارًا من وقت كتابة هذا التقرير، لا تزال قيمة 1902 ETH المسروقة موجودة في عنوان المهاجم بدون أي حركة. ستستمر Beosin Trace في مراقبة الأموال.

مع بداية عام 2024، شهدنا حالتين كبيرتي القيمة من حالات السرقة. (راجع حادث الأمس الأمني: ماذا حدث في الحالة الأولى من العام، سرقة Orbit Chain بقيمة 80 مليون دولار؟) تسلط هذه السلسلة من الأحداث الضوء على أن الاحتياطات الأمنية تظل ضرورية في نظام Web3 البيئي!
تواصل
إذا كنت بحاجة إلى أي خدمات أمنية خاصة بسلسلة الكتل (blockchain)، فنرحب بك للتواصل معنا:
الموقع الرسمي Beosin EagleEye Twitter Telegram Linkedin