ชื่อเรื่องเดิม: "SlowMist: การวิเคราะห์การโจรกรรมมูลค่า 230 ล้านเหรียญจาก Cetus"
ผู้เขียนต้นฉบับ: Victory, Lisa, SlowMist Technology
เมื่อวันที่ 22 พฤษภาคม ตามข่าวของชุมชน Cetus ผู้ให้บริการสภาพคล่องในระบบนิเวศ SUI ถูกสงสัยว่าถูกโจมตี โดยความลึกของกลุ่มสภาพคล่องลดลงอย่างมาก และคู่ซื้อขายโทเค็นหลายคู่ใน Cetus ก็ลดลงด้วย มูลค่าความเสียหายที่ประเมินไว้เกินกว่า 230 ล้านเหรียญสหรัฐ ต่อมา Cetus ได้ออกประกาศแจ้งว่า “เราตรวจพบเหตุการณ์ดังกล่าวในโปรโตคอลของเรา ด้วยเหตุผลด้านความปลอดภัย สัญญาอัจฉริยะจึงถูกระงับชั่วคราว ขณะนี้ทีมงานกำลังสืบสวนเหตุการณ์ดังกล่าวอยู่ เราจะออกแถลงการณ์การสืบสวนเพิ่มเติมในเร็วๆ นี้”
หลังเกิดเหตุการณ์ ทีมรักษาความปลอดภัย SlowMist ได้เข้ามาแทรกแซงการวิเคราะห์และออกการแจ้งเตือนด้านความปลอดภัย ต่อไปนี้เป็นการวิเคราะห์โดยละเอียดเกี่ยวกับวิธีการโจมตีและการโอนเงิน

