เมื่อวันที่ 28 มีนาคม 2024 Prisma Finance ประสบกับการโจมตีด้วยสินเชื่อแฟลช และโครงการนี้สูญเสียเงินไปประมาณ 12.21 ล้านดอลลาร์สหรัฐ

SharkTeam ดำเนินการวิเคราะห์ทางเทคนิคของเหตุการณ์นี้และสรุปข้อควรระวังด้านความปลอดภัย เราหวังว่าโครงการต่อ ๆ ไปจะสามารถเรียนรู้จากสิ่งนี้และร่วมกันสร้างสายการรักษาความปลอดภัยสำหรับอุตสาหกรรมบล็อกเชน
ผู้โจมตี 1: 0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202 (ย่อว่า 0x7e39)
สัญญาการโจมตี 1: 0xd996073019c74b2fb94ead236e32032405bc027c (ตัวย่อเป็น 0xd996)
ผู้โจมตี 2: 0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385
สัญญาการโจมตี 2: 0x4148310fe4544e82f176570c6c7b649290a90e17
สัญญาเป้าหมายที่ถูกโจมตี: 0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
การโจมตีประกอบด้วยธุรกรรม 16 รายการ โดยพิจารณาธุรกรรมการโจมตีครั้งแรกเป็นตัวอย่าง:
0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7
กระบวนการโจมตีมีดังนี้:
1. อ่านหลักประกันและหนี้ทั้งหมดในสัญญาเป้าหมาย ตามที่อยู่ 0x56a201b872b50bbdee0021ed4d1bb36359d291ed (ตัวย่อ 0x56a2)

ผลลัพธ์การส่งคืนจะเป็นดังนี้:
ผลลัพธ์การส่งคืนจะเป็นดังนี้:

ที่อยู่ 0x56a2 มียอดรวม 1,745 wstETH เป็นหลักประกันในสัญญาเป้าหมาย และมีหนี้สินรวม 1,442,100 mkUSD
2. ผู้โจมตี 0x7e39 เรียกใช้ฟังก์ชัน flashLoan ในสัญญาหนี้ mkUSD ผ่านสัญญาการโจมตี 0xd996

ตัวรับพารามิเตอร์ถูกตั้งค่าเป็น MigrateTroveZap และจำนวนคือหนี้ทั้งหมดที่สอบถามข้างต้น

จากนั้น ฟังก์ชัน onFlashLoan ในเครื่องรับ (ในที่นี้ MigrateTroveZap) จะถูกเรียกในฟังก์ชัน flashLoan

ขั้นแรกฟังก์ชัน onFlashLoan จะชำระหนี้เดิมทั้งหมดผ่านทางสินเชื่อแฟลช จากนั้นถอนหลักประกันให้กับผู้รับ จากนั้นผู้รับจะจำนองหลักประกันจำนวนหนึ่งอีกครั้ง และยืมหนี้จำนวนหนึ่ง มีสองหน้าที่หลักที่เรียกว่า:
(1) ฟังก์ชั่น closeTrove ชำระหนี้และถอนหลักประกันทั้งหมด (1745.08 swtETH) จาก troverManager ไปยังผู้รับ (นี่คือสัญญา MigrateTroveZap)

(2) ฟังก์ชั่น openTrove ผู้รับจำนอง 463.18 wstETH อีกครั้งใน troverManager และก่อหนี้จำนวน 1,443,598 mkUSD

จากข้อมูลข้างต้นจะเห็นได้ว่าหลังจากดำเนินการฟังก์ชัน flashLoan แล้ว หลักประกันที่ดึงมาจาก troverManager และเป็นของที่อยู่ 0x56a2 ยังคงอยู่ในผู้รับ และจำนวนเงินจะอยู่ที่ประมาณ 1745.08 – 463.18 = 1281.90 wstETH
3. ผู้โจมตี 0x7e39 ยืม 1 wstETH จาก Balancer ผ่านการยืมแฟลชโดยโจมตีสัญญา 0xd996

