เมื่อวันที่ 15 พฤษภาคม พ.ศ. 2024 Sonne Finance ประสบกับการโจมตีห่วงโซ่การมองโลกในแง่ดีซึ่งส่งผลให้เกิดความสูญเสียสูงถึง 20 ล้านดอลลาร์ หลังจากการโจมตี ผู้ใช้ Twitter @tonyke_bot ทวีตว่าพวกเขาปกป้องส่วนที่เหลืออีก 6.5 ล้านดอลลาร์ในกลุ่มหลักประกันของ Sonne Finance (หรือที่เรียกว่าตลาด คล้ายกับ cToken in Compound) ด้วยเงินประมาณ 100 ดอลลาร์
(https://twitter.com/tonyke_bot/status/1790547461611860182)
เมื่อค้นพบการโจมตีทีม Sonne Finance ได้หยุดตลาดทั้งหมดอย่างรวดเร็วในแง่ดีและระบุว่าตลาดบน Base มีความปลอดภัย
(https://twitter.com/SonneFinance/status/1790535383005966554)
Sonne Finance เป็นโปรโตคอลการให้กู้ยืมแบบกระจายอํานาจที่แยก Compound V2 เกี่ยวกับการมองโลกในแง่ดีโดยให้บุคคลสถาบันและโปรโตคอลสามารถเข้าถึงบริการทางการเงินได้ โปรโตคอล Sonne Finance รวบรวมสินทรัพย์โทเค็นของผู้ใช้เพื่อสร้างกลุ่มสภาพคล่องการให้กู้ยืมโดยให้ผู้ใช้มีธุรกิจการให้กู้ยืมเหมือนธนาคาร เช่นเดียวกับ Compound ผู้เข้าร่วมโปรโตคอลสามารถจํานองโทเค็นของพวกเขาลงในกลุ่มสภาพคล่องการให้กู้ยืมของ Sonne Finance และรับใบรับรอง soToken (เช่นเดียวกับ cToken) SoToken เป็นใบรับรองสินทรัพย์ที่มีดอกเบี้ยซึ่งจะสร้างรายได้จํานวนหนึ่งเมื่อบล็อกดําเนินไปและจะได้รับสิ่งจูงใจโทเค็น SONE ด้วย ผู้เข้าร่วมยังสามารถยืมโทเค็นอื่น ๆ จากกลุ่มสินทรัพย์การให้กู้ยืม Sonne ด้วย soToken ในมือของพวกเขา ตัวอย่างเช่นผู้เข้าร่วมสามารถจํานอง USDC จํานวนหนึ่งเพื่อรับใบรับรอง soUSDC จากนั้นให้ยืม WETH เพื่อหมุนเวียนต่อไป การให้กู้ยืมจํานองในโปรโตคอล Sonne Finance อาจเป็นความสัมพันธ์ระหว่างสินทรัพย์แบบกลุ่มต่อกลุ่ม ในระหว่างกระบวนการให้กู้ยืมจํานองโปรโตคอลจะคํานวณปัจจัยด้านสุขภาพ (ปัจจัยด้านสุขภาพ) ของที่อยู่ของผู้เข้าร่วมโดยอัตโนมัติ เมื่อปัจจัยด้านสุขภาพต่ํากว่า 1 การจํานองที่อยู่ผลิตภัณฑ์จะสนับสนุนการชําระบัญชีและผู้ชําระบัญชียังสามารถได้รับรางวัลการชําระบัญชีบางอย่าง
ความสัมพันธ์ระหว่างจํานวนโทเค็นอ้างอิงที่ฝากโดยผู้ใช้และ soTokens ที่สร้างขึ้นส่วนใหญ่เกี่ยวข้องกับตัวแปรที่เรียกว่า exchangeRate ตัวแปรนี้สามารถใช้คร่าวๆ เพื่อระบุจํานวนโทเค็นอ้างอิงแต่ละโทเค็นที่มีมูลค่า สูตรการคํานวณสําหรับ exchangeRate มีดังนี้:
ในสูตรข้างต้น totalCash หมายถึงจํานวนโทเค็นอ้างอิงที่ถือโดย soToken, totalBorrows หมายถึงจํานวนโทเค็นอ้างอิงที่ให้ยืมในตลาดบางแห่ง totalReserves หมายถึงจํานวนเงินสํารองทั้งหมด (รวมถึงดอกเบี้ยที่จ่ายโดยผู้กู้) totalSupply หมายถึงจํานวน soToken ที่สร้างขึ้น
เมื่อแลกผู้ใช้สามารถระบุจํานวนโทเค็นอ้างอิงที่ต้องการแลก redeemAmount เพื่อคํานวณจํานวน soTokens ที่ต้องถูกทําลาย redeemTokens วิธีการคํานวณคร่าวๆ คือ "redeemTokens = redeemAmount / exchangeRat" โปรดทราบว่าไม่มีการสูญเสียความแม่นยําที่นี่ จัดการกับ.
สาระสําคัญของการโจมตีนี้คือเมื่อตลาด (soToken) ถูกสร้างขึ้นผู้โจมตีดําเนินการหล่อจํานองครั้งแรกและสร้าง soTokens น้อยมากด้วยโทเค็นอ้างอิงจํานวนเล็กน้อยส่งผลให้มูลค่า "totalSupply" ของ soToken มีขนาดเล็กเกินไป จากนั้นผู้โจมตีใช้ประโยชน์จากช่องโหว่ของการสูญเสียความแม่นยําของสัญญา Solidity จากนั้นส่งโทเค็นอ้างอิงโดยตรงไปยังสัญญา soToken (soToken จะไม่ถูกสร้างซึ่งหมายความว่า "totalSupply" ยังคงไม่เปลี่ยนแปลงและ "totalCash" มีขนาดใหญ่ขึ้น) แทนการปักหลัก + วิธีการหล่อเพื่อฝากโทเค็นอ้างอิง การดําเนินการดังกล่าวทําให้ตัวแปร "totalCash" ในสัญญามีขนาดใหญ่ขึ้น แต่ "totalSupply" ยังคงไม่เปลี่ยนแปลงทําให้อัตราแลกเปลี่ยนมีขนาดใหญ่ขึ้น ในท้ายที่สุดเมื่อผู้โจมตีแลกโทเค็นอ้างอิง soToken ที่ต้องถูกทําลายจะน้อยกว่า soToken ที่สร้างขึ้นในระหว่างการจํานอง ผู้โจมตีใช้ soToken ที่ได้รับเพื่อให้ยืมโทเค็นอ้างอิง WETH และ USDC ไปยัง soTokens อื่น ๆ (เช่น soWETH, soUSDC) และในที่สุดก็ได้รับผลกําไรสูงถึง 20 ล้านเหรียญสหรัฐ
การเตรียมการโจมตี:
โจมตีธุรกรรมที่ทํากําไร:
โจมตีที่อยู่ที่เกี่ยวข้องกับ EOA:
0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43
ที่อยู่ที่เกี่ยวข้องกับผู้โจมตี (สัญญา):
0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8
0x02fa2625825917e9b1f8346a465de1bbc150c5b9
โทเค็นอ้างอิง (VELO Token V2):
0x9560e827af36c94d2ac33a39bce1fe78631088db
สัญญาช่องโหว่ (soVELO คล้ายกับ cToken ของ Compound):
0xe3b81318b1b6776f0877c3770afddff97b9f5fe5
@tonyke_bot ธุรกรรมช่วยเหลือผู้ใช้บน X:
ทีมโครงการ Sonne Finance เพิ่งผ่านข้อเสนอเพื่อเพิ่มตลาด VELO ให้กับ Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044) และจัดธุรกรรมห้ารายการผ่านกระเป๋าเงินหลายลายเซ็นที่จะดําเนินการในอีกสองวันต่อมา ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7) ธุรกรรมทั้งห้านี้ใช้เพื่อสร้างตลาด VELO (สัญญา soVELO) และกําหนดการกําหนดค่าที่สําคัญบางอย่างของตลาด เช่น การกําหนดรูปแบบอัตราดอกเบี้ย การตั้งออราเคิลราคา และการตั้งค่าปัจจัยการจํานอง เป็นต้น หลังจากสร้างตลาด VELO แล้วผู้ใช้สามารถฝากโทเค็น VELO โทเค็นเพื่อสร้างโทเค็น soVELO ซึ่งสามารถใช้เพื่อยืม soTokens อื่น ๆ
ได้ขั้นตอนการเตรียมการโจมตีส่วนใหญ่มีไว้สําหรับผู้โจมตีในการสร้างตลาด VELO (สัญญา soVELO) ตามข้อมูลในข้อเสนอโครงการ Sonne Finance หลังจากระยะเวลาล็อคอินสองวันของข้อเสนอหมดอายุตั้งค่าการกําหนดค่าที่สําคัญและสร้างโทเค็น VELO ลงในสัญญา soVELO โดยการจํานอง โทเค็น soVELO และยังส่งโทเค็น VELO ที่ถือโดยตรงไปยังสัญญา soVELO เพื่อเพิ่มอัตราแลกเปลี่ยนและเตรียม เพื่อผลกําไรจากการโจมตีที่ตามมา
ขั้นตอนเฉพาะมีดังนี้:
หลังจากสิ้นสุดระยะเวลาล็อคอินสองวันผู้โจมตีจะบรรจุการดําเนินการของธุรกรรมสี่รายการแรกที่จัดเรียงในข้อเสนอเป็นธุรกรรมเดียว (ธุรกรรม 0x45c0cc) ซึ่งใช้ในการสร้างตลาด VELO (สัญญา soVELO) และตั้งค่าการกําหนดค่าหลัก เมื่อตลาด VELO เริ่มต้นอัตราแลกเปลี่ยนจะถูกตั้งค่าเป็น "200,000,000,000,000,000,000,000,000,000"
ผู้โจมตีเรียกฟังก์ชัน "mint" ของสัญญา soVELO เพื่อฝากโทเค็น VELO และโทเค็น soVELO ของเหรียญกษาปณ์ ผู้โจมตีระบุ "mintAmount" เป็น "400,000,001" (จํานวน VELO โทเค็น) ดังที่เห็นได้จากฟังก์ชัน "exchangeRateStoredInternal" เนื่องจาก "_totalSuppl" ของโทเค็น soVELO คือ 0 ในเวลานี้ exchangeRate คือค่าที่กําหนดไว้ในขั้นตอนที่ 1 ตามสูตร " mintTokens = actualMintAmount / exchangeRate " จํานวนโทเค็น soVELO ที่คํานวณได้ซึ่งควรสร้างในเวลานี้คือ 2 ในระยะสั้นในขั้นตอนนี้ผู้โจมตีจะฝากโทเค็น VELO โทเค็นด้วยมูลค่า "400,000,001" ในสัญญา soVELO และผู้โจมตีจะได้รับโทเค็น soVELO ด้วยมูลค่า 2
com.soVELO.mint:
ผู้โจมตีส่งโทเค็น VELO รายการมูลค่า "2,552,964,259,704,265,837,526" ไปยังสัญญา soVELO โดยส่งโทเค็น VELO ไปยังสัญญา soVELO โดยตรง ในเวลานี้จํานวนโทเค็น VELO ที่ถือโดยสัญญา soVELO เพิ่มขึ้น แต่เนื่องจากไม่มีโทเค็น soVELO ใหม่เหรียญจึงถูกสร้างขึ้นดังนั้น totalSupply ยังคงไม่เปลี่ยนแปลงซึ่งหมายความว่าอัตราแลกเปลี่ยนที่คํานวณตามสูตรการคํานวณอัตราแลกเปลี่ยนจะมีขนาดใหญ่ขึ้นในเวลานี้
ผู้โจมตีโอนโทเค็น soVELO ที่จัดขึ้นหลายครั้งและในที่สุดก็โอนไปยัง 0xae4a EOA โจมตีอื่น
ระยะกําไรจากการโจมตีส่วนใหญ่เกี่ยวข้องกับผู้โจมตีที่ดําเนินธุรกรรมที่ห้าของข้อเสนอและให้ยืมโทเค็น VELO โดยตรงไปยังสัญญา soVELO ผ่านสินเชื่อแฟลชเพื่อเพิ่มอัตราแลกเปลี่ยนต่อไป จากนั้นผู้โจมตีจะใช้โทเค็น soVELO ที่มีค่า 2 ในมือของเขาเพื่อยืมโทเค็นอ้างอิงเช่น WETH และ USDC จากสัญญา soToken อื่น ๆ (เช่น soWETH, soUSDC เป็นต้น) และชิ้นส่วนเหล่านี้จะกลายเป็นกําไรของผู้โจมตี จากนั้นผู้โจมตีก็ไปแลกโทเค็นอ้างอิงของเขาในสัญญา soVELO เนื่องจากการเพิ่มขึ้นของอัตราแลกเปลี่ยนและการสูญเสียความแม่นยําในการคํานวณโทเค็น soVELO ที่ต้องถูกทําลายเพื่อไถ่ถอนในที่สุดผู้โจมตีจึงใช้โทเค็น soVELO ที่มีค่า 1 เท่านั้น โทเค็น VELO ที่ฝากไว้ก่อนหน้านี้เกือบทั้งหมดถูกแลกซึ่งสามารถเข้าใจได้ว่าเป็นผู้โจมตีโดยใช้โทเค็น soVELO พิเศษที่มีค่า 1 เพื่อรับโทเค็นอ้างอิงเช่น WETH และ USDC โดยการยืมจาก soTokens อื่น ๆ ผู้โจมตีใช้เทคนิคเดียวกันในการโจมตีซ้ําหลายครั้งและในที่สุดก็ทํากําไรมหาศาล
ขั้นตอนเฉพาะมีดังนี้:
ผู้โจมตีดําเนินธุรกรรมที่ห้าในข้อเสนอและกําหนดปัจจัยการให้กู้ยืมที่ระบุไว้ในข้อเสนอ
โทเค็น flash-loans VELO ของผู้โจมตีที่มีมูลค่า "35,469,150,965,253,049,864,450,449" จากพูล VolatileV2 AMM - USDC/VELO ซึ่งเรียกใช้ฟังก์ชันเบ็ดของผู้โจมตี ในฟังก์ชั่นเบ็ดผู้โจมตียังคงดําเนินการโจมตีต่อไป
ผู้โจมตีส่งโทเค็น VELO ที่เขาถือไว้ในสัญญา soVELO เพื่อเพิ่มอัตราแลกเปลี่ยนต่อไป ปัจจุบันมีโทเค็นทั้งหมด VELO โทเค็นที่มีมูลค่า "35,471,703,929,512,754,530,287,976" ในสัญญา soVELO (ผลรวมของโทเค็น VELO ที่ผู้โจมตีโอนสามครั้ง)
ผู้โจมตีสร้าง 0xa16388a6210545b27f669d5189648c1722300b8b สัญญาใหม่ ในตัวสร้างเขาโอนโทเค็น soVELO 2 โทเค็นที่เขาถือไว้กับสัญญาที่สร้างขึ้นใหม่ 0xa163 (ต่อไปนี้จะเรียกว่า 0xa163 ผู้โจมตี)
ผู้โจมตี 0xa163 ใช้โทเค็น soVELO ที่เขาถือไว้เพื่อยืม WETH ด้วยมูลค่า "265,842,857,910,985,546,929" จาก soWETH
ผู้โจมตี 0xa163 เรียกฟังก์ชัน "redeemUnderlying" ของ soVELO โดยระบุมูลค่าของโทเค็น VELO ที่แลกแล้วเป็น "35,471,603,929,512,754,530,287,976" (เกือบเท่ากับจํานวนโทเค็น VELO ที่ผู้โจมตีได้โอนหรือจํานองไว้ในสัญญา soVELO ก่อนหน้านี้) ในเวลานี้จําเป็นต้องใช้สูตร "redeemTokens = redeemAmountIn / exchangeRate" เพื่อคํานวณจํานวนโทเค็น soVELO ที่ต้องถูกทําลายเพื่อไถ่ถอน
ดังที่เห็นได้จากฟังก์ชัน "exchangeRateStoredInternal" เนื่องจาก _totalSupply เป็น 2 แทนที่จะเป็น 0 จึงต้องคํานวณมูลค่าของอัตราแลกเปลี่ยน ตามสูตร "อัตราแลกเปลี่ยน = (totalCash + totalBorrows - totalReserves) / totalSupply" อัตราแลกเปลี่ยนปัจจุบันคือ "17,735,851,964,756,377,265,143,988,000,0 00,000,000,000,000,000 " มูลค่านี้ใหญ่กว่าอัตราแลกเปลี่ยนเริ่มต้น "200,000,000,000,000,000,000,000,000,000,000"
มูลค่าของ " redeemTokens " คํานวณตามอัตราแลกเปลี่ยนใหม่คือ " 1.99 " เนื่องจากลักษณะการปัดเศษลงของ Solidity มูลค่าของ " redeemTokens " จึงกลายเป็น 1 ซึ่งหมายความว่าผู้โจมตี 0xa163 ใช้โทเค็น soVELO ที่มีค่า 1 เพื่อแลกโทเค็น VELO เกือบทั้งหมดที่ฝากไว้ก่อนหน้านี้ ในขณะเดียวกันผู้โจมตี 0xa163 ยังได้รับ WETH ด้วยมูลค่า "265,842,857,910,985,546,929" ยืมจาก soWETH
soVELO.redeem บริการอ้างอิง:
com.soVELO.exchangeRateStoredInternal:
ผู้โจมตี 0xa163 โอน WETH ที่ยืมมาทั้งหมดและแลกโทเค็น VELO ไปยังผู้โจมตีระดับบนแล้วทําลายตัวเอง
ผู้โจมตีเรียกฟังก์ชัน "liquidateBorrow" ของ soWETH เพื่อชําระบัญชีสินทรัพย์บางส่วนที่ยืมมาจาก 0xa163 สัญญาที่สร้างขึ้นใหม่เพื่อรับโทเค็น soVELO ที่ถูกล็อคด้วยมูลค่า 1 ปัจจุบันผู้โจมตีถือโทเค็น soVELO ที่มีค่า 1 เท่านั้น
ผู้โจมตีเรียกฟังก์ชัน "mint" ของ soVELO และจํานองและเหรียญกษาปณ์โทเค็น soVELO อีกครั้งโดยมีวัตถุประสงค์เพื่อรวบรวมโทเค็น soVELO ให้เพียงพอด้วยมูลค่า 2 จากนั้นทําตามขั้นตอนที่ 3-8 ข้างต้นอีกครั้งเพื่อทํากําไรจากโทเค็นอื่น ๆ ที่ไม่แน่นอน
ผู้โจมตีดําเนินการในขั้นตอนที่ 9 หลายครั้งชําระคืนเงินกู้แฟลชและออกจากตลาดด้วยผลกําไร
After the attack, user @tonyke_bot on X minted 0.00000011 soVELO by staking 1144 VELO tokens into the soVELO contract in transaction 0x0a284cd. เหตุผลที่การดําเนินการนี้สามารถป้องกันไม่ให้ผู้โจมตีโจมตีเพิ่มเติมได้เนื่องจากธุรกรรมนี้เปลี่ยนขนาดของ totalSupply ใน soVELO และจํานวนโทเค็น VELO totalCash ที่ถืออยู่และผลกระทบของการเติบโตของ totalSupply ต่อการคํานวณอัตราแลกเปลี่ยนนั้นมากกว่าผลกระทบของการเติบโตของ totalCash ดังนั้นอัตราแลกเปลี่ยนจึงมีขนาดเล็กลงทําให้ผู้โจมตีไม่สามารถใช้การสูญเสียความแม่นยําเพื่อรับ soVELO เมื่อทําการโจมตีได้อีกต่อไปทําให้การโจมตีไม่สามารถทําได้อีกต่อไป
ผู้โจมตีโอนเงินไม่นานหลังจากคว้าเงินที่ผิดกฎหมาย เงินส่วนใหญ่ถูกโอนไปยังที่อยู่สี่แห่งต่อไปนี้ บางคนต้องเปลี่ยนที่อยู่เพื่อโจมตีต่อไปและบางคนก็ฟอกเงิน:
1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d
ผู้โจมตีโอน 198 WETH ไปยังที่อยู่นี้จากนั้นที่อยู่ใช้วิธีการโจมตีเดียวกันเพื่อให้ได้กําไรที่ผิดกฎหมายในธุรกรรมต่อไปนี้:
หลังจากการโจมตีที่อยู่จะโอนผลประโยชน์ที่ผิดกฎหมายดังกล่าวข้างต้นไปยัง 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
ผู้โจมตีโอน 724277 USDC และ 2353 VELO ไปยังที่อยู่นี้และแลกเปลี่ยน USDC เป็น Ether จากนั้นเงินบางส่วนก็ถูกโอนไปยังสะพานข้ามโซ่สตาร์เกตทันที เงินที่ผิดกฎหมายส่วนใหญ่ยังคงอยู่ที่ที่อยู่นี้:
3、0xbd18100a168321701955e348f03d0df4f517c13b
ผู้โจมตีโอน 33 WETH ไปยังที่อยู่นี้และใช้โซ่ปอกเปลือกเพื่อพยายามฟอกเงิน ลิงค์การฟอกเงินมีดังนี้:
0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。
4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770
ผู้โจมตีโอน 563 WETH ไปยังที่อยู่นี้และต่อมาเป็น 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68 โดยไม่มีการดําเนินการเพิ่มเติม
วิธีการฟอกเงินของผู้โจมตีในครั้งนี้ค่อนข้างเป็นมืออาชีพและวิธีการแสดงแนวโน้มของความหลากหลาย ดังนั้นสําหรับเราผู้เข้าร่วม Web3 เราต้องปรับปรุงความสามารถในการต่อต้านการฟอกเงินของเราในแง่ของความปลอดภัยและปรับปรุงความปลอดภัยของโครงการ Defi ผ่าน KYT, AML และผลิตภัณฑ์รักษาความปลอดภัยการทําธุรกรรมบล็อกเชนอื่น ๆ ที่เกี่ยวข้อง
1、ติดตามข่าวสารล่าสุดเกี่ยวกับการตรวจสอบและทดสอบสัญญา ดําเนินการตรวจสอบที่ครอบคลุมก่อนการปรับใช้สัญญาอัจฉริยะโดยให้ความสนใจเป็นพิเศษกับทุกส่วนที่เกี่ยวข้องกับการคํานวณทางการเงิน ขั้นแรกให้ใช้การทดสอบอัตโนมัติและใช้ประโยชน์จากการอัปเดตไลบรารีช่องโหว่แบบเรียลไทม์เพื่อทําการสแกนความปลอดภัยของสัญญาที่มีประสิทธิภาพ (อุตสาหกรรมยังค่อยๆเปิดแหล่งเครื่องมือตรวจสอบความปลอดภัยที่เป็นผู้ใหญ่รวมถึง ZAN AI SCAN) ในขณะที่รวมการตรวจสอบด้วยตนเองเพื่อแก้ไขปัญหาที่ต้องใช้ความรู้เชิงลึกในอุตสาหกรรม
2、การสูญเสียความแม่นยําจะต้องดําเนินการอย่างจริงจัง ปัญหาด้านความปลอดภัยที่เกิดจากการสูญเสียความแม่นยํานั้นไม่มีที่สิ้นสุดโดยเฉพาะอย่างยิ่งในโครงการ Defi ซึ่งการสูญเสียความแม่นยํามักนําไปสู่การสูญเสียทางการเงินที่ร้ายแรง ขอแนะนําให้ฝ่ายโครงการและผู้ตรวจสอบความปลอดภัยตรวจสอบรหัสอย่างรอบคอบด้วยการสูญเสียความแม่นยําในโครงการและทําการทดสอบเพื่อหลีกเลี่ยงช่องโหว่นี้ให้มากที่สุด
ขอแนะนําให้สร้างตลาดที่คล้ายกับ cToken ใน Compound และการดําเนินการหล่อจํานองครั้งแรกจะดําเนินการโดยผู้ใช้ที่มีสิทธิพิเศษเพื่อหลีกเลี่ยงการถูกจัดการโดยผู้โจมตีและจัดการอัตราแลกเปลี่ยน
เมื่อมีตัวแปรสําคัญในสัญญาที่ขึ้นอยู่กับมูลค่าของ " this.balance " หรือ " token.balanceOf() " คุณต้องพิจารณาเงื่อนไขสําหรับการเปลี่ยนแปลงตัวแปรหลักอย่างรอบคอบเช่นอนุญาตให้โอนสกุลเงินพื้นเมืองหรือโทเค็นไปยังสัญญาโดยตรงหรือไม่ วิธีการเปลี่ยนค่าของตัวแปรหรือสามารถเปลี่ยนค่าของตัวแปรได้โดยการเรียกฟังก์ชันเฉพาะเท่านั้น
เมื่อวันที่ 15 พฤษภาคม พ.ศ. 2024 Sonne Finance ประสบกับการโจมตีห่วงโซ่การมองโลกในแง่ดีซึ่งส่งผลให้เกิดความสูญเสียสูงถึง 20 ล้านดอลลาร์ หลังจากการโจมตี ผู้ใช้ Twitter @tonyke_bot ทวีตว่าพวกเขาปกป้องส่วนที่เหลืออีก 6.5 ล้านดอลลาร์ในกลุ่มหลักประกันของ Sonne Finance (หรือที่เรียกว่าตลาด คล้ายกับ cToken in Compound) ด้วยเงินประมาณ 100 ดอลลาร์
(https://twitter.com/tonyke_bot/status/1790547461611860182)
เมื่อค้นพบการโจมตีทีม Sonne Finance ได้หยุดตลาดทั้งหมดอย่างรวดเร็วในแง่ดีและระบุว่าตลาดบน Base มีความปลอดภัย
(https://twitter.com/SonneFinance/status/1790535383005966554)
Sonne Finance เป็นโปรโตคอลการให้กู้ยืมแบบกระจายอํานาจที่แยก Compound V2 เกี่ยวกับการมองโลกในแง่ดีโดยให้บุคคลสถาบันและโปรโตคอลสามารถเข้าถึงบริการทางการเงินได้ โปรโตคอล Sonne Finance รวบรวมสินทรัพย์โทเค็นของผู้ใช้เพื่อสร้างกลุ่มสภาพคล่องการให้กู้ยืมโดยให้ผู้ใช้มีธุรกิจการให้กู้ยืมเหมือนธนาคาร เช่นเดียวกับ Compound ผู้เข้าร่วมโปรโตคอลสามารถจํานองโทเค็นของพวกเขาลงในกลุ่มสภาพคล่องการให้กู้ยืมของ Sonne Finance และรับใบรับรอง soToken (เช่นเดียวกับ cToken) SoToken เป็นใบรับรองสินทรัพย์ที่มีดอกเบี้ยซึ่งจะสร้างรายได้จํานวนหนึ่งเมื่อบล็อกดําเนินไปและจะได้รับสิ่งจูงใจโทเค็น SONE ด้วย ผู้เข้าร่วมยังสามารถยืมโทเค็นอื่น ๆ จากกลุ่มสินทรัพย์การให้กู้ยืม Sonne ด้วย soToken ในมือของพวกเขา ตัวอย่างเช่นผู้เข้าร่วมสามารถจํานอง USDC จํานวนหนึ่งเพื่อรับใบรับรอง soUSDC จากนั้นให้ยืม WETH เพื่อหมุนเวียนต่อไป การให้กู้ยืมจํานองในโปรโตคอล Sonne Finance อาจเป็นความสัมพันธ์ระหว่างสินทรัพย์แบบกลุ่มต่อกลุ่ม ในระหว่างกระบวนการให้กู้ยืมจํานองโปรโตคอลจะคํานวณปัจจัยด้านสุขภาพ (ปัจจัยด้านสุขภาพ) ของที่อยู่ของผู้เข้าร่วมโดยอัตโนมัติ เมื่อปัจจัยด้านสุขภาพต่ํากว่า 1 การจํานองที่อยู่ผลิตภัณฑ์จะสนับสนุนการชําระบัญชีและผู้ชําระบัญชียังสามารถได้รับรางวัลการชําระบัญชีบางอย่าง
ความสัมพันธ์ระหว่างจํานวนโทเค็นอ้างอิงที่ฝากโดยผู้ใช้และ soTokens ที่สร้างขึ้นส่วนใหญ่เกี่ยวข้องกับตัวแปรที่เรียกว่า exchangeRate ตัวแปรนี้สามารถใช้คร่าวๆ เพื่อระบุจํานวนโทเค็นอ้างอิงแต่ละโทเค็นที่มีมูลค่า สูตรการคํานวณสําหรับ exchangeRate มีดังนี้:
ในสูตรข้างต้น totalCash หมายถึงจํานวนโทเค็นอ้างอิงที่ถือโดย soToken, totalBorrows หมายถึงจํานวนโทเค็นอ้างอิงที่ให้ยืมในตลาดบางแห่ง totalReserves หมายถึงจํานวนเงินสํารองทั้งหมด (รวมถึงดอกเบี้ยที่จ่ายโดยผู้กู้) totalSupply หมายถึงจํานวน soToken ที่สร้างขึ้น
เมื่อแลกผู้ใช้สามารถระบุจํานวนโทเค็นอ้างอิงที่ต้องการแลก redeemAmount เพื่อคํานวณจํานวน soTokens ที่ต้องถูกทําลาย redeemTokens วิธีการคํานวณคร่าวๆ คือ "redeemTokens = redeemAmount / exchangeRat" โปรดทราบว่าไม่มีการสูญเสียความแม่นยําที่นี่ จัดการกับ.
สาระสําคัญของการโจมตีนี้คือเมื่อตลาด (soToken) ถูกสร้างขึ้นผู้โจมตีดําเนินการหล่อจํานองครั้งแรกและสร้าง soTokens น้อยมากด้วยโทเค็นอ้างอิงจํานวนเล็กน้อยส่งผลให้มูลค่า "totalSupply" ของ soToken มีขนาดเล็กเกินไป จากนั้นผู้โจมตีใช้ประโยชน์จากช่องโหว่ของการสูญเสียความแม่นยําของสัญญา Solidity จากนั้นส่งโทเค็นอ้างอิงโดยตรงไปยังสัญญา soToken (soToken จะไม่ถูกสร้างซึ่งหมายความว่า "totalSupply" ยังคงไม่เปลี่ยนแปลงและ "totalCash" มีขนาดใหญ่ขึ้น) แทนการปักหลัก + วิธีการหล่อเพื่อฝากโทเค็นอ้างอิง การดําเนินการดังกล่าวทําให้ตัวแปร "totalCash" ในสัญญามีขนาดใหญ่ขึ้น แต่ "totalSupply" ยังคงไม่เปลี่ยนแปลงทําให้อัตราแลกเปลี่ยนมีขนาดใหญ่ขึ้น ในท้ายที่สุดเมื่อผู้โจมตีแลกโทเค็นอ้างอิง soToken ที่ต้องถูกทําลายจะน้อยกว่า soToken ที่สร้างขึ้นในระหว่างการจํานอง ผู้โจมตีใช้ soToken ที่ได้รับเพื่อให้ยืมโทเค็นอ้างอิง WETH และ USDC ไปยัง soTokens อื่น ๆ (เช่น soWETH, soUSDC) และในที่สุดก็ได้รับผลกําไรสูงถึง 20 ล้านเหรียญสหรัฐ
การเตรียมการโจมตี:
โจมตีธุรกรรมที่ทํากําไร:
โจมตีที่อยู่ที่เกี่ยวข้องกับ EOA:
0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43
ที่อยู่ที่เกี่ยวข้องกับผู้โจมตี (สัญญา):
0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8
0x02fa2625825917e9b1f8346a465de1bbc150c5b9
โทเค็นอ้างอิง (VELO Token V2):
0x9560e827af36c94d2ac33a39bce1fe78631088db
สัญญาช่องโหว่ (soVELO คล้ายกับ cToken ของ Compound):
0xe3b81318b1b6776f0877c3770afddff97b9f5fe5
@tonyke_bot ธุรกรรมช่วยเหลือผู้ใช้บน X:
ทีมโครงการ Sonne Finance เพิ่งผ่านข้อเสนอเพื่อเพิ่มตลาด VELO ให้กับ Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044) และจัดธุรกรรมห้ารายการผ่านกระเป๋าเงินหลายลายเซ็นที่จะดําเนินการในอีกสองวันต่อมา ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7) ธุรกรรมทั้งห้านี้ใช้เพื่อสร้างตลาด VELO (สัญญา soVELO) และกําหนดการกําหนดค่าที่สําคัญบางอย่างของตลาด เช่น การกําหนดรูปแบบอัตราดอกเบี้ย การตั้งออราเคิลราคา และการตั้งค่าปัจจัยการจํานอง เป็นต้น หลังจากสร้างตลาด VELO แล้วผู้ใช้สามารถฝากโทเค็น VELO โทเค็นเพื่อสร้างโทเค็น soVELO ซึ่งสามารถใช้เพื่อยืม soTokens อื่น ๆ
ได้ขั้นตอนการเตรียมการโจมตีส่วนใหญ่มีไว้สําหรับผู้โจมตีในการสร้างตลาด VELO (สัญญา soVELO) ตามข้อมูลในข้อเสนอโครงการ Sonne Finance หลังจากระยะเวลาล็อคอินสองวันของข้อเสนอหมดอายุตั้งค่าการกําหนดค่าที่สําคัญและสร้างโทเค็น VELO ลงในสัญญา soVELO โดยการจํานอง โทเค็น soVELO และยังส่งโทเค็น VELO ที่ถือโดยตรงไปยังสัญญา soVELO เพื่อเพิ่มอัตราแลกเปลี่ยนและเตรียม เพื่อผลกําไรจากการโจมตีที่ตามมา
ขั้นตอนเฉพาะมีดังนี้:
หลังจากสิ้นสุดระยะเวลาล็อคอินสองวันผู้โจมตีจะบรรจุการดําเนินการของธุรกรรมสี่รายการแรกที่จัดเรียงในข้อเสนอเป็นธุรกรรมเดียว (ธุรกรรม 0x45c0cc) ซึ่งใช้ในการสร้างตลาด VELO (สัญญา soVELO) และตั้งค่าการกําหนดค่าหลัก เมื่อตลาด VELO เริ่มต้นอัตราแลกเปลี่ยนจะถูกตั้งค่าเป็น "200,000,000,000,000,000,000,000,000,000"
ผู้โจมตีเรียกฟังก์ชัน "mint" ของสัญญา soVELO เพื่อฝากโทเค็น VELO และโทเค็น soVELO ของเหรียญกษาปณ์ ผู้โจมตีระบุ "mintAmount" เป็น "400,000,001" (จํานวน VELO โทเค็น) ดังที่เห็นได้จากฟังก์ชัน "exchangeRateStoredInternal" เนื่องจาก "_totalSuppl" ของโทเค็น soVELO คือ 0 ในเวลานี้ exchangeRate คือค่าที่กําหนดไว้ในขั้นตอนที่ 1 ตามสูตร " mintTokens = actualMintAmount / exchangeRate " จํานวนโทเค็น soVELO ที่คํานวณได้ซึ่งควรสร้างในเวลานี้คือ 2 ในระยะสั้นในขั้นตอนนี้ผู้โจมตีจะฝากโทเค็น VELO โทเค็นด้วยมูลค่า "400,000,001" ในสัญญา soVELO และผู้โจมตีจะได้รับโทเค็น soVELO ด้วยมูลค่า 2
com.soVELO.mint:
ผู้โจมตีส่งโทเค็น VELO รายการมูลค่า "2,552,964,259,704,265,837,526" ไปยังสัญญา soVELO โดยส่งโทเค็น VELO ไปยังสัญญา soVELO โดยตรง ในเวลานี้จํานวนโทเค็น VELO ที่ถือโดยสัญญา soVELO เพิ่มขึ้น แต่เนื่องจากไม่มีโทเค็น soVELO ใหม่เหรียญจึงถูกสร้างขึ้นดังนั้น totalSupply ยังคงไม่เปลี่ยนแปลงซึ่งหมายความว่าอัตราแลกเปลี่ยนที่คํานวณตามสูตรการคํานวณอัตราแลกเปลี่ยนจะมีขนาดใหญ่ขึ้นในเวลานี้
ผู้โจมตีโอนโทเค็น soVELO ที่จัดขึ้นหลายครั้งและในที่สุดก็โอนไปยัง 0xae4a EOA โจมตีอื่น
ระยะกําไรจากการโจมตีส่วนใหญ่เกี่ยวข้องกับผู้โจมตีที่ดําเนินธุรกรรมที่ห้าของข้อเสนอและให้ยืมโทเค็น VELO โดยตรงไปยังสัญญา soVELO ผ่านสินเชื่อแฟลชเพื่อเพิ่มอัตราแลกเปลี่ยนต่อไป จากนั้นผู้โจมตีจะใช้โทเค็น soVELO ที่มีค่า 2 ในมือของเขาเพื่อยืมโทเค็นอ้างอิงเช่น WETH และ USDC จากสัญญา soToken อื่น ๆ (เช่น soWETH, soUSDC เป็นต้น) และชิ้นส่วนเหล่านี้จะกลายเป็นกําไรของผู้โจมตี จากนั้นผู้โจมตีก็ไปแลกโทเค็นอ้างอิงของเขาในสัญญา soVELO เนื่องจากการเพิ่มขึ้นของอัตราแลกเปลี่ยนและการสูญเสียความแม่นยําในการคํานวณโทเค็น soVELO ที่ต้องถูกทําลายเพื่อไถ่ถอนในที่สุดผู้โจมตีจึงใช้โทเค็น soVELO ที่มีค่า 1 เท่านั้น โทเค็น VELO ที่ฝากไว้ก่อนหน้านี้เกือบทั้งหมดถูกแลกซึ่งสามารถเข้าใจได้ว่าเป็นผู้โจมตีโดยใช้โทเค็น soVELO พิเศษที่มีค่า 1 เพื่อรับโทเค็นอ้างอิงเช่น WETH และ USDC โดยการยืมจาก soTokens อื่น ๆ ผู้โจมตีใช้เทคนิคเดียวกันในการโจมตีซ้ําหลายครั้งและในที่สุดก็ทํากําไรมหาศาล
ขั้นตอนเฉพาะมีดังนี้:
ผู้โจมตีดําเนินธุรกรรมที่ห้าในข้อเสนอและกําหนดปัจจัยการให้กู้ยืมที่ระบุไว้ในข้อเสนอ
โทเค็น flash-loans VELO ของผู้โจมตีที่มีมูลค่า "35,469,150,965,253,049,864,450,449" จากพูล VolatileV2 AMM - USDC/VELO ซึ่งเรียกใช้ฟังก์ชันเบ็ดของผู้โจมตี ในฟังก์ชั่นเบ็ดผู้โจมตียังคงดําเนินการโจมตีต่อไป
ผู้โจมตีส่งโทเค็น VELO ที่เขาถือไว้ในสัญญา soVELO เพื่อเพิ่มอัตราแลกเปลี่ยนต่อไป ปัจจุบันมีโทเค็นทั้งหมด VELO โทเค็นที่มีมูลค่า "35,471,703,929,512,754,530,287,976" ในสัญญา soVELO (ผลรวมของโทเค็น VELO ที่ผู้โจมตีโอนสามครั้ง)
ผู้โจมตีสร้าง 0xa16388a6210545b27f669d5189648c1722300b8b สัญญาใหม่ ในตัวสร้างเขาโอนโทเค็น soVELO 2 โทเค็นที่เขาถือไว้กับสัญญาที่สร้างขึ้นใหม่ 0xa163 (ต่อไปนี้จะเรียกว่า 0xa163 ผู้โจมตี)
ผู้โจมตี 0xa163 ใช้โทเค็น soVELO ที่เขาถือไว้เพื่อยืม WETH ด้วยมูลค่า "265,842,857,910,985,546,929" จาก soWETH
ผู้โจมตี 0xa163 เรียกฟังก์ชัน "redeemUnderlying" ของ soVELO โดยระบุมูลค่าของโทเค็น VELO ที่แลกแล้วเป็น "35,471,603,929,512,754,530,287,976" (เกือบเท่ากับจํานวนโทเค็น VELO ที่ผู้โจมตีได้โอนหรือจํานองไว้ในสัญญา soVELO ก่อนหน้านี้) ในเวลานี้จําเป็นต้องใช้สูตร "redeemTokens = redeemAmountIn / exchangeRate" เพื่อคํานวณจํานวนโทเค็น soVELO ที่ต้องถูกทําลายเพื่อไถ่ถอน
ดังที่เห็นได้จากฟังก์ชัน "exchangeRateStoredInternal" เนื่องจาก _totalSupply เป็น 2 แทนที่จะเป็น 0 จึงต้องคํานวณมูลค่าของอัตราแลกเปลี่ยน ตามสูตร "อัตราแลกเปลี่ยน = (totalCash + totalBorrows - totalReserves) / totalSupply" อัตราแลกเปลี่ยนปัจจุบันคือ "17,735,851,964,756,377,265,143,988,000,0 00,000,000,000,000,000 " มูลค่านี้ใหญ่กว่าอัตราแลกเปลี่ยนเริ่มต้น "200,000,000,000,000,000,000,000,000,000,000"
มูลค่าของ " redeemTokens " คํานวณตามอัตราแลกเปลี่ยนใหม่คือ " 1.99 " เนื่องจากลักษณะการปัดเศษลงของ Solidity มูลค่าของ " redeemTokens " จึงกลายเป็น 1 ซึ่งหมายความว่าผู้โจมตี 0xa163 ใช้โทเค็น soVELO ที่มีค่า 1 เพื่อแลกโทเค็น VELO เกือบทั้งหมดที่ฝากไว้ก่อนหน้านี้ ในขณะเดียวกันผู้โจมตี 0xa163 ยังได้รับ WETH ด้วยมูลค่า "265,842,857,910,985,546,929" ยืมจาก soWETH
soVELO.redeem บริการอ้างอิง:
com.soVELO.exchangeRateStoredInternal:
ผู้โจมตี 0xa163 โอน WETH ที่ยืมมาทั้งหมดและแลกโทเค็น VELO ไปยังผู้โจมตีระดับบนแล้วทําลายตัวเอง
ผู้โจมตีเรียกฟังก์ชัน "liquidateBorrow" ของ soWETH เพื่อชําระบัญชีสินทรัพย์บางส่วนที่ยืมมาจาก 0xa163 สัญญาที่สร้างขึ้นใหม่เพื่อรับโทเค็น soVELO ที่ถูกล็อคด้วยมูลค่า 1 ปัจจุบันผู้โจมตีถือโทเค็น soVELO ที่มีค่า 1 เท่านั้น
ผู้โจมตีเรียกฟังก์ชัน "mint" ของ soVELO และจํานองและเหรียญกษาปณ์โทเค็น soVELO อีกครั้งโดยมีวัตถุประสงค์เพื่อรวบรวมโทเค็น soVELO ให้เพียงพอด้วยมูลค่า 2 จากนั้นทําตามขั้นตอนที่ 3-8 ข้างต้นอีกครั้งเพื่อทํากําไรจากโทเค็นอื่น ๆ ที่ไม่แน่นอน
ผู้โจมตีดําเนินการในขั้นตอนที่ 9 หลายครั้งชําระคืนเงินกู้แฟลชและออกจากตลาดด้วยผลกําไร
After the attack, user @tonyke_bot on X minted 0.00000011 soVELO by staking 1144 VELO tokens into the soVELO contract in transaction 0x0a284cd. เหตุผลที่การดําเนินการนี้สามารถป้องกันไม่ให้ผู้โจมตีโจมตีเพิ่มเติมได้เนื่องจากธุรกรรมนี้เปลี่ยนขนาดของ totalSupply ใน soVELO และจํานวนโทเค็น VELO totalCash ที่ถืออยู่และผลกระทบของการเติบโตของ totalSupply ต่อการคํานวณอัตราแลกเปลี่ยนนั้นมากกว่าผลกระทบของการเติบโตของ totalCash ดังนั้นอัตราแลกเปลี่ยนจึงมีขนาดเล็กลงทําให้ผู้โจมตีไม่สามารถใช้การสูญเสียความแม่นยําเพื่อรับ soVELO เมื่อทําการโจมตีได้อีกต่อไปทําให้การโจมตีไม่สามารถทําได้อีกต่อไป
ผู้โจมตีโอนเงินไม่นานหลังจากคว้าเงินที่ผิดกฎหมาย เงินส่วนใหญ่ถูกโอนไปยังที่อยู่สี่แห่งต่อไปนี้ บางคนต้องเปลี่ยนที่อยู่เพื่อโจมตีต่อไปและบางคนก็ฟอกเงิน:
1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d
ผู้โจมตีโอน 198 WETH ไปยังที่อยู่นี้จากนั้นที่อยู่ใช้วิธีการโจมตีเดียวกันเพื่อให้ได้กําไรที่ผิดกฎหมายในธุรกรรมต่อไปนี้:
หลังจากการโจมตีที่อยู่จะโอนผลประโยชน์ที่ผิดกฎหมายดังกล่าวข้างต้นไปยัง 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
ผู้โจมตีโอน 724277 USDC และ 2353 VELO ไปยังที่อยู่นี้และแลกเปลี่ยน USDC เป็น Ether จากนั้นเงินบางส่วนก็ถูกโอนไปยังสะพานข้ามโซ่สตาร์เกตทันที เงินที่ผิดกฎหมายส่วนใหญ่ยังคงอยู่ที่ที่อยู่นี้:
3、0xbd18100a168321701955e348f03d0df4f517c13b
ผู้โจมตีโอน 33 WETH ไปยังที่อยู่นี้และใช้โซ่ปอกเปลือกเพื่อพยายามฟอกเงิน ลิงค์การฟอกเงินมีดังนี้:
0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。
4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770
ผู้โจมตีโอน 563 WETH ไปยังที่อยู่นี้และต่อมาเป็น 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68 โดยไม่มีการดําเนินการเพิ่มเติม
วิธีการฟอกเงินของผู้โจมตีในครั้งนี้ค่อนข้างเป็นมืออาชีพและวิธีการแสดงแนวโน้มของความหลากหลาย ดังนั้นสําหรับเราผู้เข้าร่วม Web3 เราต้องปรับปรุงความสามารถในการต่อต้านการฟอกเงินของเราในแง่ของความปลอดภัยและปรับปรุงความปลอดภัยของโครงการ Defi ผ่าน KYT, AML และผลิตภัณฑ์รักษาความปลอดภัยการทําธุรกรรมบล็อกเชนอื่น ๆ ที่เกี่ยวข้อง
1、ติดตามข่าวสารล่าสุดเกี่ยวกับการตรวจสอบและทดสอบสัญญา ดําเนินการตรวจสอบที่ครอบคลุมก่อนการปรับใช้สัญญาอัจฉริยะโดยให้ความสนใจเป็นพิเศษกับทุกส่วนที่เกี่ยวข้องกับการคํานวณทางการเงิน ขั้นแรกให้ใช้การทดสอบอัตโนมัติและใช้ประโยชน์จากการอัปเดตไลบรารีช่องโหว่แบบเรียลไทม์เพื่อทําการสแกนความปลอดภัยของสัญญาที่มีประสิทธิภาพ (อุตสาหกรรมยังค่อยๆเปิดแหล่งเครื่องมือตรวจสอบความปลอดภัยที่เป็นผู้ใหญ่รวมถึง ZAN AI SCAN) ในขณะที่รวมการตรวจสอบด้วยตนเองเพื่อแก้ไขปัญหาที่ต้องใช้ความรู้เชิงลึกในอุตสาหกรรม
2、การสูญเสียความแม่นยําจะต้องดําเนินการอย่างจริงจัง ปัญหาด้านความปลอดภัยที่เกิดจากการสูญเสียความแม่นยํานั้นไม่มีที่สิ้นสุดโดยเฉพาะอย่างยิ่งในโครงการ Defi ซึ่งการสูญเสียความแม่นยํามักนําไปสู่การสูญเสียทางการเงินที่ร้ายแรง ขอแนะนําให้ฝ่ายโครงการและผู้ตรวจสอบความปลอดภัยตรวจสอบรหัสอย่างรอบคอบด้วยการสูญเสียความแม่นยําในโครงการและทําการทดสอบเพื่อหลีกเลี่ยงช่องโหว่นี้ให้มากที่สุด
ขอแนะนําให้สร้างตลาดที่คล้ายกับ cToken ใน Compound และการดําเนินการหล่อจํานองครั้งแรกจะดําเนินการโดยผู้ใช้ที่มีสิทธิพิเศษเพื่อหลีกเลี่ยงการถูกจัดการโดยผู้โจมตีและจัดการอัตราแลกเปลี่ยน
เมื่อมีตัวแปรสําคัญในสัญญาที่ขึ้นอยู่กับมูลค่าของ " this.balance " หรือ " token.balanceOf() " คุณต้องพิจารณาเงื่อนไขสําหรับการเปลี่ยนแปลงตัวแปรหลักอย่างรอบคอบเช่นอนุญาตให้โอนสกุลเงินพื้นเมืองหรือโทเค็นไปยังสัญญาโดยตรงหรือไม่ วิธีการเปลี่ยนค่าของตัวแปรหรือสามารถเปลี่ยนค่าของตัวแปรได้โดยการเรียกฟังก์ชันเฉพาะเท่านั้น