บล็อก

แปลอัตโนมัติ · อ่านเป็นภาษาอังกฤษ

SSO Module 2 - ช่องโหว่ของ Smart Contract: เจาะลึกการโจมตีแบบ Reentrancy

Smart contract ให้ความโปร่งใสแต่ก็มีความเสี่ยง บทความนี้เผยช่องโหว่อย่าง Reentrancy โดยมีกรณี DAO สูญเสีย 150 ล้านดอลลาร์ Integer Overflow ทำให้ BeautyChain สูญเสีย 900 ล้านดอลลาร์ DAOMaker สูญเสีย 4 ล้านดอลลาร์จากข้อบกพร่องด้าน Access Control และ FlashLoan Attacks ทำให้ Harves Finance สูญเสีย 38 ล้านดอลลาร์

โดย Markos Mebellis

SSO Module 2 - ช่องโหว่ของ Smart Contract: เจาะลึกการโจมตีแบบ Reentrancy
ในหน้านี้

Smart contract กำลังปฏิวัติอุตสาหกรรมทั่วโลกด้วยประสิทธิภาพ ความโปร่งใส และคุณสมบัติที่ไม่สามารถเปลี่ยนแปลงได้ แต่การออกแบบที่เปิดกว้างและทำงานอัตโนมัติก็ทำให้เกิดความเสี่ยงเช่นกัน การจะใช้ศักยภาพให้เต็มที่พร้อมลดภัยคุกคามให้น้อยที่สุด จำเป็นต้องเข้าใจช่องโหว่และช่องทางการโจมตีที่เป็นไปได้ การสร้างและดูแลสัญญาเหล่านี้ต้องอาศัยความรอบคอบและการปฏิบัติตามแนวทางที่ดีที่สุด บทความนี้จะเจาะลึกช่องโหว่ที่พบบ่อย พร้อมยกกรณีจริงเพื่อให้เข้าใจง่ายขึ้น มาดูบทความต่อไปนี้จาก Salus Security

ช่องโหว่สำคัญ:

**Reentrancy:** ผู้โจมตีใช้ช่องว่างนี้ในการกลับเข้าสู่ฟังก์ชันก่อนที่การดำเนินการสำคัญจะเสร็จสิ้นหรือค่าจะถูกอัปเดต

Single-Function Reentrancy: เกิดขึ้นเมื่อสัญญาโต้ตอบกับสัญญาที่เป็นอันตราย ทำให้สัญญานั้นกลับเข้าสู่ฟังก์ชันได้ ตัวอย่างเช่น สัญญาอันตรายสามารถกลับเข้าสู่ฟังก์ชัน 'withdrawBalance' ซ้ำ ๆ เพื่อดูด ether เพิ่มก่อนที่ยอดคงเหลือจะถูกอัปเดต

การโจมตีที่สำคัญ:

  • The DAO (2016): หลังจากระดมทุนได้ 150 ล้านดอลลาร์ ถูกแฮกเนื่องจากช่องโหว่ในการเขียนโค้ด ส่งผลให้เครือข่าย Ethereum แยกออกจากกัน
  • PolyDex (2021): สูญเสีย 500,000 ดอลลาร์จากการโจมตีแบบ reentrancy ต่อ PLX Locker Smart Contract
  • Bacon Protocol (2022): สูญเสีย 1 ล้านดอลลาร์จากบั๊ก reentrancy ในฟังก์ชัน lend()
  • Lendf.Me (2020): สูญเสียประมาณ 24.7 ล้านดอลลาร์ในสกุลเงินคริปโตหลายรายการ

**Cross-Function Reentrancy:** เกิดจากสถานะที่ใช้ร่วมกันระหว่างฟังก์ชันต่าง ๆ และการป้องกันการกลับเข้าไม่ดีพอ ตัวอย่าง 'balances' ข้างต้นแสดงว่าแม้ 'withdrawAll' จะมีการป้องกัน ผู้โจมตีก็ยังใช้ประโยชน์จากฟังก์ชัน 'transfer' ได้