จากนั้นจำนอง 1 wstETH และยืมหนี้ 2000 mkUSD บวกค่าธรรมเนียม ยอดหนี้ทั้งหมด 2200 mkUSD

4. เช่นเดียวกับขั้นตอนที่ 2 ให้เรียกใช้ฟังก์ชัน flashLoan ในสัญญาหนี้ mkUSD ที่นี่ตัวรับพารามิเตอร์ยังคงตั้งค่าเป็น MigrateTroveZap และจำนวนเงินคือหนี้ทั้งหมดหลังจากให้คำมั่นสัญญา 1 wstETH ซึ่งเท่ากับ 2,000 mkUSD ในฟังก์ชัน FlashLoan ฟังก์ชัน onFlashLoan ในเครื่องรับจะถูกเรียก จากนั้นจึงเรียกใช้ฟังก์ชัน closeTrove และ openTrove


อย่างไรก็ตาม บัญชีพารามิเตอร์ในฟังก์ชัน closeTrove และ openTrove ที่นี่ไม่ใช่ที่อยู่ 0x56a2 ข้างต้นอีกต่อไป แต่เป็นสัญญาการโจมตี 0xd996 ที่ให้คำมั่นสัญญา 1 wstETH
(1) ฟังก์ชั่น closeTrove ชำระหนี้และถอนหลักประกันทั้งหมด (1 swtETH) จาก troverManager ไปยังผู้รับ (ซึ่งยังคงเป็นสัญญา MigrateTroveZap) ขณะนี้มี 1281.90 +1=1282.90 wstETH ในตัวรับ

(2) ฟังก์ชั่น openTrove ผู้รับจำนอง 1282.80 wstETH (เกือบทั้งหมด) อีกครั้งใน troverManager และก่อหนี้จำนวน 2001.8 mkUSD

ในความเป็นจริง 1281.80 wstETH ในหลักประกันที่นี่ไม่ได้เป็นของสัญญาการโจมตี 0xd996 แต่เป็นของที่อยู่ข้างต้น 0x56a2
5. ในที่สุด ผู้โจมตี 0x7e39 เรียกฟังก์ชัน closeTrove แยกจากกันผ่านสัญญาการโจมตี 0xd996 และแยกจำนอง 1282.80 wstETH ลงในสัญญาการโจมตี 0xd996


หลังจากชำระคืนเงินกู้แฟลชแล้ว ผู้โจมตียังคงทำกำไรได้ 1281.80 wstETH ซึ่งมีมูลค่าประมาณ 2.30 ล้านเหรียญสหรัฐ

สาเหตุที่แท้จริงของเหตุการณ์นี้คือสัญญาโครงการมีตรรกะและการตรวจสอบสิทธิ์ ซึ่งอนุญาตให้ผู้โจมตีใช้ช่องโหว่นี้เพื่อรับทรัพย์สินที่จำนำจากที่อยู่บัญชีอื่น
ในที่สุด wstETH ที่ผู้โจมตีได้รับคือหลักประกันของที่อยู่เดิม 0x56a2 ในสัญญา troverManager ด้วยฟังก์ชัน flashLoan ของสัญญา mkUSD เขาปรับแต่งพารามิเตอร์ของฟังก์ชัน onFlashLoan ในสัญญา MigrateTroveZap โดยใช้ MigrateTroveZap เพื่อแปลงเป็นหลักประกัน ของสัญญาโจมตีแล้วใช้มันโจมตีสัญญา ดึงมันออกมา
ผู้โจมตีจัดการการจำนองและการถอนที่อยู่บัญชีอื่นผ่านฟังก์ชัน flashLoan ในสัญญา mkUSD และฟังก์ชัน onFlashLoan ในสัญญา MigrateTroveZap


