หมายเหตุบรรณาธิการ: บทความนี้มาจากเทคโนโลยีหมอกช้า (ID: SlowMist)เทคโนโลยีหมอกช้า (ID: SlowMist)
คำนำ
ชื่อเรื่องรอง
คำนำ
จากข้อมูลของ Lianwen เมื่อวันที่ 18 เมษายน Tokenlon ได้ประกาศระงับการโอน imBTC เนื่องจากพบว่ามีผู้โจมตีใช้ช่องโหว่ ERC777 reentrancy ในสัญญาสภาพคล่องของ Uniswap เพื่อเก็งกำไรใน ETH-imBTC pool cycle วิธีการโจมตีในครั้งนี้เป็นช่องโหว่ที่รู้จักซึ่งมีอยู่ใน Uniswap v1 ช่องโหว่นี้ถูกค้นพบครั้งแรกโดย Consensys ในเดือนเมษายน 2019 ในเวลานั้น Consensys ค้นพบเฉพาะความเสี่ยงและไม่พบโทเค็นที่สามารถใช้วิธีนี้ในการโจมตี ต่อมา หลังจากเปิดตัว imBTC บน Uniswap เนื่องจาก imBTC ใช้งานบน ERC777 โดยการรวมคุณลักษณะของ ERC777 และปัญหาในรหัส Uniswap ผู้โจมตีสามารถบรรลุผลสำเร็จได้ผ่านช่องโหว่การกลับเข้ามาใหม่ ต่อไป เราจะวิเคราะห์วิธีการโจมตีและรายละเอียดเฉพาะของการเก็งกำไรนี้ในอนาคต
ชื่อเรื่องรอง
การเตรียมความรู้
โปรโตคอล ERC777 เป็นโปรโตคอลมาตรฐานโทเค็นบน Ethereum โปรโตคอลนี้เป็นรุ่นปรับปรุงของโปรโตคอล ERC20 บน Ethereum การปรับปรุงหลักมีดังนี้:
1. ใช้แนวคิดเดียวกับการส่ง ether เพื่อส่งโทเค็น วิธีการคือ send(dest, value, data)
2. ทั้งสัญญาและที่อยู่ธรรมดาสามารถควบคุมและปฏิเสธที่จะส่งโทเค็นใดโดยการลงทะเบียนฟังก์ชัน hook tokensToSend (การปฏิเสธที่จะส่งเกิดขึ้นได้โดยการย้อนกลับในฟังก์ชัน hook tokensToSend)"4. tokensReceived สามารถส่งโทเค็นและแจ้งให้สัญญายอมรับโทเค็นในธุรกรรมเดียวผ่านฟังก์ชัน hook ซึ่งแตกต่างจาก ERC20 ที่ต้องดำเนินการผ่านการโทรสองครั้ง (อนุมัติ/โอนจาก)"และ"5. ผู้ถือสามารถ"ได้รับอนุญาต
และ
ถอน
ตัวดำเนินการ (ตัวดำเนินการ: สามารถส่งโทเค็นในนามของผู้ถือ) ตัวดำเนินการเหล่านี้มักจะ (กระจายอำนาจ) การแลกเปลี่ยน ตัวประมวลผลการตรวจสอบ หรือระบบการชำระเงินอัตโนมัติ
ที่นี่เราต้องให้ความสนใจเป็นพิเศษกับประเด็นที่สอง นั่นคือ ฟังก์ชัน tokenToSend ในมาตรฐาน ERC777 ตามคำจำกัดความของโปรโตคอล ERC777 โทเค็นที่ปฏิบัติตามมาตรฐานนี้จะพยายามเรียกโทเค็นทุกครั้งที่มีการถ่ายโอนโทเค็น เกิดขึ้น ฟังก์ชัน sender tokensToSend และผู้ถือโทเค็นสามารถลงทะเบียนสัญญาของตนเองในสัญญาการลงทะเบียน ERC1820 และกำหนดการดำเนินการบางอย่างในฟังก์ชัน hook นี้เพื่อจัดการกับกระบวนการบางอย่างในกระบวนการถ่ายโอนโทเค็น เช่น การปฏิเสธการส่งโทเค็นหรือการดำเนินการอื่นๆ
การวิเคราะห์โดยละเอียด
การทำความเข้าใจประเด็นสำคัญเหล่านี้จะช่วยให้เราเข้าใจวิธีการโจมตีเฉพาะของการโจมตีนี้ จากนี้ไป เรามาเร่งความเร็วกันสักหน่อยแล้วดูว่าเกิดอะไรขึ้นกับ Uniswap ในครั้งนี้?
ชื่อเรื่องรอง
การวิเคราะห์โดยละเอียด
สอบถามการทำธุรกรรมของผู้โจมตีผ่าน Etherscan 0x32c83905db61047834f29385ff8ce8cb6f3d24f97e24e6101d8301619efee96e
พบว่าผู้โจมตีโอน imBTC ไปยังสัญญา Uniswap สองครั้ง ด้วยจำนวน 0.00823084 ที่เท่ากัน จากนั้นได้รับ ETH สองรายการจาก Uniswap ซึ่งดูเหมือนจะเป็นธุรกรรมปกติสองรายการ เพื่อให้เข้าใจรายละเอียดของธุรกรรมทั้งหมดได้ดียิ่งขึ้น เราจำเป็นต้องดูรายละเอียดเฉพาะของธุรกรรมผ่าน bloxy.info
จากการสอบถามรายละเอียดของธุรกรรม เราพบว่าผู้โจมตีได้แลกเปลี่ยน imBTC บางส่วนเป็น Uniswap ผ่านฟังก์ชัน ethToTokenSwapInput ก่อน จากนั้นจึงแลกเปลี่ยน imBTC เป็น ETH เป็นครั้งแรกผ่านฟังก์ชัน tokenToEthSwapInput จากนั้น Uniswap จะโอน ETH ไปยังผู้โจมตีก่อน จากนั้นเรียกฟังก์ชัน TransferFrom ของ imBTC เนื่องจาก imBTC ใช้มาตรฐาน ERC777 เมื่อเรียกใช้ฟังก์ชัน TransferFrom ของ imBTC imBTC จะเรียกฟังก์ชัน tokensToSend ของผู้โจมตี จากนั้นในฟังก์ชัน tokensToSend ของผู้โจมตี ผู้โจมตีจะแลกเปลี่ยน imBTC เป็น ETH เป็นครั้งที่สอง จากนั้นกระบวนการจะสิ้นสุดลง
จากรายละเอียดธุรกรรม ดูเหมือนจะไม่มีปัญหาที่นี่ และเรายังคงปฏิบัติตามรหัสของ UniSwap
โค้ดด้านบนเป็นโค้ดของฟังก์ชัน ethToTokenSwapInput ของ Uniswap จากการวิเคราะห์โค้ด ฟังก์ชัน ethToTokenSwapInput ของ Uniswap จะเรียกฟังก์ชัน ethToTokenInput จากนั้นจึงขอรับจำนวน eth ที่สามารถแลกเปลี่ยนเป็นโทเค็นผ่าน getInputPrice ก่อน จากนั้นส่ง eth ไปยังผู้ใช้ ผ่านฟังก์ชันส่ง และสุดท้าย โอนโทเค็นเข้าสู่สัญญาผ่านการโอนจาก ไปที่ฟังก์ชัน getInputPrice กัน
ด้วยการวิเคราะห์ฟังก์ชัน getInputPrice เราสามารถทราบได้ว่าสูตรคำนวณจำนวน ETH ที่ได้รับคือ
ภายใต้สูตรนี้ ในระหว่างกระบวนการแลกเปลี่ยน imBTC ปกติสำหรับ ETH สำรอง imBTC ในฐานะตัวส่วนควรเพิ่มขึ้นหลังจากการแลกเปลี่ยน และสำรอง ETH ที่เกี่ยวข้องจะลดลง
แต่เมื่อตรวจสอบวิธีการทำงานของผู้โจมตี เมื่อผู้โจมตีส่ง imBTC ไปยัง ETH เป็นครั้งแรก Uniswap จะส่ง ETH ไปยังผู้โจมตีก่อน ในเวลานี้ ETH สำรองใน Uniswap ลดลง จากนั้น Uniswap จะเรียกใช้ฟังก์ชัน TransferFrom (โปรดทราบว่า ในขณะนี้ imBTC ของผู้โจมตียังไม่ถูกหักออก) และเมื่อผู้โจมตีเรียกใช้ ethToTokenSwapInput เป็นครั้งที่สองในฟังก์ชัน TransferFrom สูตรสำหรับการรับจำนวน ETH ที่แลกเปลี่ยนผ่าน getInputPrice จะกลายเป็นดังนี้:
โปรดทราบว่าในการคำนวณการแลกเปลี่ยนครั้งที่สอง ปริมาณสำรองของ ETH เท่านั้นที่ลดลง แต่ปริมาณสำรองของ imBTC ไม่ได้เพิ่มขึ้น สิ่งนี้นำไปสู่ข้อเท็จจริงที่เมื่อเทียบกับการเรียกใช้ฟังก์ชัน ethToTokenSwapInput เพียงอย่างเดียว ผู้โจมตีสามารถใช้ imBTC เพื่อแลกเปลี่ยนได้ ETH เป็นครั้งที่สอง ตัวเศษของสูตรการคำนวณมีการเปลี่ยนแปลง แต่ตัวส่วนของสูตรจะไม่เปลี่ยนแปลง เมื่อเทียบกับการแลกเปลี่ยนปกติ การแลกเปลี่ยนครั้งที่สองที่ดำเนินการโดยผู้โจมตีด้วยวิธีการเข้าใหม่จะได้รับผลกำไรเล็กน้อย ส่งผลให้เกิดผลกำไร เมื่อทำซ้ำขั้นตอนนี้ จะสามารถรับ ETH ได้มากขึ้นผ่าน imBTC ในจำนวนที่เท่ากัน ส่งผลให้ผู้ประกอบการธุรกิจ Uniswap สูญเสีย
ชื่อเรื่องรอง
วิธีการป้องกัน
เพิ่มกลไกการล็อคให้กับวิธีการดำเนินธุรกิจที่สำคัญ เช่น: ReentrancyGuard ของ OpenZeppelin
เมื่อพัฒนาสัญญา ให้ใช้รูปแบบการเขียนของการเปลี่ยนแปลงตัวแปรของสัญญานี้ก่อน แล้วจึงทำการเรียกภายนอก
ก่อนที่โครงการจะออนไลน์ ทีมรักษาความปลอดภัยบุคคลที่สามที่ยอดเยี่ยมจะได้รับเชิญให้ดำเนินการตรวจสอบความปลอดภัยอย่างครอบคลุมเพื่อค้นหาปัญหาด้านความปลอดภัยที่อาจเกิดขึ้นให้ได้มากที่สุด
เมื่อมีการเชื่อมต่อหลายสัญญา จำเป็นต้องตรวจสอบความปลอดภัยของรหัสและความปลอดภัยทางธุรกิจของสัญญาหลายฝ่าย และพิจารณาประเด็นด้านความปลอดภัยอย่างเต็มที่ภายใต้การรวมกันของสถานการณ์ทางธุรกิจต่างๆ
เมื่อมีการเชื่อมต่อหลายสัญญา จำเป็นต้องตรวจสอบความปลอดภัยของรหัสและความปลอดภัยทางธุรกิจของสัญญาหลายฝ่าย และพิจารณาประเด็นด้านความปลอดภัยอย่างเต็มที่ภายใต้การรวมกันของสถานการณ์ทางธุรกิจต่างๆ
การรักษาความปลอดภัยเป็นแบบไดนามิก และแต่ละฝ่ายในโครงการจำเป็นต้องจับภาพข่าวกรองภัยคุกคามที่อาจเกี่ยวข้องกับโครงการของตนเองอย่างทันท่วงที และตรวจสอบความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้นโดยทันที
สัญญาควรตั้งค่าสวิตช์หยุดชั่วคราวให้มากที่สุดเท่าที่จะเป็นไปได้ เพื่อตรวจจับและหยุดการขาดทุนในเวลาที่เกิดเหตุการณ์ "หงส์ดำ"
การรักษาความปลอดภัยเป็นแบบไดนามิก และแต่ละฝ่ายในโครงการจำเป็นต้องจับภาพข่าวกรองภัยคุกคามที่อาจเกี่ยวข้องกับโครงการของตนเองอย่างทันท่วงที และตรวจสอบความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้นโดยทันที
ชื่อเรื่องรอง
ความคิดสุดท้าย