เหตุการณ์ที่โด่งดัง:

  • DFX Finance (2022): สูญเสียกว่า 7 ล้านดอลลาร์จากการโจมตีที่ใช้ประโยชน์จากฟังก์ชันที่ไม่มีการป้องกัน reentrancy
  • Hundred Finance (2022): สูญเสียประมาณ 6.5 ล้านดอลลาร์หลังการโจมตีแบบ reentrancy ใช้ประโยชน์จากฟังก์ชัน borrowFresh
  • Fei Protocol (2022): สูญเสียประมาณ 80 ล้านดอลลาร์จากการโจมตีที่ใช้ช่องโหว่ Reentrancy

**Cross-Contract Reentrancy:** เกิดจากสถานะที่ใช้ร่วมกันข้ามสัญญาต่าง ๆ และลำดับการแก้ไขตัวแปรที่ไม่ถูกต้อง แม้ฟังก์ชันจะมีการป้องกัน ฟังก์ชันอื่นอย่าง 'burnAccount' ก็ยังถูกใช้ประโยชน์ได้

การโจมตีที่โดดเด่น:

  • Rari Capital (2021): สูญเสียประมาณ 10 ล้านดอลลาร์ (~2600 ETH) ภายในไม่ถึงชั่วโมง
  • ValueDefi (2021): สูญเสีย 5345.314 WBNB จากการคำนวณส่วนแบ่งที่ไม่ถูกต้องซึ่งพึ่งพาข้อมูลภายนอก

Read-Only Reentrancy:

Read-only reentrancy ใช้ประโยชน์จากฟังก์ชันที่แม้จะไม่เปลี่ยนสถานะของสัญญา แต่ก็ยังให้ผลลัพธ์ผิดพลาดได้เมื่อสถานะไม่สอดคล้องกัน

การโจมตีที่น่าสนใจ:

  • QuickSwap (2022): ผู้โจมตีใช้ flash loan ผิดวัตถุประสงค์เพื่อปรับราคาสปอตของสินทรัพย์ หลอกเอา 138 ETH และ 700 MATIC token ซึ่งเป็นไปได้เพราะข้อบกพร่องใน Curve LP oracle
  • dForce (2023): มีบั๊ก read-only reentrancy ในโค้ดที่เข้าถึง price oracle บนเชน Arbitrum และ Optimism กับ Curve Finance
  • Sentimente (2023): การโจมตีที่ใช้ช่องโหว่ read-only reentrancy ทำให้ถูกขโมย 1 ล้านดอลลาร์ โชคดีที่ผู้ก่อเหตุคืน 90%
  • Sturdy (2023): สูญเสียประมาณ 442 ETH จากปัญหา read-only reentrancy ของ Balancer ซึ่งราคาของ B-stETH-STABLE ถูกแก้ไข

การป้องกันช่องโหว่ Reentrancy:

  1. ปฏิบัติตามรูปแบบ check-effect-interaction เสมอ
  2. ใช้การป้องกันการกลับเข้าสำหรับการดำเนินการที่ละเอียดอ่อนทั้งหมด
  3. จัดการทุกการเรียกภายนอกอย่างรอบคอบ

Integer Overflow:

เมื่อการคำนวณเกินขีดจำกัดจะเกิด overflow ซึ่งมักนำไปสู่ค่าที่น้อยมากหรือมหาศาล

การโจมตีตัวอย่าง:

  • BeautyChain (2018): ผู้โจมตีได้ 10^58 BEC ผ่าน integer overflow และเทขายมูลค่ามหาศาลถึง 900 ล้านดอลลาร์
  • Poolz (2023): ส่งผลให้สูญเสียประมาณ 665,000 ดอลลาร์บนเชน Ethereum, Binance และ Polygon

มาตรการรับมือ Integer Overflow:

  1. ใช้วิธีคำนวณที่ปลอดภัยเช่นไลบรารี safeMath
  2. ให้ความสำคัญกับการตรวจสอบขอบเขตเพื่อยืนยันว่าผลลัพธ์อยู่ในช่วงที่กำหนด
  3. ใช้ solidity compiler เวอร์ชัน 0.8.0 หรือใหม่กว่าเพื่อการตรวจจับ overflow ในตัว