(1) ฟังก์ชัน flashLoan ขาดการตรวจสอบที่อยู่ของตัวรับพารามิเตอร์ เนื่องจากผู้รับในฟังก์ชัน onFlashLoan จะได้รับหลักประกันทั้งหมดของบัญชี ดังนั้นผู้รับจึงต้องได้รับการยืนยันว่าเชื่อถือได้
(1) ฟังก์ชัน flashLoan ขาดการตรวจสอบความถูกต้องของที่อยู่ตัวรับพารามิเตอร์ เนื่องจากผู้รับในฟังก์ชัน onFlashLoan จะได้รับหลักประกันทั้งหมดของบัญชี ดังนั้นผู้รับจึงต้องได้รับการยืนยันว่าเชื่อถือได้
(2) ฟังก์ชัน onFlashLoan ขาดการตรวจสอบที่อยู่บัญชี เนื่องจากฟังก์ชัน closeTrove และ openTrove เป็นทรัพย์สินของบัญชีที่กำลังดำเนินการ ดังนั้นจึงจำเป็นต้องเพิ่มการตรวจสอบสิทธิ์ให้กับบัญชี
นอกจากการตรวจสอบพารามิเตอร์ที่อยู่ทั้งสองนี้แล้ว ยังอาจจำเป็นต้องตรวจสอบพารามิเตอร์ปริมาณและตรรกะการใช้งานในฟังก์ชัน flashLoan ด้วย
เพื่อตอบสนองต่อการโจมตีนี้ เราควรปฏิบัติตามข้อควรระวังต่อไปนี้ในระหว่างกระบวนการพัฒนา:
(1) ในระหว่างกระบวนการออกแบบและพัฒนาโครงการต้องรักษาความสมบูรณ์และความเข้มงวดของตรรกะโดยเฉพาะอย่างยิ่งเมื่อต้องโอนสินทรัพย์ นอกจากนี้ ยังจำเป็นต้องเสริมสร้างการตรวจสอบสิทธิ์การวิจัยฟังก์ชันเพื่อให้แน่ใจว่า ผู้โทร ฟังก์ชันการโทร และพารามิเตอร์ฟังก์ชัน ลอจิกการถ่ายโอน ฯลฯ ทั้งหมดปลอดภัยและเชื่อถือได้
(2) ก่อนที่โปรเจ็กต์จะออนไลน์ จำเป็นต้องค้นหาทีมตรวจสอบมืออาชีพจากภายนอกเพื่อทำการตรวจสอบสัญญา
วิสัยทัศน์ของ SharkTeam คือการรักษาความปลอดภัยให้กับโลกของ Web3 ทีมงานประกอบด้วยผู้เชี่ยวชาญด้านความปลอดภัยที่มีประสบการณ์และนักวิจัยอาวุโสจากทั่วโลก ซึ่งมีความเชี่ยวชาญในทฤษฎีพื้นฐานของบล็อคเชนและสัญญาอัจฉริยะ โดยให้บริการต่างๆ เช่น การระบุและการบล็อกความเสี่ยง การตรวจสอบสัญญาอัจฉริยะ KYT/AML การวิเคราะห์ออนไลน์ ฯลฯ และได้สร้างแพลตฟอร์มการระบุความเสี่ยงและการบล็อกอัจฉริยะแบบออนไลน์ ChainAegis ซึ่งสามารถต่อสู้กับภัยคุกคามขั้นสูงแบบต่อเนื่อง (ขั้นสูง) ได้อย่างมีประสิทธิภาพ ภัยคุกคามแบบถาวร) ในโลก Web3 , APT) ได้สร้างความสัมพันธ์ความร่วมมือระยะยาวกับผู้เล่นหลักในด้านต่างๆ ของระบบนิเวศ Web3 เช่น Polkadot, Moonbeam, polygon, Sui, OKX, imToken, Collab.Land เป็นต้น
เว็บไซต์อย่างเป็นทางการ: https://www.sharkteam.org
ทวิตเตอร์: https://twitter.com/sharkteamorg
โทรเลข: https://t.me/sharkteamorg
ดิสคอร์ด: https://discord.gg/jGH9xXCjDZ
ความคิดเห็นทั้งหมด