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

ในหน้านี้
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:
- ปฏิบัติตามรูปแบบ check-effect-interaction เสมอ
- ใช้การป้องกันการกลับเข้าสำหรับการดำเนินการที่ละเอียดอ่อนทั้งหมด
- จัดการทุกการเรียกภายนอกอย่างรอบคอบ
Integer Overflow:
เมื่อการคำนวณเกินขีดจำกัดจะเกิด overflow ซึ่งมักนำไปสู่ค่าที่น้อยมากหรือมหาศาล
การโจมตีตัวอย่าง:
- BeautyChain (2018): ผู้โจมตีได้ 10^58 BEC ผ่าน integer overflow และเทขายมูลค่ามหาศาลถึง 900 ล้านดอลลาร์
- Poolz (2023): ส่งผลให้สูญเสียประมาณ 665,000 ดอลลาร์บนเชน Ethereum, Binance และ Polygon
มาตรการรับมือ Integer Overflow:
- ใช้วิธีคำนวณที่ปลอดภัยเช่นไลบรารี safeMath
- ให้ความสำคัญกับการตรวจสอบขอบเขตเพื่อยืนยันว่าผลลัพธ์อยู่ในช่วงที่กำหนด
- ใช้ 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
- คำอธิบาย: ช่องโหว่ที่เกิดจากกลไกจำกัดที่ไม่เพียงพอซึ่งควบคุมการเข้าถึงและสิทธิ์สำหรับการดำเนินการเฉพาะภายในระบบ
มาตรการป้องกัน:
- การตรวจสอบสิทธิ์อย่างเข้มงวด: บังคับใช้โปรโตคอลสิทธิ์ที่เข้มงวดสำหรับฟังก์ชันเสมอ โดยเฉพาะฟังก์ชันที่จัดการการดำเนินการที่ละเอียดอ่อน
- กลไก Multi-Signature: สำหรับงานที่ต้องตัดสินใจร่วมกัน ให้ใช้โปรโตคอล multi-signature ที่ต้องมีการอนุมัติหลายรายการก่อนดำเนินการที่ละเอียดอ่อน
ช่องทางการโจมตีที่พบบ่อย
- คำอธิบาย: วิธีการหรือช่องทางต่าง ๆ ที่ผู้โจมตีใช้ประโยชน์จากช่องโหว่ในระบบ โดยหลักคือในสมาร์ตคอนแทรกต์
ตัวอย่างที่สำคัญ:
- การโจมตีแบบ FlashLoan: ใช้ประโยชน์จากคุณสมบัติการกู้ยืมแบบทันทีของระบบการเงินแบบกระจายศูนย์เพื่อดำเนินกิจกรรมที่เป็นอันตราย
- Front-Running: ผู้โจมตีล่วงรู้ธุรกรรมที่รอดำเนินการของผู้ใช้อื่นและดำเนินการกับธุรกรรมนั้นโดยเสนอค่าธรรมเนียมแก๊สที่สูงกว่า
การโจมตีแบบ FlashLoan
- คำอธิบาย: แม้โดยเนื้อแท้จะไม่ใช่การโจมตี FlashLoan คือฟีเจอร์ DeFi ที่ให้ผู้ใช้กู้ยืมเงินจำนวนมากได้ทันทีโดยไม่มีหลักประกัน และเคยถูกใช้ประโยชน์จากช่องโหว่เชิงตรรกะในการโต้ตอบและความสัมพันธ์ของสัญญา
การโจมตีที่สำคัญ:
- Harves Finance (2020.10.26): ส่งผลให้สูญเสีย 38 ล้านดอลลาร์
- InverseFinance (2022.6.16): ส่งผลให้สูญเสีย 53.2445 WBTC และ 99,976.29 USDT
- NewFreeDAO (2022.9.8): สูญเสีย 4,481 WBNB คิดเป็นมูลค่าประมาณ 1.25 ล้านดอลลาร์
- Lodestar (2022.12.11): ถูกโจมตีผ่านการบิดเบือนราคาออราเคิล
- 0vix (2023.4.28): ส่งผลให้สูญเสีย 2 ล้านดอลลาร์บนเชน Polygon
คำแนะนำในการป้องกัน:
- ตระหนักถึงลักษณะของ Flashloan ในระหว่างการพัฒนาโปรเจกต์
- เพื่อการกำหนดราคาที่แม่นยำ ควรใช้ค่าเฉลี่ยถ่วงน้ำหนักตามเวลาหรือออราเคิลหลายตัว
การวิ่งแข่งหน้า
- คำอธิบาย: ผู้โจมตีรับรู้ธุรกรรมของผู้ใช้อื่นจาก memPool แล้วใช้ประโยชน์โดยเสนอค่าธรรมเนียมแก๊สที่สูงกว่า
การโจมตีที่สำคัญ:
- Sushi Badger Digg (2021.1.25): ส่งผลให้สูญเสีย 81.68 ETH
- พูล Sushiswap Ape-ETH (2022.5.17): ผู้โจมตีได้กำไรประมาณ 0.3 ETH
- Uniswap (2023.4.2): สูญเสียประมาณ 25 ล้านดอลลาร์จากการโจมตีแบบแซนด์วิช
คำแนะนำในการป้องกัน:
- ใช้การป้องกัน slippage เมื่อทำการเทรด
- ทำการเทรดในช่วงนอกชั่วโมงเร่งด่วน โดยเฉพาะในตลาดที่มีความผันผวนสูง
- ใช้ 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 ที่สูงขึ้น
บทความนี้สนับสนุนโดย:
