در شامگاه ۱ خرداد ۱۴۰۴، صرافی غیرمتمرکز سیتوس (Cetus) در شبکه سویی (Sui) هدف یکی از پیچیدهترین و پرهزینهترین حملات تاریخ دیفای قرار گرفت؛ حملهای که تنها در عرض چند ساعت بیش از ۲۳۰ میلیون دلار از استخرهای نقدینگی را تخلیه کرد. منشأ این فاجعه، آسیبپذیری ظریف اما جدی در عملکرد بررسی سرریز عددی (Overflow) بود که به مهاجم اجازه داد با یک واحد توکن، میلیاردها نقدینگی وارد کرده و استخرها را خالی کند.
این حمله نهتنها موجب سقوط شدید قیمت توکنهای اکوسیستم سویی شد، بلکه بار دیگر زنگ خطر را درباره امنیت نداشتن محاسبات ریاضی در قراردادهای هوشمند بهصدا درآورد. در این مطلب از میهن بلاکچین، جزئیات فنی حمله، نحوه عملکرد تابع آسیبپذیر، مسیر خروج سرمایهها و واکنشهای جامعه بلاکچین بهصورت کامل بررسی شده است.
مقدمه
در تاریخ ۲۲ می (۱ خرداد)، طبق اخبار منتشرشده در جامعه کاربران، پلتفرم تأمین نقدینگی سیتوس (Cetus) که در اکوسیستم سویی (Sui) فعالیت میکند، تحت حمله قرار گرفت. در نتیجه این حادثه، عمق استخر نقدینگی بهطور قابلتوجهی کاهش یافت و قیمت چندین جفتارز در پلتفرم سیتوس سقوط کرد. برآورد شده که این حمله منجر به زیانی بیش از ۲۳۰ میلیون دلار شده است.
طبق دادههای پلتفرم دکس اسکرینر (Dexscreener)، کاهش قیمت برخی از این توکنها در بازهای یکساعته به بیش از ۸۰٪ رسید که شامل موارد زیر بود:
- HIPPO با افت ۸۰.۳٪ در مدت کوتاه
- LOFI با افت ۷۵.۳۹٪
- SQUIRT با افت شدید ۹۶.۶۵٪
- WET با افت ۷۵.۳۸٪
- CETUS با افت ۴۹.۶٪
پس از این حادثه، سیتوس (Cetus X) با انتشار اطلاعیهای اعلام کرد:
حادثهای در پروتکل ما شناسایی و به دلایل ایمنی، قرارداد هوشمند بهطور موقت متوقف شده است. تیم ما در حال بررسی این حادثه بوده و بهزودی بیانیهای تکمیلی در خصوص این بررسی منتشر خواهد شد.
سیتوس چیست؟
سیتوس یک صرافی غیرمتمرکز (DEX) و بازارساز متمرکز بر محدوده (CLMM) بوده که بر بستر بلاکچینهای سویی و آپتوس (Aptos) توسعه یافته است. سیتوس بهعنوان یکی از بزرگترین پروتکلهای DEX و تأمین نقدینگی در شبکه سویی شناخته میشود. این پلتفرم به کاربران امکان ایجاد استخرهای نقدینگی بدون نیاز به مجوز را میدهد و قابلیتهایی نظیر معامله، مدیریت موقعیتهای LP و فارمینگ را مشابه Uniswap V3 فراهم میکند.
دقیقا چه اتفاقی افتاد؟
مهاجم از یک آسیبپذیری در تابع محاسبه نقدینگی در قرارداد بازارساز خودکار سیتوس سوءاستفاده کرد؛ بهگونهای که در فرآیند محاسبه، بیتهای باارزش بالا (Most Significant Bits) بهطور اشتباه بُرش (Truncate) داده میشدند. این محاسبه دقیقاً زمانی فراخوانی میشود که کاربری اقدام به باز کردن موقعیت تأمین نقدینگی (LP Position) میکند.
در این فرآیند، کاربر میتواند با مشخص کردن یک پارامتر به نام liquidity، موقعیتی بزرگ یا کوچک باز کند (این پارامتر نشان میدهد چه سهمی از استخر را کاربر میخواهد) و به میزان متناسب، توکن ارائه دهد. اما مهاجم با تنظیم مقدار این پارامتر در یک سطح بسیار بالا و غیرواقعی، باعث بروز سرریز عددی در محاسبات میانی شد.
بهدلیل نقص در منطق بررسی سرریز و استفاده اشتباه از عملیات برش بیتها، این سرریز از دید سیستم مخفی ماند. در نتیجه، قرارداد هوشمند بهاشتباه تصور کرد که مهاجم مقدار قابلتوجهی نقدینگی وارد کرده و با تنها یک واحد توکن ورودی، اجازه افزودن موقعیت عظیم نقدینگی را داد.
در مرحله بعد، مهاجم با استفاده از موقعیت ایجادشده، استخرهایی را که حاوی صدها میلیون دلار دارایی بودند، تخلیه کرد.
پژوهشگران امنیتی دداب (Dedaub) در گزارش خود نوشتند:
این باگ به مهاجمان اجازه داد تا موقعیتهای عظیم نقدینگی را تنها با یک واحد توکن ایجاد کرده و سپس، استخرهایی را که حاوی صدها میلیون دلار دارایی بودند، تخلیه کنند.
پس از وقوع حادثه، تیم امنیتی اسلومیست (SlowMist) بلافاصله وارد عمل شد تا این حادثه را تحلیل کند و هشدار امنیتی صادر کرد. در ادامه، تحلیل دقیق روشهای حمله و انتقال سرمایهها ارائه میشود.
اطلاعات مرتبط:
- یکی از تراکنشهای حمله:
https://suiscan.xyz/mainnet/tx/DVMG3B2kocLEnVMDuQzTYRgjwuuFSfciawPvXXheB3x - آدرس مهاجم:
0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06
- آدرس استخر هدف:
0x871d8a227114f375170f149f7e9d45be822dd003eba225e83c05ac80828596bc
- توکنهای درگیر: haSUI / SUI
تحلیل حمله
هسته اصلی این حادثه، بهرهبرداری مهاجم از پارامترهایی بود که با دقت طراحی شده بودند تا باعث بروز سرریز عددی (Overflow) شوند اما از شناسایی توسط سیستم عبور کنند. نهایتاً، مهاجم با استفاده از مقدار بسیار ناچیزی از توکنها، توانست حجم عظیمی از داراییهای نقدپذیر را بهدست آورد. در ادامه، مراحل دقیق این حمله ارائه میشود:
۱. مهاجم ابتدا از طریق حمله وام سریع (Flash loan)، مقدار ۱۰٬۰۲۴٬۳۲۱.۲۸ واحد haSUI وام گرفت و باعث شد نقدینگی استخر از مقدار ۱۸٬۹۵۶٬۵۳۰٬۷۹۵٬۶۰۶٬۸۷۹٬۱۰۴ به ۱۸٬۴۲۵٬۷۲۰٬۱۸۴٬۷۶۲٬۸۸۶، معادل کاهش قیمت ۹۹.۹۰٪ سقوط کند.
۲. مهاجم در ادامه بازه قیمتی بسیار باریکی را برای باز کردن یک موقعیت نقدینگی انتخاب کرد:
- حد پایین: ۳۰۰٬۰۰۰ (قیمت: ۶۰٬۲۵۷٬۵۱۹٬۷۶۵٬۹۲۴٬۲۴۸٬۴۶۷٬۷۱۶٬۱۵۰)
- حد بالا: ۳۰۰٬۲۰۰ (قیمت: ۶۰٬۸۶۳٬۰۸۷٬۴۷۸٬۱۲۶٬۶۱۷٬۹۶۵٬۹۹۳٬۲۳۹)
- عرض بازه قیمتی: فقط ۱.۰۰۴۹۶۶۲۱٪
۳. سوءاستفاده از تابع معیوب checked_shlw
مهاجم ادعا کرد ۱۰^۳۴ واحد نقدینگی اضافه کرده، اما سیستم فقط ۱ توکن A دریافت کرد. دلیل این امر وجود باگی در تابع get_delta_a
و اجرای ناقص checked_shlw
بود که باعث میشد سرریز عددی تشخیص داده نشود.
public fun get_delta_a(
sqrt_price_0: u128,
sqrt_price_1: u128,
liquidity: u128,
round_up: bool
): u64 {
let sqrt_price_diff = if (sqrt_price_0 > sqrt_price_1) {
sqrt_price_0 - sqrt_price_1
} else {
sqrt_price_1 - sqrt_price_0
};
if (sqrt_price_diff == 0 || liquidity == 0) {
return 0
};
let (numberator, overflowing) = math_u256::checked_shlw(
full_math_u128::full_mul(liquidity, sqrt_price_diff)
);
if (overflowing) {
abort EMULTIPLICATION_OVERFLOW
};
let denominator = full_math_u128::full_mul(sqrt_price_0, sqrt_price_1);
let quotient = math_u256::div_round(numberator, denominator, round_up);
(quotient as u64)
}
این تابع از ماسک زیر برای بررسی استفاده میکرد:0xffffffffffffffff << 192 ≈ 2^256 - 2^192
هر مقدار ورودی کمتر از این ماسک، بدون بررسی عبور میکرد. اما وقتی چنان عددی ۶۴ بیت به چپ شیفت داده میشد، از بازه مجاز u256
خارج و دادههای بالا قطع شده، در نتیجه عدد بسیار کوچکتری ذخیره میشد.
public fun checked_shlw(n: u256): (u256, bool) {
let mask = 0xffffffffffffffff << 192; // ❌ Incorrect mask
if (n > mask) { // ❌ Incorrect overflow condition
(0, true)
} else {
((n << 64), false) // ⚠️ Left-shifting `n` by 64 bits may cause overflow. High bits are truncated when converting back to u256, leading to a reduced value.
}
}
نتیجه:
سیستم بهاشتباه محاسبه میکرد که فقط ۱ واحد haSUI نیاز است تا چنین حجم عظیمی نقدینگی وارد شود.
let quotient = math_u256::div_round(numberator, denominator, round_up);
(quotient as u64)
۴. در مرحله پایانی، مهاجم نقدینگی را برداشت و سود زیادی از توکنها کسب کرد:
- برداشت اول: ۱۰٬۰۲۴٬۳۲۱.۲۸ haSUI دریافت شد
- برداشت دوم: ۱ haSUI
- برداشت سوم: ۱۰٬۰۲۴٬۳۲۱.۲۸ haSUI
۵. مهاجم وام سریع را بازپرداخت کرد و به سود خالصی معادل تقریباً ۱۰٬۰۲۴٬۳۲۱.۲۸ haSUI و ۵٬۷۶۵٬۱۲۴.۷۹ SUI دست یافت. حمله در این مرحله کامل شد.
وضعیت اصلاح کد
پس از حمله، Cetus پچی منتشر کرد. کد پچ در این لینک موجود است:
GitHub Patch
در نسخه جدید:
public fun checked_shlw(n: u256): (u256, bool) {
let mask = 1 << 192; // ✅ Correct threshold: 2^192
if (n >= mask) { // ✅ Correct condition to detect overflow
(0, true)
} else {
((n << 64), false)
}
}
- ماسک نادرست به
1 << 192
اصلاح شد - شرط از
n > mask
بهn >= mask
تغییر یافت - در صورت احتمال سرریز با شیفت چپ ۶۴ بیتی، فلگ سرریز بهدرستی شناسایی میشود
تحلیل میستترک (MistTrack)
بر اساس تحلیل انجامشده، مهاجم با آدرس 0xe...8ff06
مجموعاً حدود ۲۳۰ میلیون دلار سود بهدست آورده که شامل داراییهای SUI، vSUI و USDC بوده است.
آنها دریافتند که مهاجم دو روز پیش از حمله، کارمزد گس مورد نیاز را آماده کرده و یک تلاش اولیه نیز داشته که شکست خورده است.
پس از کسب سود، مهاجم بخشی از وجوه را به USDC، SOL و suiETH تبدیل و از طریق پلهای کراس چین مانند Sui Bridge، Circle، Wormhole و Mayan به آدرس EVM زیر منتقل کرد:0x89012a55cd6b88e407c9d4ae9b3425f55924919b
از جمله، ۵.۲۳۴۱ WBNB به آدرس فوق در شبکه BSC منتقل شده است.
سپس مهاجم ۱۰ میلیون دلار از داراییها را در پلتفرم سوییلند (Suilend) واریز کرد.
همچنین، ۲۴٬۰۲۲٬۸۹۶ SUI به آدرس جدیدی با شناسه0xcd..ac9562
منتقل شد، اما هنوز برداشت نشده است.
خوشبختانه طبق اعلام سیتوس، با همکاری بنیاد SUI و سایر اعضای اکوسیستم، توانستند ۱۶۲ میلیون دلار از وجوه سرقتشده را در شبکه سویی مسدود کنند.
صرافی سیتوس روز سهشنبه در بیانیهای اعلام کرد:
با تکیه بر خزانه نقدی و توکنهای بومی خود، اکنون در جایگاهی هستیم که در صورت تأیید جامعه برای بازیابی داراییهای قفلشده، میتوانیم تمام وجوه سرقتشده خارج از زنجیره را بهطور کامل جبران کنیم. این روند همچنین با دریافت وامی حیاتی از سوی بنیاد سویی همراه خواهد بود و امکان بازیابی ۱۰۰٪ داراییها برای تمامی کاربران آسیبدیده را فراهم میسازد.
این پروتکل در ادامه افزود:
از آنجا که تحقق بازیابی کامل منوط به نتیجه رأیگیری جامعه است، با فروتنی از اعضای جامعه سویی درخواست میکنیم که از این پیشنهاد برای بازگرداندن داراییها حمایت کنند. میدانیم که این درخواست، بار اشتباهات گذشته ما را بر دوش جامعه میگذارد، اما باور داریم که این تصمیم، گامی درست در مسیر جبران خسارت کاربران آسیبدیده است.
رأیگیری جامعه در این خصوص از ساعت ۰۰:۳۰ بامداد روز ۲۸ می (۷ خرداد) به وقت تهران آغاز شده و به مدت هفت روز ادامه خواهد داشت. موضوع رأیگیری صدور مجوز برای ارتقای پروتکل است که امکان بازگرداندن وجوه مسدودشده را بدون نیاز به امضای هکر فراهم میکند.
در صورت تصویب این ارتقا، داراییهای بازیابیشده به کیفپول چندامضایی با شش امضا منتقل خواهند شد که بهصورت مشترک توسط سیتوس، شرکت حسابرسی آترسک (OtterSec) و بنیاد سویی مدیریت خواهد شد.
بررسی آدرس مهاجم در شبکه EVM توسط میستترک
این آدرس در شبکه BSC مقدار ۵.۲۳۱۹ BNB دریافت کرده که هنوز برداشت نشده است.
در شبکه اتریوم، این آدرس مقادیر زیادی USDT ،USDC ،SOL و ETH دریافت کرده است.
از میان این داراییها، USDT، USDC و SOL از طریق CoW Swap و ParaSwap به اتریوم تبدیل شدهاند.
در ادامه، این آدرس ۲۰٬۰۰۰ ETH به آدرس دیگری با شناسه 0x02…caf16 منتقل کرده که تاکنون برداشت نشده است.
موجودی فعلی این آدرس در شبکه اتریوم مقدار ۳٬۲۴۴ توکن بومی اتریوم است.
میستترک تمامی آدرسهای ذکرشده را به پایگاه داده آدرسهای مخرب خود افزوده و همچنان ماندهحسابها را تحت نظر دارد.
واکنشها به تصمیم فریز و بحث درباره تمرکزگرایی
این اقدام با واکنشهای متفاوتی در جامعه رمزارزها مواجه شد. در حالی که برخی آن را اقدامی ضروری و محافظتی دانستند، فعالان مدافع تمرکززدایی بهشدت از این تصمیم انتقاد کردند.
یکی از کاربران در شبکه X (توییتر سابق) نوشت:
اعتبارسنجهای شبکه Sui در حال سانسور تراکنشها در سطح کل شبکه هستند.
او ادامه داد:
این اقدام، اصول تمرکززدایی را کاملاً تضعیف کرده و این شبکه را به چیزی جز یک پایگاه داده متمرکز و نیازمند مجوز تبدیل نمیکند.
در همین راستا، استیو بویر (Steve Bowyer) نیز در پست خود در تاریخ ۲۳ مه نوشت:
جالب است که چطور بسیاری از پروژههای وب ۳ که با حمایت سرمایهگذاران خطرپذیر (VC) راهاندازی میشوند، بهشدت متکی به تمرکزگرایی هستند، در حالی که شعارهای خود را از بیت کوین وام گرفتهاند.
جمعبندی
این حمله نشان داد آسیبپذیریهای ناشی از سرریز عددی میتوانند بسیار مخرب باشند. مهاجم با محاسبات دقیق و انتخاب پارامترهای خاص، از نقص تابع checked_shlw
سوءاستفاده کرد و توانست در ازای تنها ۱ توکن، میلیاردها واحد نقدینگی بهدست آورد. این حمله یک نمونه بسیار پیشرفته از بهرهبرداری ریاضیاتی بود و تیمهای امنیتی توصیه میکنند که توسعهدهندگان در توسعه قراردادهای هوشمند، تمامی شرایط مرزی در توابع محاسباتی را بهدقت بررسی و ایمنسازی کنند.