(https://x.com/CetusProtocol/status/1925515662346404024)
ธุรกรรมการโจมตีหนึ่งรายการ:https://suiscan.xyz/mainnet/tx/DVMG3B2kocLEnVMDuQzTYRgjwuuFSfciawPvXXheB3x
แกนหลักของเหตุการณ์นี้คือผู้โจมตีสร้างพารามิเตอร์อย่างระมัดระวังเพื่อทำให้เกิดการล้นแต่ข้ามการตรวจจับ และท้ายที่สุดก็ใช้โทเค็นจำนวนเล็กน้อยเพื่อแลกเปลี่ยนเป็นสินทรัพย์สภาพคล่องจำนวนมาก ต่อไปนี้เป็นการวิเคราะห์ขั้นตอนที่เฉพาะเจาะจง: 1. ผู้โจมตีได้ยืมเงินจำนวน 10,024,321.28 haSUI ผ่านทางการกู้ยืมแบบแฟลช ทำให้ราคาพูลลดลงจาก 18,956,530,795,606,879,104 เหลือ 18,425,720,184762886 หรือลดลง 99.90% 2. ผู้โจมตีเลือกช่วงราคาที่แคบมากอย่างระมัดระวังเพื่อเปิดตำแหน่งสภาพคล่อง: ขีดจำกัดล่างของติ๊ก: 300000 (ราคา: 60,257,519,765,924,248,467,716,150) ขีดจำกัดบนของติ๊ก: 300200 (ราคา: 60,863,087,478,126,617,965,993,239) ความกว้างของช่วงราคา: เพียง 1.00496621% 3. จากนั้นก็มาถึงแกนหลักของการโจมตี ผู้โจมตีอ้างว่าได้เพิ่มสภาพคล่องมหาศาลจำนวน 10,365,647,984,364,446,732,462,244,378,333,008 หน่วย แต่เนื่องจากช่องโหว่ ระบบจึงรวบรวมได้เพียง 1 โทเค็น A เท่านั้น มาวิเคราะห์กันว่าทำไมผู้โจมตีจึงสามารถแลกเปลี่ยนสภาพคล่องมหาศาลด้วยโทเค็นเพียง 1 ตัวได้ เหตุผลหลักคือมีช่องโหว่การหลีกเลี่ยงการตรวจจับการล้นใน checking_shlw ในฟังก์ชัน get_delta_a ผู้โจมตีได้ใช้ประโยชน์จากสิ่งนี้และก่อให้เกิดการเบี่ยงเบนอย่างร้ายแรงในการคำนวณของระบบว่าต้องเพิ่ม haSUI เท่าใดจริงๆ เนื่องจากไม่ตรวจพบการล้น ระบบจึงประเมินจำนวน haSUI ที่จำเป็นผิดพลาด ส่งผลให้ผู้โจมตีสามารถแลกรับสินทรัพย์สภาพคล่องจำนวนมากได้ด้วยโทเค็นจำนวนเล็กน้อย จึงสามารถโจมตีได้สำเร็จ เมื่อระบบคำนวณว่าต้องใช้ haSUI เท่าใดจึงจะเพิ่มสภาพคล่องจำนวนมหาศาลเช่นนี้: ประเด็นสำคัญคือการใช้งานฟังก์ชัน checking_shlw นั้นมีข้อบกพร่องอย่างร้ายแรง ในความเป็นจริงค่าอินพุตใดๆ ที่น้อยกว่า 0xffffffffffffffff <<192 จะข้ามการตรวจสอบโอเวอร์โฟลว์ อย่างไรก็ตาม เมื่อค่าเหล่านี้ถูกเลื่อนไปทางซ้าย 64 บิต ผลลัพธ์จะเกินช่วงการแสดงของ u256 และข้อมูลลำดับสูงจะถูกตัดทอน ส่งผลให้ผลลัพธ์มีค่าน้อยกว่าค่าทางทฤษฎีมาก ส่งผลให้ระบบประมาณจำนวน haSUI ที่จำเป็นในการคำนวณครั้งต่อไปต่ำเกินไป · มาสก์ผิด: 0xffffffffffffffff << 192 = ตัวเลขที่มีขนาดใหญ่มาก (ประมาณ 2^256-2^192) · อินพุตเกือบทั้งหมดมีขนาดเล็กกว่ามาสก์นี้ ซึ่งหลีกเลี่ยงการตรวจจับการล้น · ปัญหาที่แท้จริง: เมื่อ n >= 2^192, n<< 64 จะเกินช่วง u256 และถูกตัดทอน ค่ากลางของผู้โจมตี liquidity * sqrt_price_diff = 6277101735386680763835789423207666908085499738337898853712: · น้อยกว่าหน้ากากข้อผิดพลาด โดยหลีกเลี่ยงการตรวจจับการล้น · อย่างไรก็ตาม หลังจากเลื่อนไปทางซ้าย 64 บิต จะเกินค่าสูงสุดของ u256 ทำให้ส่วนที่เกินถูกตัดทอน · ผลการคำนวณขั้นสุดท้ายมีค่าน้อยกว่า 1 โดยประมาณ แต่เนื่องจากถูกปัดขึ้น ผลหารจึงเท่ากับ 1 4. ในที่สุดผู้โจมตีก็สามารถลบสภาพคล่องออกไปและได้รับรายได้จากโทเค็นจำนวนมหาศาล: · การลบครั้งแรก: 10,024,321.28 haSUI · การลบครั้งที่สอง: 1 haSUI · การลบครั้งที่สาม: 10,024,321.28 haSUI 5. ผู้โจมตีได้คืนเงินกู้แบบแฟลชและสร้างกำไรสุทธิประมาณ 10,024,321.28 haSUI และ 5,765,124.79 SUI การโจมตีจึงเสร็จสิ้นลง หลังจากการโจมตี Cetus ได้ออกแพตช์ซ่อมแซม สำหรับโค้ดการซ่อมแซมโดยเฉพาะ โปรดดูที่: https://github.com/CetusProtocol/integer-mate/pull/7/files#diff-c04eb6ebebbbb80342cd953bc63925e1c1cdc7ae1fb572f4aad240288a69409 ฟังก์ชัน watched_shlw ที่ได้รับการซ่อมแซมมีดังต่อไปนี้: คำแนะนำการซ่อมแซม: แก้ไขหน้ากากที่ไม่ถูกต้อง 0xffffffffffffffff << 192 ถึงเกณฑ์ที่ถูกต้อง 1 << 192 แก้ไขเงื่อนไขการตัดสินจาก n > หน้ากากเป็น n >= หน้ากาก ให้แน่ใจว่าเมื่อการเลื่อนไปทางซ้าย 64 บิตอาจทำให้เกิดการโอเวอร์โฟลว์ แฟล็กโอเวอร์โฟลว์สามารถตรวจพบและส่งคืนได้อย่างถูกต้อง ตามการวิเคราะห์ ผู้โจมตี 0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06 ทำกำไรได้ประมาณ 230 ล้านเหรียญสหรัฐฯ ซึ่งรวมถึง SUI, vSUI, USDC และสินทรัพย์อื่นๆ เราพบว่าผู้โจมตีได้เตรียมค่าธรรมเนียมก๊าซไว้เมื่อสองวันก่อน และพยายามดำเนินการก่อนการโจมตี แต่ล้มเหลว: หลังจากทำกำไรแล้ว ผู้โจมตีได้โอนเงินบางส่วน เช่น USDC, SOL และ suiETH ไปยังที่อยู่ EVM 0x89012a55cd6b88e407c9d4ae9b3425f55924919b ผ่านสะพานข้ามสาย เช่น Sui Bridge, Circle, Wormhole และ Mayan: ในจำนวนนี้ 5.2341 WBNB ถูกโอนไปยังที่อยู่ BSC 0x89012a55cd6b88e407c9d4ae9b3425f55924919b: ถัดไป เราใช้เครื่องมือป้องกันและติดตามการฟอกเงินแบบบนเครือข่าย MistTrack เพื่อวิเคราะห์ที่อยู่ 0x89012a55cd6b88e407c9d4ae9b3425f55924919b บน EVM ที่ได้รับเงินจากเครือข่ายข้ามเครือข่าย ที่อยู่นี้ได้รับ 5.2319 BNB บน BSC และยังไม่ได้โอนออกไป: การโจมตีนี้แสดงให้เห็นถึงพลังของช่องโหว่แบบ Math Overflow ผู้โจมตีเลือกพารามิเตอร์ที่เฉพาะเจาะจงผ่านการคำนวณที่แม่นยำและใช้ประโยชน์จากข้อบกพร่องในฟังก์ชัน watched_shlw เพื่อรับสภาพคล่องมูลค่าหลายพันล้านดอลลาร์ด้วยต้นทุน 1 โทเค็น นี่เป็นการโจมตีทางคณิตศาสตร์ที่ซับซ้อนมาก ทีมรักษาความปลอดภัยของ SlowMist แนะนำให้ผู้พัฒนาตรวจสอบเงื่อนไขขอบเขตของฟังก์ชันทางคณิตศาสตร์ทั้งหมดในการพัฒนาสัญญาอัจฉริยะอย่างเคร่งครัด ยินดีต้อนรับสู่ชุมชนทางการของ BlockBeats: กลุ่ม Telegram สมัครสมาชิก: https://t.me/theblockbeats กลุ่ม Telegram พูดคุย: https://t.me/BlockBeats_App บัญชี Twitter ทางการ: https://twitter.com/BlockBeatsAsiaการวิเคราะห์การโจมตี

(แผนภาพลำดับการโจมตี)






งานซ่อมแซมโดยฝ่ายโครงการ

การวิเคราะห์ MistTrack



จากนั้นผู้โจมตีได้ฝากทรัพย์สินมูลค่า 10 ล้านเหรียญสหรัฐฯ เข้าใน Suilend:
นอกจากนี้ ผู้โจมตียังได้โอน SUI จำนวน 24,022,896 ไปยังที่อยู่ใหม่ 0xcd8962dad278d8b50fa0f9eb0186bfa4cbdecc6d59377214c88d0286a0ac9562 ซึ่งยังไม่ได้โอนออก:
โชคดีที่ตามข้อมูลของ Cetus ได้มีการร่วมมือกับ SUI Foundation และสมาชิกในระบบนิเวศอื่นๆ เงินจำนวน 162 ล้านเหรียญสหรัฐฯ ที่ขโมยมาจาก SUI ถูกอายัดไว้ได้สำเร็จ 
(https://x.com/CetusProtocol/status/1925567348586815622)
ที่อยู่นี้ได้รับ 3,000 USDT, 40.88 ล้าน USDC, 1,771 SOL และ 8,130.4 ETH บน Ethereum ในจำนวนนี้ USDT, USDC และ SOL ถูกแลกเปลี่ยนเป็น ETH ผ่าน coW Swap, ParaSwap และอื่นๆ:
จากนั้นที่อยู่ดังกล่าวได้โอน 20,000 ETH ไปยังที่อยู่ 0x0251536bfcf144b88e1afa8fe60184ffdb4caf16 ซึ่งยังไม่ได้โอนออก:
ยอดคงเหลือปัจจุบันของที่อยู่นี้บน Ethereum คือ 3,244 ETH:
MistTrack ได้เพิ่มที่อยู่ที่กล่าวถึงข้างต้นไปยังไลบรารีที่อยู่ที่เป็นอันตราย ในเวลาเดียวกันเราจะยังคงตรวจสอบยอดคงเหลือของที่อยู่ต่อไป สรุป