Access Control:
ช่องโหว่ Access Control เกิดจากการขาดข้อจำกัดการเข้าถึงที่เข้มงวดสำหรับฟังก์ชันที่จัดการการดำเนินการสำคัญ

  • การโจมตีที่โดดเด่น:
  • DAOMaker (2021): ถูกดูดเงินไปถึง ~4 ล้านดอลลาร์หลังจากฟังก์ชัน init ถูกทิ้งไว้ให้มีช่องโหว่
  • GymNetwork (2022): ผู้โจมตีใช้ประโยชน์จากความบกพร่องในการยืนยันตัวตนใน depositFromOtherContract() ทำให้เพิ่มยอดคงเหลือโดยมิชอบโดยไม่มีการชำระเงินจริง ความเสียหาย? ประมาณ 2,475.91 WBNB
  • Tempdao (2023): การจัดการ access control ที่หละหลวมสำหรับฟังก์ชัน migrateStake ทำให้สูญเสียเกิน 2.34 ล้านดอลลาร์

ช่องโหว่ Access Control

  • คำอธิบาย: ช่องโหว่ที่เกิดจากกลไกจำกัดที่ไม่เพียงพอซึ่งควบคุมการเข้าถึงและสิทธิ์สำหรับการดำเนินการเฉพาะภายในระบบ

มาตรการป้องกัน:

  1. การตรวจสอบสิทธิ์อย่างเข้มงวด: บังคับใช้โปรโตคอลสิทธิ์ที่เข้มงวดสำหรับฟังก์ชันเสมอ โดยเฉพาะฟังก์ชันที่จัดการการดำเนินการที่ละเอียดอ่อน
  2. กลไก Multi-Signature: สำหรับงานที่ต้องตัดสินใจร่วมกัน ให้ใช้โปรโตคอล multi-signature ที่ต้องมีการอนุมัติหลายรายการก่อนดำเนินการที่ละเอียดอ่อน

ช่องทางการโจมตีที่พบบ่อย

  • คำอธิบาย: วิธีการหรือช่องทางต่าง ๆ ที่ผู้โจมตีใช้ประโยชน์จากช่องโหว่ในระบบ โดยหลักคือในสมาร์ตคอนแทรกต์

ตัวอย่างที่สำคัญ:

  • การโจมตีแบบ FlashLoan: ใช้ประโยชน์จากคุณสมบัติการกู้ยืมแบบทันทีของระบบการเงินแบบกระจายศูนย์เพื่อดำเนินกิจกรรมที่เป็นอันตราย
  • Front-Running: ผู้โจมตีล่วงรู้ธุรกรรมที่รอดำเนินการของผู้ใช้อื่นและดำเนินการกับธุรกรรมนั้นโดยเสนอค่าธรรมเนียมแก๊สที่สูงกว่า

การโจมตีแบบ FlashLoan

  • คำอธิบาย: แม้โดยเนื้อแท้จะไม่ใช่การโจมตี FlashLoan คือฟีเจอร์ DeFi ที่ให้ผู้ใช้กู้ยืมเงินจำนวนมากได้ทันทีโดยไม่มีหลักประกัน และเคยถูกใช้ประโยชน์จากช่องโหว่เชิงตรรกะในการโต้ตอบและความสัมพันธ์ของสัญญา

การโจมตีที่สำคัญ:

  1. Harves Finance (2020.10.26): ส่งผลให้สูญเสีย 38 ล้านดอลลาร์
  2. InverseFinance (2022.6.16): ส่งผลให้สูญเสีย 53.2445 WBTC และ 99,976.29 USDT
  3. NewFreeDAO (2022.9.8): สูญเสีย 4,481 WBNB คิดเป็นมูลค่าประมาณ 1.25 ล้านดอลลาร์
  4. Lodestar (2022.12.11): ถูกโจมตีผ่านการบิดเบือนราคาออราเคิล
  5. 0vix (2023.4.28): ส่งผลให้สูญเสีย 2 ล้านดอลลาร์บนเชน Polygon

