المواضيع الرائجة
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
مرحبا بك مرة أخرى في Sherlock's Vulnerability Spotlight ، حيث نسلط الضوء على ثغرة أمنية مؤثرة تم اكتشافها أثناء تدقيق Sherlock.
هذا الأسبوع ، نفحص حسابا غير صحيح لمستوى الضمانات تم العثور عليه في مسابقة @plaza_finance بواسطة @0xadrii و @KupiaSecurity و @f ،
@farman1094_ ، @0xnovaman33.

ملخص الثغرة الأمنية:
في getRedeemAmount(...)، يحسب العقد مستوى الضمانات لعمليات استرداد BOND باستخدام حالة ما بعد التداول:
الكود الحالي (ضعيف)
مستوى الضمانات =
((tvl - (depositAmount * BOND_TARGET_PRICE)) * PRECISION)
/ ((bondSupply - depositAmount) * BOND_TARGET_PRICE) ؛
نظرا لأن تسعير الاسترداد يستخدم بعد ذلك مستوى الضمانات المقدر هذا لتقرير ما إذا كان سيدفع الحد الأقصى للسعر (100 دولار) ، يمكن للمهاجم شراء BOND بمعدلات إنشاء مختلطة (مخفضة في بعض الأحيان) حتى ينخفض مستوى الضمان (الحالي) ≤ 1.2 ، ثم استرداد كل السندات بحد أقصى 100 دولار - الحساب باستخدام مبلغ إيداع مصنوع يدفع مستوى الضمانات المقدر إلى ما فوق 1.2. يتيح ذلك للمهاجم استخراج ETH (السبريد "الخالي من المخاطر") حتى يصل مستوى الضمانات الحالي للمجمع إلى العتبة.
خطوات الهجوم:
1) مرحلة الإعداد
معلمات مثال على التجمع:
- poolReserve = 120 ETH ، bondSupply = 3000 ، levSupply = 200 ، سعر ETH = 3075 دولارا
قواعد التسعير:
إنشاء (شراء) السندات:
- إذا كان الضمانالمستوى ≤ 1.2: creationRate = tvl * 0.8 / bondSupply
- آخر: creationRate = 100 دولار
استرداد (بيع) السندات:
- إذا كان الضمانالمستوى المقدر ≤ 1.2: معدل الاسترداد = tvl * 0.8 / bondSupply
- آخر: reredeemRate = 100 دولار
2) المرحلة أ - شراء السندات بأسعار مختلطة / مخفضة
- شراء السندات أثناء مراقبة الضمانات (الحالية) المستوى = tvl / (bondSupply * 100).
- يحدث الشراء الأول بينما > مستوى الضمانات 1.2 → النعناع بالقرب من 100 دولار لكل سند.
- تدفع عمليات الشراء اللاحقة مستوى الضمانات الحالي إلى ما دون 1.2 → النعناع بسعر إنشاء مخفض (على سبيل المثال ، ~ 94.07 دولارا أمريكيا) ، مما يؤدي إلى تراكم رصيد كبير من السندات بثمن بخس.
3) المرحلة ب - استرداد كل السندات بأقصى سعر
- استرداد المكالمات (BOND ، depositAmount = attackerBondBalance ، ...)
- يحسب العقد مستوى الضمانات المقدر باستخدام حالة ما بعد الاسترداد (bondSupply - depositAmount) و (tvl - depositAmount * 100) و (في المثال) يحصل على قيمة > 1.2
- نظرا لأن هذه القيمة المقدرة تتجاوز الحد ، يتم تعيين معدل الاسترداد على الحد الأقصى 100 دولار ، مما يسمح للمهاجم بصرف جميع السندات المتراكمة بسعر 100 دولار
4) تحقيق الأرباح
- الفرق بين عمليات الشراء المخفضة وعمليات البيع بقيمة 100 دولار يحقق صافي ربح ETH.
- في أرقام إثبات الارتباط: إنفاق 60 ETH عبر شرائين يعود ~ 61.89 ETH على الاسترداد → ~ 1.89 ربح ETH.
- يمكن للمهاجم التكرار حتى ينخفض مستوى ضمانات المجمع الحالي إلى ~1.2 ، واستخراج تقريبا: USD ≈ ethPrice × poolReserve − 120 × bondSupply
ما هو التأثير؟
استخراج الأموال المباشر / تسرب القيمة: يقوم المهاجم بسك العملات بأسعار مخفضة ويسترد بسعر 100 دولار ، ويستخلص ETH من المجمع.
غير محدود حتى العتبة: يمكن أن يستمر حتى يتقلص مستوى الضمانات الحالي للمجمع إلى ≈ 1.2.
عدم تناسق التسعير النظامي: يخلق مراجحة يدفع المستخدمون الشرفاء ثمنها من خلال احتياطيات / نتائج أسوأ.
السبب الجذري:
استخدام حالة ما بعد التداول لاسترداد الأسعار
تحسب التعليمات البرمجية مستوى الضمانات كما لو أن الاسترداد قد حدث بالفعل:
استخدامات (tvl - depositAmount*100) و (bondSupply - depositAmount)
مستوى الضمانات =
((tvl - (depositAmount * BOND_TARGET_PRICE)) * PRECISION)
/ ((bondSupply - depositAmount) * BOND_TARGET_PRICE) ؛
1. يتيح ذلك للمهاجم اختيار depositAmount بحيث يتجاوز المستوى المقدر الحد (> 1.2) ، مما يؤدي إلى فتح معدل استرداد 100 دولار ، حتى عندما لا تبرر حالة المجمع الحالية ذلك.
2. عتبة بوابة على مقياس تم التلاعب به
يعتمد قرار الحد الأقصى البالغ 100 دولار على مستوى الضمانات المقدر القابل للتلاعب بدلا من المستوى الحالي (ما قبل التداول) ، مما يتيح ألعاب الأسعار.
التخفيف:
حساب أسعار الاسترداد من حالة التجمع الحالية، وليس الأرصدة المقدرة بعد الاسترداد. الإصلاح المقترح للمشروع صحيح:
- مستوى الضمانات = ((tvl - (depositAmount * BOND_TARGET_PRICE)) * الدقة)
- / ((bondSupply - depositAmount) * BOND_TARGET_PRICE) ؛
+ مستوى الضمانات = (tvl * الدقة) / (bondSupply * BOND_TARGET_PRICE) ؛
تصلب إضافي (موصى به):
1. رتابة السعر: تأكد من عدم زيادة سعر الاسترداد مع زيادة مبلغ الإيداع (لا يوجد "بيع أكثر ، احصل على سعر وحدة أفضل").
2. التسعير الثابت الثابت: اشتقاق / استرداد من ثابت واحد بحيث يمنع تناسق الشراء / البيع المراجحة من جانب واحد.
3. فحوصات الانزلاق السعري: اطلب الحد الأدنى / الحد الأقصى للأسعار التي يوفرها المستخدم لكل من الإنشاء والاسترداد.
4. الحد الأقصى والخانق: الحد الأقصى للاسترداد لكل تكس ولكل كتلة للحد من الضرر إذا تم الاقتراب من العتبات.
5. الاتساق عبر المسارات: قم بمحاذاة إنشاء المسارات واستردادها لاستخدام نفس تعريف مستوى الضمان (الحالة الحالية فقط).
نحن فخورون بأننا ساعدنا في تأمين @plaza_finance من خلال هذا الاكتشاف.
عندما يحتاج الأمر إلى أن يكون آمنا ، فإن شيرلوك هو الخيار الصحيح.
3.4K
الأفضل
المُتصدِّرة
التطبيقات المفضلة

