في 22 أغسطس، أعلنت شركة Balancer رسميًا أنها تلقت تقارير ثغرات خطيرة تؤثر على العديد من مجموعات V2 Boost. وقد تأثر 1.4% فقط من TVL. وتم تعليق العديد من المجموعات، وتم إخطار المستخدمين بسحب السيولة LP في أقرب وقت ممكن. [1] [2]
في 27 أغسطس، اكتشف نظام SlowMist MistEye معاملة هجومية يشتبه في أنها تستغل ثغرة Balancer. [3]
نظرًا لأنه لا يمكن تعليق المجمع ولا تزال بعض الأموال متأثرة بالهجوم، يقوم مسؤولو Balancer مرة أخرى بتذكير المستخدمين باسترداد LP في المجمع المتأثر. [4] وفي وقت لاحق، أصدرت شركة Balancer رسميًا تفاصيل الثغرة الأمنية التي تم الكشف عنها في أغسطس على موقع Medium. [5] وراجعها فريق SlowMist الأمني، وكانت التفاصيل كما يلي:
مقدمة
أشار مسؤولو الموازن ببساطة في إفصاحهم إلى أن المشكلة هذه المرة هي أن التقريب الهبوطي للمجمع الخطي والإمداد الافتراضي للمجمع القابل للدمج تسبب في أن تكون قيمة bptSupply 0. أولاً، دعونا نفهم بإيجاز محتويات بروتوكول Balancer المتعلق بهذه الثغرة الأمنية.
Balancer V2 Vault
Balancer V2 [6] البروتوكول عبارة عن بروتوكول صانع سوق آلي لامركزي (AMM) يعتمد على Ethereum ويمثل لبنة بناء مرنة للسيولة القابلة للبرمجة. المكون الأساسي لها هو عقد Vault، الذي يحتفظ بسجلات لجميع المجموعات ويدير المحاسبة ونقل الرموز، بما في ذلك تعبئة وتفريغ ETH الأصلي. بمعنى آخر، يتم تطبيق Vault لفصل محاسبة الرمز المميز وإدارته عن منطق المجمع.
هناك أربع واجهات في Vault، وهي joinPool وexitPool وSwap وBatchSwap (الانضمام والخروج والتبديل عبارة عن مكالمات منفصلة، ولا توجد مجموعة في مكالمة واحدة). إحدى الميزات البارزة هي BatchSwap، والتي يمكنها تحقيق عمليات تبادل ذرية متعددة بين تجمعات متعددة وتوصيل مخرجات تبادل تجمع واحد بمدخلات تجمع آخر (GiveIn وGiveOut). يقدم النظام أيضًا مقايضات البرق [7] ، على غرار قرض فلاش داخلي.
حمامات السباحة الخطية حمامات السباحة الخطية
من أجل تحسين كفاءة رأس المال لـ LP ومشكلة الالتواء العالي والحمل الزائد، أطلق Balancer التجميع الخطي كحل في V2، وبالتالي تقديم رمز BPT (ERC20 Balancer Pool Token).
تجمع خطي [8] بما في ذلك الرمز الرئيسي (الأصل الأساسي)، والرمز المميز المغلف (الرمز المغلف) ورمز BPT، يتم تبادل الأصول ونظيراتها المغلفة مع العوائد من خلال أسعار الصرف المعروفة. كلما ارتفعت نسبة الرموز المغلفة، زاد العائد وكفاءة رأس المال للمجمع. أثناء عملية الالتواء، تُستخدم عادةً عوامل القياس لضمان حساب الرموز المميزة المختلفة بنفس الدقة.
تجمعات قابلة للتركيب تجمعات قابلة للتركيب
جميع مجموعات Balancer عبارة عن مجموعات قابلة للتركيب وتحتوي على رموز مميزة أخرى، كما أن المجموعة نفسها لها أيضًا رموز مميزة خاصة بها. من بينها، تشير عملة BPT إلى رمز التجمع المتوازن ERC20، والذي يعد أساس جميع المجمعات. يمكن للمستخدمين دمج رموز BPT بحرية في مجموعات أخرى لاستردادها. يتضمن الاسترداد دائمًا مجموعة ورمزين: GiveIn وGiveOut. يعني In إرسال الرموز المميزة للمكونات واستقبال BPT، بينما يعني Out إرسال BPT واستقبال الرموز المميزة للمكونات. إذا كانت BPT نفسها عبارة عن رمز مكون، فيمكن تبادلها مثل الرموز المميزة الأخرى. يشكل هذا التنفيذ مسارًا بسيطًا للتبديل بين الأصول الأساسية والرموز المميزة في المجمع الخارجي. يمكن للمستخدمين استخدام BPT لتبادل الأصول الأساسية للتجميع الخطي. وهذا أيضًا هو تجمع Balancer Boosted. [9] مؤسسة.
من خلال المجموعة المذكورة أعلاه، يتم تشكيل تجمع Balancer القابل للدمج. يتكون المجمع المستقر القابل للتركيب bb-a-USD من ثلاث مجموعات خطية، مع إرسال سيولة خاملة إلى البروتوكول الخارجي (Aave). على سبيل المثال، bb-a-DAI هو تجمع خطي يحتوي على DAI وwaDAI (aDAI ملفوف). عندما يحتاج المستخدم إلى BatchSwap (مثل تغيير USDT إلى DAI)، يكون مثال مسار التبادل كما يلي:
في تجمع USDT الخطي، استبدل USDT بـ bb-a-USDT (أدخل إلى تجمع USDT الخطي)؛
في bb-a-USD، يتم تبادل bb-a-USDT بـ bb-a-DAI (التبادل بين BPT الخطي)؛
في تجمع DAI الخطي، يتم استبدال bb-a-DAI بـ DAI (الخروج من تجمع DAI الخطي).
بعد فهم المعرفة المطلوبة أعلاه لفترة وجيزة، ندخل إلى رابط تحليل الثغرات الأمنية.
تحليل
في 27 أغسطس، تلقى فريق أمان SlowMist تعريفًا من نظام MistEye يفيد بأنه تم استغلال ثغرة أمنية مشتبه بها في Balancer في البرية. تجارة [3] على النحو التالي:
اقترض المهاجم أولاً مبلغ 300000 دولار أمريكي من AAVE من خلال قرض سريع. ثم يتم استدعاء عملية BatchSwap الخاصة بـ Vault لإجراء حساب تبادل رموز BPT من خلال مجموعة مستقرة قابلة للدمج bb-a-USD، وأخيرًا، يتم تبادل 94,508 USDC مقابل 59,964 bb-a-USDC و68,201 bb-a-DAI و74,280 ب-أ-USDT. أخيرًا، ستخرج رموز BPT التي تم الحصول عليها من المجمع من خلال مجموعة الخروج لعقد Vault مقابل الأصول الأساسية، وسداد القرض السريع، وترك السوق بربح يبلغ حوالي 108,843.7 دولارًا أمريكيًا.
يمكن ملاحظة أن مفتاح هذا الهجوم يكمن في BatchSwap، وما الذي حدث بالضبط في BatchSwap؟ دعونا نلقي نظرة فاحصة.
خلال عملية BatchSwap بأكملها، قام المهاجم أولاً باسترداد USDC في مجموعة bb-a-USDC، ثم قام بتبادل رموز BPT، واستبدال bb-a-USDC بـ bb-a-DAI وbb-a-USDT وUSDC. أخيرًا، يتم استبدال الرمز الرئيسي الأساسي USDC بـ bb-a-USDT. بمعنى آخر، يعمل bb-a-USDC، باعتباره رمز BPT الرئيسي، بمثابة الرمز المميز لـ GiveOut و GiveIn.
في الخطوة الأولى، يقوم المهاجم بتبادل رموز BPT المميزة لرموز USDC الرئيسية في المجمع الخطي bb-a-USDC مع عامل تحجيم ثابت، ويتم تسجيل المبلغ المتزايد في bptBalance في المجمع. ولكن بعد تبادل onSwap الثاني، وجدنا أن قيمة المبلغ الذي تم تبادله لـ USDC خلال نفس عملية التبادل كانت 0. لماذا هذا؟
بالتعمق في وظيفة onSwap، نجد أنه في هذه العملية، ستتم معالجة الدقة إلى القيمة الاسمية وسيتم حساب عامل القياس للرمز المميز المقابل. عند استدعاء الدالة _downscaleDown بعد ذلك، يتم تقريب المبلغ إلى الأسفل. إذا كان المبلغ وعوامل التحجيم [indexOut] الفرق بين القيمتين كبير، والقيمة المحسوبة لـ _downscaleDown هي صفر.
وهذا يعني أنه عندما نستخدم رموز BPT لاسترداد الرموز المميزة الرئيسية، إذا كان المبلغ صغيرًا جدًا، فسيتم تقريب قيمة الإرجاع إلى الصفر، وتكون هذه القيمة أقل من 1e12 محسوبة بواسطة عوامل القياس. ومع ذلك، ستتم إضافة مبلغ bb-a-USDC القادم من المبلغ In إلى المبلغ الافتراضي bptBalance، وستعمل هذه العملية على زيادة الرصيد في مجمع bb-a-USDC، والذي يمكن اعتباره إضافة أحادية الجانب لـ bb -a-USDC السيولة.
بعد ذلك، باستخدام خصائص المجموعة المستقرة القابلة للدمج، من خلال التحويل المتبادل بين رموز BPT، قم أولاً بتبادل bb-a-USDC لرموز BPT الأخرى. لمتابعة عملية التبادل هذه، يمكنك دمج مسار الاستدعاء التالي للتجميع المستقر: bb-a-DAI onSwap -> _swapGivenIn -> _onSwapGivenIn. أولاً، استبدل bb-a-USDC بـ bb-a-DAI وbb- أ-USDT بالتسلسل. على عكس المجمعات الخطية عبر الإنترنت، تتطلب المجمعات الثابتة القابلة للتركيب تحديثات ذاكرة التخزين المؤقت لسعر الصرف قبل عمليات onSwap. من الكود، يمكننا أن نرى أنه في المجموعة المجمعة، سيحدد onSwap أولاً ما إذا كان سعر صرف الرمز المميز المخزن مؤقتًا يحتاج إلى التحديث.
بعد التبادل السابق، تغير مبلغ bb-a-USDC، والمبلغ الإجمالي الحقيقي بعد التسمية من خلال _toNominal هو إجمالي الرصيد 994,010,000,000، والعرض الافتراضي لرموز BPT هو 20,000,000,000. يمكن حساب أن سعر الصرف المحدث هو ما يقرب من 45 ضعف سعر صرف ذاكرة التخزين المؤقت الأصلي للمجموعة الخطية السابقة وهو 1,100,443,876,587,504,549، وهو 49,700,500,000,000,000,000.
بعد ذلك، يتم تبادل bb-a-USDC مقابل USDC في المجمع الخطي. ومع ذلك، فإن هذا التبادل هو نفس التبادل الثاني، مما يؤدي مرة أخرى إلى تقريب المبلغ إلى 0، ويكون مسار التبادل هو نفسه كما كان من قبل.
التبادل التالي هو عكس USDC إلى bb-a-USDC، ومسار التبادل هو onSwap -> onSwapGivenIn -> _swapGivenMainIn. خلال هذه العملية، وجدنا أنه عند حساب المبلغ المطلوب استرداده، يعتمد حساب العرض الافتراضي على الفرق بين إجمالي المعروض من رمز BPT المسترد والمبلغ المتبقي في المجموعة، وهو 0 .
وذلك لأن bptSupply يساوي 0، ويتم استدعاء الدالة _toNominal مباشرة عند حساب BPT Out، واستدعاء هذا المسار يجعل نسبة التبادل بين USDC وbb-a-USDC قريبة من 1:1.
لخص
يربط BatchSwap مخرجات تبادل أحد المجمعات بمدخلات تجمع آخر (tokenIn وtokenOut) من خلال مقايضات ذرية متعددة بين مجموعات متعددة، ويحول USDC إلى رموز BPT المميزة. في عملية تبديل الدفعة هذه، لا يحدث أي تحويل رمزي فعلي، ولكن يتم تأكيد مبلغ التبادل النهائي عن طريق تسجيل المبلغ المحول إلى الداخل والخارج. ولأن المجمع الخطي يتم تبادله من خلال رمز الأصل الأساسي، فإن طريقة التبادل هي حساب السعر من خلال عرض افتراضي وخوارزمية ثابتة. ولذلك، هناك نوعان من الثغرات الأمنية في BatchSwap:
الأول هو مشكلة التقريب التنازلي للتجميع الخطي، إذ يضيف المهاجم من جانب واحد الرموز الرئيسية إلى المجمع من خلال التقريب لزيادة نسبة الرموز المميزة المخزنة مؤقتًا، وبالتالي التلاعب بسعر صرف الرمز المميز في المجمع القابل للتركيب المقابل؛
ثانيًا، نظرًا لخصائص العرض الافتراضية للمجمع القابل للدمج، يتم حساب العرض الافتراضي عن طريق طرح الرصيد الموجود في المجمع من رمز BPT. إذا كان GiveIn رمز BPT في وقت الاسترداد، فسيتم خصم هذا الجزء من الجزء اللاحق العرض. ، يحتاج المهاجم فقط إلى تبادل BPT كـ GiveIn، ومعالجة العرض الخاص به إلى 0 أولاً، ثم إجراء مبادلة عكسية، أي أنه يتم استخدام BPT بعد ذلك كـ GiveOut. في هذا الوقت، نظرًا لأن العرض هو 0، فإن الخوارزمية سوف كن قريبًا من 1: نسبة 1 أقل من نسبة الاسترداد للتجميع الخطي للاسترداد الفعلي، مما يجعل عدد رموز BPT الخاصة بـ GiveOut يتم التلاعب بها بشكل غير مباشر.
يمكننا أن نجد أن الثغرة الأولى تزيد من سعر الصرف، في حين أن الثغرة الثانية تقلل من سعر الصرف في الاتجاه المعاكس، وقد استغل المهاجم التعزيز المزدوج لتحقيق الربح والمغادرة.
الرابط المرجعي:
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تحليل الضعف الموازن
خلفية
في 22 أغسطس، أعلنت شركة Balancer رسميًا أنها تلقت تقارير ثغرات خطيرة تؤثر على العديد من مجموعات V2 Boost. وقد تأثر 1.4% فقط من TVL. وتم تعليق العديد من المجموعات، وتم إخطار المستخدمين بسحب السيولة LP في أقرب وقت ممكن. [1] [2]
في 27 أغسطس، اكتشف نظام SlowMist MistEye معاملة هجومية يشتبه في أنها تستغل ثغرة Balancer. [3]
نظرًا لأنه لا يمكن تعليق المجمع ولا تزال بعض الأموال متأثرة بالهجوم، يقوم مسؤولو Balancer مرة أخرى بتذكير المستخدمين باسترداد LP في المجمع المتأثر. [4] وفي وقت لاحق، أصدرت شركة Balancer رسميًا تفاصيل الثغرة الأمنية التي تم الكشف عنها في أغسطس على موقع Medium. [5] وراجعها فريق SlowMist الأمني، وكانت التفاصيل كما يلي:
مقدمة
أشار مسؤولو الموازن ببساطة في إفصاحهم إلى أن المشكلة هذه المرة هي أن التقريب الهبوطي للمجمع الخطي والإمداد الافتراضي للمجمع القابل للدمج تسبب في أن تكون قيمة bptSupply 0. أولاً، دعونا نفهم بإيجاز محتويات بروتوكول Balancer المتعلق بهذه الثغرة الأمنية.
Balancer V2 Vault
Balancer V2 [6] البروتوكول عبارة عن بروتوكول صانع سوق آلي لامركزي (AMM) يعتمد على Ethereum ويمثل لبنة بناء مرنة للسيولة القابلة للبرمجة. المكون الأساسي لها هو عقد Vault، الذي يحتفظ بسجلات لجميع المجموعات ويدير المحاسبة ونقل الرموز، بما في ذلك تعبئة وتفريغ ETH الأصلي. بمعنى آخر، يتم تطبيق Vault لفصل محاسبة الرمز المميز وإدارته عن منطق المجمع.
هناك أربع واجهات في Vault، وهي joinPool وexitPool وSwap وBatchSwap (الانضمام والخروج والتبديل عبارة عن مكالمات منفصلة، ولا توجد مجموعة في مكالمة واحدة). إحدى الميزات البارزة هي BatchSwap، والتي يمكنها تحقيق عمليات تبادل ذرية متعددة بين تجمعات متعددة وتوصيل مخرجات تبادل تجمع واحد بمدخلات تجمع آخر (GiveIn وGiveOut). يقدم النظام أيضًا مقايضات البرق [7] ، على غرار قرض فلاش داخلي.
حمامات السباحة الخطية حمامات السباحة الخطية
من أجل تحسين كفاءة رأس المال لـ LP ومشكلة الالتواء العالي والحمل الزائد، أطلق Balancer التجميع الخطي كحل في V2، وبالتالي تقديم رمز BPT (ERC20 Balancer Pool Token).
تجمع خطي [8] بما في ذلك الرمز الرئيسي (الأصل الأساسي)، والرمز المميز المغلف (الرمز المغلف) ورمز BPT، يتم تبادل الأصول ونظيراتها المغلفة مع العوائد من خلال أسعار الصرف المعروفة. كلما ارتفعت نسبة الرموز المغلفة، زاد العائد وكفاءة رأس المال للمجمع. أثناء عملية الالتواء، تُستخدم عادةً عوامل القياس لضمان حساب الرموز المميزة المختلفة بنفس الدقة.
تجمعات قابلة للتركيب تجمعات قابلة للتركيب
جميع مجموعات Balancer عبارة عن مجموعات قابلة للتركيب وتحتوي على رموز مميزة أخرى، كما أن المجموعة نفسها لها أيضًا رموز مميزة خاصة بها. من بينها، تشير عملة BPT إلى رمز التجمع المتوازن ERC20، والذي يعد أساس جميع المجمعات. يمكن للمستخدمين دمج رموز BPT بحرية في مجموعات أخرى لاستردادها. يتضمن الاسترداد دائمًا مجموعة ورمزين: GiveIn وGiveOut. يعني In إرسال الرموز المميزة للمكونات واستقبال BPT، بينما يعني Out إرسال BPT واستقبال الرموز المميزة للمكونات. إذا كانت BPT نفسها عبارة عن رمز مكون، فيمكن تبادلها مثل الرموز المميزة الأخرى. يشكل هذا التنفيذ مسارًا بسيطًا للتبديل بين الأصول الأساسية والرموز المميزة في المجمع الخارجي. يمكن للمستخدمين استخدام BPT لتبادل الأصول الأساسية للتجميع الخطي. وهذا أيضًا هو تجمع Balancer Boosted. [9] مؤسسة.
من خلال المجموعة المذكورة أعلاه، يتم تشكيل تجمع Balancer القابل للدمج. يتكون المجمع المستقر القابل للتركيب bb-a-USD من ثلاث مجموعات خطية، مع إرسال سيولة خاملة إلى البروتوكول الخارجي (Aave). على سبيل المثال، bb-a-DAI هو تجمع خطي يحتوي على DAI وwaDAI (aDAI ملفوف). عندما يحتاج المستخدم إلى BatchSwap (مثل تغيير USDT إلى DAI)، يكون مثال مسار التبادل كما يلي:
في تجمع USDT الخطي، استبدل USDT بـ bb-a-USDT (أدخل إلى تجمع USDT الخطي)؛
في bb-a-USD، يتم تبادل bb-a-USDT بـ bb-a-DAI (التبادل بين BPT الخطي)؛
في تجمع DAI الخطي، يتم استبدال bb-a-DAI بـ DAI (الخروج من تجمع DAI الخطي).
بعد فهم المعرفة المطلوبة أعلاه لفترة وجيزة، ندخل إلى رابط تحليل الثغرات الأمنية.
تحليل
في 27 أغسطس، تلقى فريق أمان SlowMist تعريفًا من نظام MistEye يفيد بأنه تم استغلال ثغرة أمنية مشتبه بها في Balancer في البرية. تجارة [3] على النحو التالي:
اقترض المهاجم أولاً مبلغ 300000 دولار أمريكي من AAVE من خلال قرض سريع. ثم يتم استدعاء عملية BatchSwap الخاصة بـ Vault لإجراء حساب تبادل رموز BPT من خلال مجموعة مستقرة قابلة للدمج bb-a-USD، وأخيرًا، يتم تبادل 94,508 USDC مقابل 59,964 bb-a-USDC و68,201 bb-a-DAI و74,280 ب-أ-USDT. أخيرًا، ستخرج رموز BPT التي تم الحصول عليها من المجمع من خلال مجموعة الخروج لعقد Vault مقابل الأصول الأساسية، وسداد القرض السريع، وترك السوق بربح يبلغ حوالي 108,843.7 دولارًا أمريكيًا.
يمكن ملاحظة أن مفتاح هذا الهجوم يكمن في BatchSwap، وما الذي حدث بالضبط في BatchSwap؟ دعونا نلقي نظرة فاحصة.
خلال عملية BatchSwap بأكملها، قام المهاجم أولاً باسترداد USDC في مجموعة bb-a-USDC، ثم قام بتبادل رموز BPT، واستبدال bb-a-USDC بـ bb-a-DAI وbb-a-USDT وUSDC. أخيرًا، يتم استبدال الرمز الرئيسي الأساسي USDC بـ bb-a-USDT. بمعنى آخر، يعمل bb-a-USDC، باعتباره رمز BPT الرئيسي، بمثابة الرمز المميز لـ GiveOut و GiveIn.
في الخطوة الأولى، يقوم المهاجم بتبادل رموز BPT المميزة لرموز USDC الرئيسية في المجمع الخطي bb-a-USDC مع عامل تحجيم ثابت، ويتم تسجيل المبلغ المتزايد في bptBalance في المجمع. ولكن بعد تبادل onSwap الثاني، وجدنا أن قيمة المبلغ الذي تم تبادله لـ USDC خلال نفس عملية التبادل كانت 0. لماذا هذا؟
بالتعمق في وظيفة onSwap، نجد أنه في هذه العملية، ستتم معالجة الدقة إلى القيمة الاسمية وسيتم حساب عامل القياس للرمز المميز المقابل. عند استدعاء الدالة _downscaleDown بعد ذلك، يتم تقريب المبلغ إلى الأسفل. إذا كان المبلغ وعوامل التحجيم [indexOut] الفرق بين القيمتين كبير، والقيمة المحسوبة لـ _downscaleDown هي صفر.
وهذا يعني أنه عندما نستخدم رموز BPT لاسترداد الرموز المميزة الرئيسية، إذا كان المبلغ صغيرًا جدًا، فسيتم تقريب قيمة الإرجاع إلى الصفر، وتكون هذه القيمة أقل من 1e12 محسوبة بواسطة عوامل القياس. ومع ذلك، ستتم إضافة مبلغ bb-a-USDC القادم من المبلغ In إلى المبلغ الافتراضي bptBalance، وستعمل هذه العملية على زيادة الرصيد في مجمع bb-a-USDC، والذي يمكن اعتباره إضافة أحادية الجانب لـ bb -a-USDC السيولة.
بعد ذلك، باستخدام خصائص المجموعة المستقرة القابلة للدمج، من خلال التحويل المتبادل بين رموز BPT، قم أولاً بتبادل bb-a-USDC لرموز BPT الأخرى. لمتابعة عملية التبادل هذه، يمكنك دمج مسار الاستدعاء التالي للتجميع المستقر: bb-a-DAI onSwap -> _swapGivenIn -> _onSwapGivenIn. أولاً، استبدل bb-a-USDC بـ bb-a-DAI وbb- أ-USDT بالتسلسل. على عكس المجمعات الخطية عبر الإنترنت، تتطلب المجمعات الثابتة القابلة للتركيب تحديثات ذاكرة التخزين المؤقت لسعر الصرف قبل عمليات onSwap. من الكود، يمكننا أن نرى أنه في المجموعة المجمعة، سيحدد onSwap أولاً ما إذا كان سعر صرف الرمز المميز المخزن مؤقتًا يحتاج إلى التحديث.
بعد التبادل السابق، تغير مبلغ bb-a-USDC، والمبلغ الإجمالي الحقيقي بعد التسمية من خلال _toNominal هو إجمالي الرصيد 994,010,000,000، والعرض الافتراضي لرموز BPT هو 20,000,000,000. يمكن حساب أن سعر الصرف المحدث هو ما يقرب من 45 ضعف سعر صرف ذاكرة التخزين المؤقت الأصلي للمجموعة الخطية السابقة وهو 1,100,443,876,587,504,549، وهو 49,700,500,000,000,000,000.
بعد ذلك، يتم تبادل bb-a-USDC مقابل USDC في المجمع الخطي. ومع ذلك، فإن هذا التبادل هو نفس التبادل الثاني، مما يؤدي مرة أخرى إلى تقريب المبلغ إلى 0، ويكون مسار التبادل هو نفسه كما كان من قبل.
التبادل التالي هو عكس USDC إلى bb-a-USDC، ومسار التبادل هو onSwap -> onSwapGivenIn -> _swapGivenMainIn. خلال هذه العملية، وجدنا أنه عند حساب المبلغ المطلوب استرداده، يعتمد حساب العرض الافتراضي على الفرق بين إجمالي المعروض من رمز BPT المسترد والمبلغ المتبقي في المجموعة، وهو 0 .
وذلك لأن bptSupply يساوي 0، ويتم استدعاء الدالة _toNominal مباشرة عند حساب BPT Out، واستدعاء هذا المسار يجعل نسبة التبادل بين USDC وbb-a-USDC قريبة من 1:1.
لخص
يربط BatchSwap مخرجات تبادل أحد المجمعات بمدخلات تجمع آخر (tokenIn وtokenOut) من خلال مقايضات ذرية متعددة بين مجموعات متعددة، ويحول USDC إلى رموز BPT المميزة. في عملية تبديل الدفعة هذه، لا يحدث أي تحويل رمزي فعلي، ولكن يتم تأكيد مبلغ التبادل النهائي عن طريق تسجيل المبلغ المحول إلى الداخل والخارج. ولأن المجمع الخطي يتم تبادله من خلال رمز الأصل الأساسي، فإن طريقة التبادل هي حساب السعر من خلال عرض افتراضي وخوارزمية ثابتة. ولذلك، هناك نوعان من الثغرات الأمنية في BatchSwap:
الأول هو مشكلة التقريب التنازلي للتجميع الخطي، إذ يضيف المهاجم من جانب واحد الرموز الرئيسية إلى المجمع من خلال التقريب لزيادة نسبة الرموز المميزة المخزنة مؤقتًا، وبالتالي التلاعب بسعر صرف الرمز المميز في المجمع القابل للتركيب المقابل؛
ثانيًا، نظرًا لخصائص العرض الافتراضية للمجمع القابل للدمج، يتم حساب العرض الافتراضي عن طريق طرح الرصيد الموجود في المجمع من رمز BPT. إذا كان GiveIn رمز BPT في وقت الاسترداد، فسيتم خصم هذا الجزء من الجزء اللاحق العرض. ، يحتاج المهاجم فقط إلى تبادل BPT كـ GiveIn، ومعالجة العرض الخاص به إلى 0 أولاً، ثم إجراء مبادلة عكسية، أي أنه يتم استخدام BPT بعد ذلك كـ GiveOut. في هذا الوقت، نظرًا لأن العرض هو 0، فإن الخوارزمية سوف كن قريبًا من 1: نسبة 1 أقل من نسبة الاسترداد للتجميع الخطي للاسترداد الفعلي، مما يجعل عدد رموز BPT الخاصة بـ GiveOut يتم التلاعب بها بشكل غير مباشر.
يمكننا أن نجد أن الثغرة الأولى تزيد من سعر الصرف، في حين أن الثغرة الثانية تقلل من سعر الصرف في الاتجاه المعاكس، وقد استغل المهاجم التعزيز المزدوج لتحقيق الربح والمغادرة.
الرابط المرجعي:
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]