23 เมษายน 2565Chengdu Lianan Chain Bing-Blockchain แพลตฟอร์มการรับรู้สถานการณ์ด้านความปลอดภัยชื่อระดับแรก
#1 ข้อมูลที่เกี่ยวข้องกับเหตุการณ์
เมื่อวันที่ 23 เมษายน foobar ผู้พัฒนา Solidity ทวีตว่า 11,539 ETH (มูลค่า 34 ล้านดอลลาร์) ถูกล็อคอย่างถาวรในสัญญา AkuDreams และผู้ใช้แต่ละคนหรือทีมพัฒนาไม่สามารถถอนเงินได้ ตั้งค่าสถานะการประมูลแต่ละรายการเป็น 1 หลังจากดำเนินการคืนเงินแล้ว ดังนั้น ผู้ใช้จึงไม่สามารถโทรเรียก EmergencyWithdraw() ได้ นอกจากนี้ ทีมไม่สามารถรับเงิน ซึ่งโดยพื้นฐานแล้วเทียบเท่ากับการทำลายล้าง
ทีมเทคนิคของ Chengdu LianAn ได้ทำการวิเคราะห์ในทันที
สัญญาที่มีช่องโหว่:
0xf42c318dbfbaab0eee040279c6a2588fa01a961d
#2 การวิเคราะห์ช่องโหว่
ช่องโหว่ที่หนึ่ง:
ช่องโหว่ที่หนึ่ง:
1. ช่องโหว่สัญญาแรกเข้ามาprocessRefundsผู้ออกแบบดำเนินการคืนเงินเป็นวงกลมตามตัวนับการคืนเงิน
2. ที่นี่ ฟังก์ชันการโทรจะใช้สำหรับการดำเนินการคืนเงิน และผลของการคืนเงินจะใช้เป็นเงื่อนไขการตัดสินของความต้องการ
3. ดังนั้น หากผู้โจมตีกำลังดำเนินการคืนเงินในคิวในขณะนี้ เมื่อมีการเรียกการคืนเงินการโทรไปยังผู้โจมตี ผู้โจมตีจะทำการย้อนกลับที่เป็นอันตรายในทางเลือกอื่น ซึ่งจะทำให้คิวการคืนเงินค้างอยู่ที่ ผู้โจมตีส่งผลให้ทุกคนที่อยู่เบื้องหลังคิวไม่สามารถคืนเงินได้
ช่องโหว่ที่สอง:
ช่องโหว่ที่สอง:
บั๊กยังเป็นตัวการที่ทำให้สินทรัพย์ ETH มูลค่าประมาณ 34 ล้านดอลลาร์ถูกล็อคในสัญญา
1. ในฟังก์ชัน claimProjectFunds ฟังก์ชันนี้ส่วนใหญ่จะใช้สำหรับการถอนโดยฝ่ายโครงการ เพื่อป้องกันไม่ให้ฝ่ายโครงการมีอำนาจมากเกินไปและโอนทรัพย์สินทั้งหมดในสัญญาก่อนที่ผู้ใช้จะถอนเงินเสร็จสิ้น ผู้ใช้จะไม่ได้รับเงินคืน การดำเนินการคืนเงินทั้งหมดควรเสร็จสิ้นก่อนที่โครงการจะสามารถถอนเงินได้ ในแง่ของการออกแบบตรรกะทางธุรกิจไม่มีปัญหา อย่างไรก็ตาม ในการใช้งานรหัสเฉพาะ รหัสปัจจุบันมีความเสี่ยงต่อช่องโหว่ 1 ทำให้ฝ่ายโครงการไม่สามารถถอนเงินได้ แต่นี่เป็นเพียงความเสี่ยงที่อาจเกิดขึ้น และสาเหตุของการล็อคกองทุนในครั้งนี้ไม่ใช่เหตุผล
2. ให้ความสนใจกับโค้ดบรรทัดที่ 620 ในฟังก์ชัน: need (refundProgress >= totalBids) โดยที่ refundProgress ระบุว่ามีการคืนเงินของผู้ใช้จำนวนเท่าใดที่ได้รับการประมวลผล และ totalBids ระบุว่าผู้ใช้ทั้งหมดประมูลไปกี่ NFT โปรดทราบว่าเนื่องจากผู้ใช้สามารถเสนอราคาสำหรับ NFT ได้หลายรายการ ความคืบหน้าในการคืนเงินอาจน้อยกว่าการเสนอราคาทั้งหมดในการเปรียบเทียบเชิงตัวเลข
มาดูกระบวนการของฟังก์ชันการคืนเงินRefunds: need(_refundProgress < _bidIndex); bidIndex หมายความว่าผู้ใช้ทั้งหมดที่เข้าร่วมในการเสนอราคา กระบวนการคืนเงินจะไม่สูงกว่า bidIndex
ณ จุดนี้ มาดูค่าของ bidIndex ซึ่งก็คือ 3669:
มูลค่าของ totalBids คือ 5495:
3. ดังนั้นการคืนเงินความคืบหน้า>= 5495 และการคืนเงินความคืบหน้าชื่อระดับแรก
#3 สรุป
ในการตอบสนองต่อเหตุการณ์นี้ ทีมเทคนิคของ Chengdu LianAn ได้แนะนำ:
1. นักพัฒนาควรมีความตระหนักด้านการพัฒนาความปลอดภัยขั้นพื้นฐานและคุ้นเคยกับประเด็นด้านความปลอดภัยที่ควรให้ความสนใจในการพัฒนาสัญญาอัจฉริยะ
2. เมื่อออกแบบและดำเนินการตามสัญญา ให้ใส่ใจกับความถูกต้องของการนำโค้ดไปใช้ ก่อนที่โครงการจะออนไลน์ คุณสามารถเลือกบริษัทตรวจสอบความปลอดภัยระดับมืออาชีพเพื่อดำเนินการตรวจสอบความปลอดภัยแบบครอบคลุมเพื่อหลีกเลี่ยงความเสี่ยงด้านความปลอดภัย
