عقد هجوم الهاكر 2: strong> p>0x617432Fc98c1fFaAB62B8cB94Cef6D75ABD95598
عقد هجوم القراصنة 3:
0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974
عنوان المهاجم:
0xbbcc139933D1580e7c40442E09263e90E6F1D66D p>
العقد الضعيف:
0x36016C4F0E0177861E6377f73C380c70138E13EE (تجمع التعدين)
تحليل الهجوم
من خلال تحليل بيانات المعاملة في السلسلة، نقوم بالتنظيم والتلخيص.
قام المتسلل أولاً بجمع الأموال للهجوم من خلال قروض سريعة متعددة، حيث اقترض إجمالي 2,753,399 رمز USDT.
تم تحويل 130,000 USDT Token على الفور إلى الحد الأدنى من وحدة USDT Token و27,264 OKC Token.
نظرًا لأن PancakeSwapv2 يستخدم AMM (صانع سوق الوظائف الثابتة)، في هذا النموذج، يكون حاصل ضرب كميات الرمزين المميزين في مجمع التداول ثابتًا. ويمكن تمثيلها بالصيغة التالية:
حيث:
• x هو رقم الرمز المميز الأول في مجمع التداول.
• y هو رقم الرمز المميز الثاني في مجمع التداول.
• k هو ثابت يمثل حاصل ضرب كميات الرمزين في المجموعة.
عندما يرغب المتداول في استبدال رمز مميز بآخر، فإنه يزيد كمية (dx) لأحد الرموز المميزة في مجمع التداول مع تقليل كمية الرمز المميز الآخر (dy) للحفاظ على الثبات. تعمل هذه العملية على تغيير الأسعار النسبية للرموز المميزة.
لنفترض أن المتداول يريد استبدال الرمز المميز A بالرمز المميز B، فيجب أن تظل صيغة المنتج الثابتة صحيحة قبل المعاملة وبعدها:
بما أن k ثابت، فهذا يعني أن x·y قبل المعاملة وبعدها هي نفسها. ومع ذلك، نظرًا لأن المتداول يزيد من كمية الرمز المميز A (dx) ويقلل كمية الرمز المميز B (dy)، فسيؤدي ذلك إلى زيادة سعر الرمز المميز B.
يمكن حساب السعر الفوري للرمز المميز عن طريق حساب نسبة عدد الرمزين المميزين في المجموعة. إذا كان الرمز A هو x والرمز B هو y، فإن سعر الرمز المميز B بالنسبة إلى الرمز المميز A هو y/x. بعد المعاملة، تنخفض كمية الرمز المميز B وتزداد كمية الرمز المميز A، وبالتالي يصبح السعر الجديد (y-dy)/(x+dy). نظرًا لانخفاض البسط وزيادة المقام، تصبح النسبة أصغر، مما يعني زيادة سعر الرمز B.
في حالة المعاملات الكبيرة، يمكن أن يكون dx وdy كبيرًا جدًا، مما قد يؤدي إلى تغيرات كبيرة في الأسعار. وذلك لأنه من أجل الحفاظ على ثبات k، يجب إزالة كمية كبيرة من dy من التجمع للتعويض عن الزيادة في dx. أدى التأثير الكبير لهذه الصفقة الكبيرة على عدد الرموز المميزة في المجمع إلى تغيرات كبيرة في الأسعار.
لذلك استخدم المهاجم مبلغًا كبيرًا من أموال القروض السريعة لشراء OKC، مما أدى إلى انخفاض عدد OKC، وبالتالي رفع سعر OKC Token، مما رفع سعر 1 OKC = 0.3 USDT إلى 1 OKC = 68.9 دولارًا أمريكيًا.
في وقت لاحق، أنشأ المهاجم عنواني عقد وأرسل 0.01 OKC و0.0001 USDT وحد أدنى من OKC إلى العنوانين على التوالي.
ثم يستخدم المتسلل رئيسي أضاف عقد الهجوم عمليات السيولة إلى مجمع PancakePair_USDT_OKC وحصل على ما يقرب من 225,705 LP Tokens.
يتم بعد ذلك نقل جميع رموز LP إلى 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 الذي أنشأه المهاجم. ثم يستدعي عقد الهجوم على الفور وظيفةprocessLPReward في العقد الضعيف لتخصيص المكافآت لعنوان lpHolder المخزن في العقد. على الرغم من أن عملية المهاجم هنا هي فقط لتحويل الأموال إلى عقد MinerPool، إلا أن العقد يستدعي وظيفة ProcessLPReward في وظيفة رد الاتصال التي تقبل التحويل.
وفقًا للصورة أدناه، نعلم أن عقد الهجوم 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 حصل على 77,890 رمز OKC في مجموعة المكافآت.
قام المهاجم بعد ذلك بنقل رمز LP الخاص بعقد الهجوم 0x28e7..E974 وتدميره لإزالة السيولة، وحصل على 1,884,223 رمز USDT و27,264 رمز OKC.
ونقل جميع الرموز المميزة في عقدي الهجوم الآخرين إلى عقد الهجوم الرئيسي
0xD5d8c2fd8A743A89BC497B2F180C52d719a007B9، على التوالي: 272 و77890 رمز OKC.
قام المتسلل بتبادل كل OKC، حوالي 104,610 رمز OKC، مقابل حوالي 136,518 رمز USDT. في هذا الوقت، كان المتسلل يمتلك إجمالي حوالي 2,759,918 رمز USDT.
أخيرًا، أعاد المتسلل جميع أصل القرض السريع وفوائده، تاركًا ما يقرب من 6,268 من رموز USDT، والتي تم نقلها جميعًا إلى عنوان المهاجم
0xbbcc139933D1580e7c40442E09263e90E6F1D66D.
تحليل الثغرات الأمنية
من خلال تحليل الهجوم، من المعروف أن أموال الربح الرئيسية للمتسللين هي من وظيفةprocessLPReward في عقد MinerPool. منطق هذه الوظيفة هو بشكل أساسي للحصول على lpHolder وحساب قيمة LP بناءً على LP الخاص به. سيتم مكافأة المبلغ بشكل مباشر بالتناسب.
يمكننا إلقاء نظرة على منطق التنفيذ في عقد الهجوم الثالث الذي أنشأه المهاجم:
من المنطق هنا، يمكننا أن نرى أنه يتم استخدام extcodesize( في وظيفة addHolder ) لحساب الحجم الحالي للعنوان وتحديد ما إذا كان العنوان هو عنوان عقد أم لا. ومع ذلك، عندما يقوم المهاجم بإنشاء العقد من خلال CREATE2، منذ تهيئة العقد، يظل حجم العنوان 0، وبالتالي فإن المهاجم تستدعي العنوان في مُنشئها. وتتجاوز الوظيفة قيود استدعاء العقد.
يستدعي وظيفة addHolder أثناء النقل لإضافة عنوان العقد إلى قائمة lpHolder، بحيث يمكن للعقد الحصول على مكافآت OKC في الوقت المناسب من خلال تلقي المكافآت.
وفقًا لتحليل منطق كود وظيفة ProcessLPReward، يمكن أن نرى من الشكل أدناه أنه على الرغم من تعيين وقت القفل لتلقي المكافآت، فإن عقد LP لم يتم تحديد الوقت للتحقق أو تنفيذ القيود، مما يتسبب في حصول المتسللين على مبلغ كبير من الأموال المؤقتة من خلال القروض السريعة، وتحويلها إلى LP، وتدميرها فورًا بعد استلام المكافآت.
الملخص
بكل بساطة، اقترض المتسلل مبلغًا كبيرًا من USDT من خلال القروض السريعة وقام بتبادل كمية كبيرة من OKC، وبالتالي رفع سعر OKC. ولأن مشروع OKC لا يضع متطلبات قفل لإصدار مكافأة LP، قام المتسلل بسحب السيولة فورًا بعد الحصول على المكافأة، وبالتالي الحصول على مكافأة مزود السيولة الصادرة عن طرف المشروع. وقم ببيع رمز OKC الذي تمت مكافأته من قبل طرف مشروع OKC. وكان الربح النهائي 6,268 دولارًا أمريكيًا. ص>