คำแนะนำในการป้องกัน:

  1. ตระหนักถึงลักษณะของ Flashloan ในระหว่างการพัฒนาโปรเจกต์
  2. เพื่อการกำหนดราคาที่แม่นยำ ควรใช้ค่าเฉลี่ยถ่วงน้ำหนักตามเวลาหรือออราเคิลหลายตัว

การวิ่งแข่งหน้า

  • คำอธิบาย: ผู้โจมตีรับรู้ธุรกรรมของผู้ใช้อื่นจาก memPool แล้วใช้ประโยชน์โดยเสนอค่าธรรมเนียมแก๊สที่สูงกว่า

การโจมตีที่สำคัญ:

  1. Sushi Badger Digg (2021.1.25): ส่งผลให้สูญเสีย 81.68 ETH
  2. พูล Sushiswap Ape-ETH (2022.5.17): ผู้โจมตีได้กำไรประมาณ 0.3 ETH
  3. Uniswap (2023.4.2): สูญเสียประมาณ 25 ล้านดอลลาร์จากการโจมตีแบบแซนด์วิช

คำแนะนำในการป้องกัน:

  1. ใช้การป้องกัน slippage เมื่อทำการเทรด
  2. ทำการเทรดในช่วงนอกชั่วโมงเร่งด่วน โดยเฉพาะในตลาดที่มีความผันผวนสูง
  3. ใช้ FlashBot rpc โดย 1inch เพื่อส่งคำสั่งเทรดตรงไปยัง miners จึงข้าม memPool ไป

สรุป

ยินดีด้วย! คุณเรียนจบ Module 2 - ช่องโหว่ของ Smart Contract: เจาะลึกการโจมตีแบบ Reentrancy และช่องโหว่ที่พบบ่อย

มาทบทวนสิ่งที่คุณเรียนรู้กัน:

ช่องโหว่ Reentrancy - ผู้โจมตีใช้ช่องว่างโดยเรียกฟังก์ชันซ้ำก่อนที่ฟังก์ชันจะทำงานเสร็จสมบูรณ์

  • Reentrancy แบบฟังก์ชันเดียว: สัญญาที่ไม่พึงประสงค์เรียกฟังก์ชันในสัญญาอื่นซ้ำ
  • Reentrancy ข้ามฟังก์ชัน: สถานะที่ใช้ร่วมกันระหว่างฟังก์ชันต่าง ๆ ถูกใช้ประโยชน์เนื่องจากมีการป้องกันการเรียกซ้ำที่ไม่ดี
  • Reentrancy ข้ามสัญญา: ใช้ประโยชน์จากสถานะที่แชร์ร่วมกันระหว่างสัญญาต่างๆ
  • Read-Only Reentrancy: ใช้ประโยชน์จากฟังก์ชันที่ให้ผลลัพธ์ผิดพลาดเมื่อสถานะไม่สอดคล้องกัน

Integer Overflow - การคำนวณที่เกินขีดจำกัดที่กำหนด ส่งผลให้เกิดค่าสุดโต่ง

ช่องโหว่การควบคุมการเข้าถึง - เกิดจากการขาดข้อจำกัดการเข้าถึงที่เข้มงวดสำหรับฟังก์ชันสำคัญ

เวกเตอร์การโจมตีที่พบบ่อย - วิธีการที่ผู้โจมตีใช้ประโยชน์จากช่องโหว่ของระบบ

**FlashLoan Attack **- คุณสมบัติของ DeFi ที่อนุญาตให้กู้ยืมจำนวนมากได้ทันทีโดยไม่มีหลักประกัน แต่ถูกใช้ประโยชน์จากข้อบกพร่องเชิงตรรกะ

การโจมตีแบบ Front-running- ผู้โจมตีรับรู้ถึงธุรกรรมที่รอดำเนินการและใช้ประโยชน์โดยเสนอค่าธรรมเนียม gas ที่สูงขึ้น

บทความนี้สนับสนุนโดย:

สรุป — ภาพประกอบ