อะไรคือการโจมตี Integer Overflow?
การโจมตี Integer Overflow เกิดขึ้นเมื่อจำนวนของโปรแกรมถึงค่ามากสุดแล้วหมุนกลับ ทำให้ผู้โจมตีบิดยอดคงเหลือหรือลิมิตได้ ในคริปโต การหมุนกลับนี้อาจเปลี่ยนการตรวจสอบอย่าง “คุณมีโทเคนเพียงพอหรือไม่?” ให้เป็นใช่ ในขณะที่คำตอบควรเป็นไม่ ลองนึกภาพมาตรวัดรถเก่าที่หมุนจาก 999999 ไปเป็น 000000 แต่มีเงินอยู่ในการเล่น
“Modern compilers make this impossible.” ไม่ใช่ทั้งหมด หลาย smart contracts ยังคงใช้การคำนวณที่ไม่ได้ตรวจสอบในบางจุด คณิตศาสตร์ที่กำหนดเอง หรือ assembly ที่สามารถนำข้อบกพร่อง overflow กลับมาใช้ใหม่ได้
วิธีที่ Integer Overflow Attack ทำงาน
นี่คือ walkthrough แบบเร็วโดยใช้สัญญา token เป็นเวที
- Step 1: สัญญาบันทึกยอดคงเหลือด้วยจำนวนเต็มขนาดคงที่และมีฟังก์ชันที่บวก ลบ หรือคูณจำนวน
- Step 2: ผู้โจมตีเลือกอินพุตที่ดันตัวเลข vượt 넘 ถึงค่าสูงสุด ทำให้เกิด wraparound ไปยังค่าที่น้อยหรือศูนย์
- Step 3: การ wraparound นั้นเปลี่ยนเงื่อนไขการตรวจ เมื่อ wrap แล้ว จำนวนคงเหลือดูใหญ่ หรือขอบเขตการโอนดูเล็ก จึงผ่าน require
- Step 4: ผู้โจมตี mint โทเคนที่ไม่ได้รับหรือตรวจสอบกับขีดจำกัดไม่ได้ บล็อกการโอนที่ไม่ควรทำได้
- Step 5: พวกเขาสลับผลกำไรผ่านการเทรดหรือ bridges และออกก่อนที่ใครจะจับได้
เรื่องจริง: token ERC 20 จำนวนหนึ่งเคยมีบั๊ก batch overflow ที่ทำให้ผู้โจมตี mint ปริมาณมากผิดปกติ แล้วขายให้กับ exchanges อย่างมาก ใช่ นั่นเกิดขึ้นจริง
ทำไม Integer Overflow Attack ถึงสำคัญ
ถ้าคุณถือโทเคน สร้างแอป หรือซื้อขาย DeFi ควรใส่ใจ นี่เกี่ยวกับตัวเลข ตัวเลขคือรากฐานของ crypto
- ประโยชน์: รู้วิธีการทำงานนี้จะช่วยให้คุณสังเกต red flags ตั้งแต่เนิ่นๆ และปกป้องเงินสดของคุณ
- มุมมอง: ข้อผิดพลาดเชิงคณิตศาสตร์เป็นอมตะ เชนใหม่ๆ และเครื่องมือใหม่ๆ มาเรื่อยๆ แต่ข้อผิดพลาดทางคณิตศาสตร์ยังถูกใช้งานโดยมืออาชีพ
- ความ relevant: คุณจะเห็นมันในคณิตศาสตร์ของ supply ของ tokens ระบบรางวัล และนับ NFT และ dApps ที่ยุ่งกับยอดผู้ใช้งาน
ใน Solidity ให้ arithmetic ถูกตรวจสอบเป็นค่าเริ่มต้นและให้บล็อก unchecked มีขนาดเล็กและผ่านการตรวจสอบ เพิ่ม fuzz tests ที่ลองค่าขอบเขตมากกว่าค่าที่เป็น happy path
Key Characteristics of Integer Overflow Attack
อะไรที่ทำให้มันแตกต่างจากบั๊กอื่นๆ:
- Wraparound: ตัวเลขกระโดดจาก max กลับไปที่ศูนย์เหมือนนับวนล้อ
- Silent: ไม่มีข้อผิดพลาด native ถ้าคณิตศาสตร์ไม่ถูกตรวจสอบ ดังนั้นความล้มเหลวจะดูเหมือนผลลัพธ์ที่ถูกต้อง
- Triggerable: อินพุตที่ควบคุมโดยผู้ใช้มักสามารถบังคับจุดที่เกิดขึ้นได้
- Repeatable: เมื่อพบแล้ว ผู้โจมตีสามารถสคริปต์มันและรันบนหลายเป้าหมาย
Variations
รูปแบบหลักที่คุณจะได้ยิน พี่น้องในครอบครัวเดียวกัน แต่วิธีการต่างกัน:
- Underflow: การลบทำให้ติดลบแล้ว wrap ไปยังค่ามหาศาล
- Addition: การเพิ่มไปยังยอดคงเหลือหรือ supply ทำให้มันทะลุขีดสูงสุดแล้วกลับไปยังตัวเลขเล็ก
- Multiplication: ตัวคูณรางวัลหรือตัวแปรสเกลทำให้ค่าพุ่งเกินขีดจำกัด
- Counter: ตัวนับ Token ID หรือ supply หมุนเวียนแล้วให้ mint ต่อไปเกินขอบเขต
Integer Overflow Attack isn’t only a Solidity thing. It can show up in Vyper, Rust, Move, or custom assembly, and many publicized exploits boiled down to unchecked math around balances or supplies.
Example
ฟังก์ชันรางวัลคูณจำนวนที่ผู้ใช้ให้มาด้วยโบนัสขนาดใหญ่ ค่า overflow เกิด ขีดจำกัดตรวจสอบผ่าน และ Integer Overflow Attack ทำให้ผู้โจมตี mint โทเคนมากกว่าที่ตั้งใจ
Fun Fact
เกมคลาสสิกในตู้ arcade ที่มีฉากผ่านด่าน 256 หน้าจอ? การหยุดชะงักครั้งนั้นมาจาก integer overflow แสดงให้เห็นว่ even เกมเก่าก็อาจเปิดเผยข้อบกพร่อง crypto ได้
Wrap-Up
คิดถึง Integer Overflow Attack เหมือนตัวเลขที่วิ่งรอบสนามเต็มวงและขโมยแอบวิ่งผ่านช่องว่างนั้น คณิตศาสตร์ถูกตรวจสอบ และคุณหลับสบายขึ้น