ภาพรวม
ภาพรวม
การวิเคราะห์การโจมตี
เมื่อวันที่ 13 เมษายน 2023 Yearn Finance ถูกแฮ็ก ทำให้สูญเสียเงินประมาณ 10 ล้านดอลลาร์ บทความนี้จะวิเคราะห์กระบวนการโจมตีและสาเหตุของช่องโหว่
https://etherscan.io/tx/0xd55e43c1602b28d4fd4667ee445d570c8f298f5401cf04e62ec329759ecda95d
การวิเคราะห์การโจมตี
นี่คือธุรกรรมการโจมตี:
ผู้โจมตีเริ่มต้นเงินกู้แฟลชจาก Balancer โดยยืม 5 ล้าน DAI, 5 ล้าน USDC และ 2 ล้าน USDT:
จากนั้นบน Curve ผู้โจมตีได้แลกเปลี่ยน 5 ล้าน DAI เป็น 695,000 USDT และ 3.5 ล้าน USDC เป็น 151 USDT:
ผู้โจมตีเรียกใช้ฟังก์ชันการแนะนำของ IEarnAPRWithPool เพื่อตรวจสอบ APR ปัจจุบัน ณ จุดนี้ APR ของ Aave เท่านั้นที่ไม่เท่ากับ 0:
จากนั้น ผู้โจมตีได้โอนเงิน 800,000 USDT ไปยังสัญญาการโจมตี 0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f ในสัญญานี้ ผู้โจมตีเรียกฟังก์ชันชำระคืนของ Aave: Lending Pool V1 หลายครั้งเพื่อช่วยผู้อื่นชำระหนี้ ดังนั้น APR ของ Aave จึงเท่ากับ 0:
ผู้โจมตีเรียกฟังก์ชันการฝากเงินของ yUSDT ซึ่งจำนองไว้ 900,000 USDT และได้รับ 820,000 yUSDT:
ต่อไป ผู้โจมตีเรียกฟังก์ชัน mint ของ bZx iUSDC ใช้ 156,000 USDC เพื่อขุด 152,000 bZx iUSDC และโอนไปยัง Yearn yUSDT:
ผู้โจมตีเรียกใช้ฟังก์ชันถอนเงินของ Yearn:yUSDT เพื่อแปลง 820,000 yUSDT เป็น 1,030,000 USDT ณ จุดนี้ มีเพียง bZx iUSDC ที่โอนโดยผู้โจมตีเท่านั้นที่ยังคงอยู่ในสัญญา:
ต่อไป ผู้โจมตีเรียกฟังก์ชันปรับสมดุลของ Yearn:yUSDT เพื่อทำลาย bZx iUSDC:
จากนั้นบน Curve ผู้โจมตีได้แลกเปลี่ยน 70,000 yUSDT เป็น 5,990,000 yDAI, 400 ล้าน yUSDT เป็น 4,490,000 yUSDC และ 1,240,133,244,352,200 yUSDT เป็น 1 , 360,000 yTUSD:
การวิเคราะห์ช่องโหว่
จากนั้นโทรถอนใน yearn: yDAI และ yearn: yUSDC ตามลำดับ ถอน 6.78 ล้าน DAI และ 5.62 ล้าน USDC และคืนเงินกู้แฟลช:
การวิเคราะห์ช่องโหว่
ประเด็นที่สำคัญที่สุดในการโจมตีครั้งนี้คือผู้โจมตีใช้ 100,000 USDT เพื่อสร้าง 1,252,660,242,850,000 yUSDT ตรวจสอบการใช้งานฟังก์ชั่นการฝากเงิน:
จะเห็นได้ว่าจำนวนของการใช้ร่วมกันเกี่ยวข้องกับตัวแปรพูล ยิ่งพูลมีขนาดเล็ก ส่วนแบ่งก็จะมากขึ้น และค่าของพูลจะได้รับจาก _calcPoolValueInToken:
หลังจากที่ผู้โจมตีเรียกใช้ฟังก์ชันปรับสมดุล มีเพียง USDC เท่านั้นที่มีอยู่ในสัญญา แต่ _balance() ได้รับยอดคงเหลือของ USDT และไม่รวมอยู่ในยอดคงเหลือของ USDC ดังนั้นพูลในขณะนี้คือ 1 (โอนโดยผู้โจมตี) :
เห็นได้ชัดว่านี่เป็นข้อผิดพลาดในการกำหนดค่าโดยฝั่งโครงการ สัญญา yUSDT ควรเป็นโทเค็น USDT ทั้งหมด แต่ตัวแปรจุดศูนย์กลางคือโทเค็น bZx IUSDC ที่เกี่ยวข้องกับ USDC ดังนั้น USDC ใน yUSDT จะไม่รวมอยู่ในยอดคงเหลือ:"newProvider != provider"เหตุใดผู้โจมตีจึงเรียกใช้ฟังก์ชันปรับสมดุลเพื่อเผาโทเค็น bZx iUSDC ตรวจสอบการใช้ฟังก์ชันปรับสมดุล:
จะเห็นได้ว่าจะมีการดำเนินการ Redeem และ Burn ใน _withdrawFulcrum() ดังนั้นเราต้องให้
ก่อตั้งขึ้นซึ่งการดำเนินการของข้อเสนอแนะ ():
ผู้โจมตีจัดการ newProvider โดยควบคุมค่าส่งคืนของ IIEarnManager(apr).recommend(token) เป็น 0:
จะทำให้ทั้งหมดเป็น 0 ได้อย่างไร ค่าส่งกลับของฟังก์ชันนี้เกี่ยวข้องกับ APR ที่คำนวณในแต่ละ DeFi เนื่องจากไม่มีพูลใน Compound, bZx และ dydx คุณจึงต้องควบคุม Aave เท่านั้น (Aave: Lending Pool Core V1) :
เพื่อให้ส่งคืนค่า 0 ค่าส่งคืนแรกของฟังก์ชัน apr.calculateInterestRates จะต้องเป็น 0:
_totalBorrowsVariable คือ 0 นั่นคือ Aave: Lending Pool Core V1 ไม่มีหนี้ใดๆ ในขณะนี้ เพื่อให้บรรลุเงื่อนไขนี้ ผู้โจมตีจะต้องชำระหนี้ของทุกคนในกลุ่ม:
สรุป
สาเหตุหลักของเหตุการณ์การโจมตี Yearn คือข้อผิดพลาดในการกำหนดค่าโดยฝ่ายโครงการ ผู้โจมตีใช้ประโยชน์จากช่องโหว่ด้วยวิธีต่างๆ มากมาย และลงเอยด้วยผลกำไรประมาณ 10 ล้านดอลลาร์
เกี่ยวกับเรา
At Eocene Research, we provide the insights of intentions and security behind everything you know or don't know of blockchain, and empower every individual and organization to answer complex questions we hadn't even dreamed of back then.
