เนื่องจากโปรโตคอล DeFi ยังคงร้อนขึ้นภายในระบบนิเวศ Ethereum CipherTrace จึงมองเห็นช่องโหว่และเวกเตอร์การโจมตีเพิ่มมากขึ้นเรื่อยๆ สัปดาห์ที่ผ่านมา เมื่อวันที่ 28 ธันวาคม 2020 ช่างตีเหล็กของ Cover Protocol ได้ทำเหมืองโล่ห์ถูกเอารัดเอาเปรียบ แฮกเกอร์ใช้จุดบกพร่องในสัญญาการขุดเพื่อสร้างโทเค็น COVER จำนวนอนันต์และระบายมากกว่า 4.4 ล้านดอลลาร์จากโครงการ
ครอบคลุมโปรโตคอล การเผยแพร่ Post-Mortem ของพวกเขาเมื่อวานนี้โดยระบุว่า Devs ไม่รู้จัก ข้อบกพร่องเกิดขึ้นตั้งแต่เริ่มใช้งานสัญญา Blacksmith โดยเน้นถึงความสำคัญของการตรวจสอบความปลอดภัยอย่างละเอียดและการทดสอบ สัญญาสมาร์ทสัญญาอัจฉริยะคืออะไร? สัญญาที่ชาญฉลาดคือผู้เชี่ยวชาญด้านคอมพิวเตอร์... More.
เส้นเวลาของ Minting ที่ไม่มีที่สิ้นสุด
ไทม์ไลน์ของผู้โจมตีเริ่มต้น
- กลุ่มสภาพคล่องของ New Balancer เดิมคือ ที่เพิ่ม ต่อสัญญา Blacksmith.sol
- โจมตี เงินฝาก 1,326,879.99 โทเค็น BPT ในสัญญา Blacksmith.sol
- จู่โจมคนเดียวกัน ดำเนินการ การเอารัดเอาเปรียบโดยการถอนเงินออกจากสัญญา
- ผู้โจมตีสามารถ ต่อ รางวัลเหรียญกษาปณ์และการถอนเงินจำนวนประมาณ 4.4 ล้านเหรียญ
ในเหตุการณ์ที่น่าสนใจ โดยอ้างว่า “แฮ็กเกอร์สีขาว” ที่เชื่อมโยงกับ Grap Finance ยังใช้ประโยชน์จากจุดบกพร่องเพื่อสร้างโทเค็น COVER มูลค่าประมาณ 4 ล้านดอลลาร์ ในที่สุด Grap Finance ก็คืนเงินให้กับ Cover Protocol
Grap Finance Deployer ไทม์ไลน์บัญชีภายนอก (EOA)
- แหล่งรวมสภาพคล่องใหม่คือ ได้รับการอนุมัติ สำหรับการขุดสภาพคล่อง
- EOA ผู้ปรับใช้ Grap Finance ฝาก 15,255.55 BPT (DAI/Basis) ลงสระบน Cover ผ่านสัญญา Blacksmith.sol
- ประมาณสี่นาทีต่อมา เงินทุนก็ การถอดถอน บนปก เหลือ 1 Wei ไว้ในยอดคงเหลือ EOA ของ Grap Finance Deployer
- ผู้ใช้ภายนอกรายอื่น ถอนตัวออก ยอดคงเหลือส่วนใหญ่มาจากสัญญา Blacksmith.sol ในช่วงเวลาเดียวกันซึ่งทำให้ Grap Finance มีสภาพคล่องทั้งหมดสำหรับกลุ่ม DAI/Basis ในสัญญา Blacksmith.sol
- ผู้ปรับใช้การเงินของ Grap ฝาก กลับ 15,255.55 BPT (DAI/Basis) ลงสระ
- จากนั้น Grap Finance Deployer การเรียกร้อง รางวัลและเนื่องจากการเอารัดเอาเปรียบ มิ้นต์ 40,796,131,214,802,500,000.21 COVER
- หลังจากการเผาเหรียญกษาปณ์แล้ว Grap Finance Deployer ส่ง back Ether to Cover ระบุ “คราวหน้าดูแลตัวเองดีๆ นะ”
วิธีสร้างโทเค็นอนันต์—การวิเคราะห์ทางเทคนิค
พื้นหลัง
การหาประโยชน์นี้ทำให้เราย้อนกลับไปที่พื้นฐานของภาษาการเขียนโปรแกรม Solidity ซึ่งใช้สำหรับการนำสัญญาอัจฉริยะไปใช้ใน Ethereum เมื่อรวบรวมสัญญาเหล่านี้แล้ว Ethereum Virtual Machine (EVM) จะสามารถเข้าใจคำแนะนำ (เช่น opcodes) ที่ใช้ในการดำเนินการฟังก์ชันต่างๆ และจัดการหน่วยความจำและที่เก็บข้อมูล EVM มีสามส่วนที่แตกต่างกันซึ่งสามารถจัดเก็บข้อมูลได้: หน่วยความจำ ที่เก็บข้อมูล และสแต็ก. การทำความเข้าใจเกี่ยวกับประเด็นเหล่านี้มีความสำคัญต่อการทำความเข้าใจว่าจุดบกพร่องถูกนำไปใช้ประโยชน์อย่างไร
คล้ายกับ Random Access Memory (RAM) บนอุปกรณ์คอมพิวเตอร์ “หน่วยความจำคีย์เวิร์ด ” ภายใน Solidity จะจัดสรรหน่วยความจำสำหรับตัวแปรเฉพาะ ในกรณีนี้ ตัวแปรนั้นถูกกำหนดขอบเขตให้กับฟังก์ชันเฉพาะ หน่วยความจำจะถูกล้างเมื่อฟังก์ชันทำงานแล้ว แต่อาจยังคงอยู่หากเนื้อหาของหน่วยความจำนั้นถูกผลักเข้าไปในที่จัดเก็บก่อนที่ฟังก์ชันจะส่งคืน
"การเก็บรักษาคีย์เวิร์ดภายใน Solidity ช่วยให้ตัวแปรทำหน้าที่เป็นตัวชี้ในการจัดเก็บข้อมูลในการแมปหรือโครงสร้างข้อมูล ข้อมูลการจัดเก็บจะคงอยู่ระหว่างการเรียกใช้ฟังก์ชันและธุรกรรม ภายใต้ประทุน ที่เก็บข้อมูลเป็นที่เก็บคีย์-ค่าที่จับคู่คำ 256 บิตกับคำ 256 บิต
โปรดทราบว่า EVM ไม่ใช่เครื่องลงทะเบียน แต่เป็นเครื่องสแต็ก ดังนั้นการคำนวณทั้งหมดจะดำเนินการในพื้นที่ข้อมูลที่เรียกว่า กอง. สแต็กมีความจุสูงสุด 1024 รายการ แต่เข้าถึงได้ง่ายเพียง 16 อันดับแรกเท่านั้น ซึ่งสามารถใช้สลับองค์ประกอบบนสุดกับหนึ่งใน 16 องค์ประกอบที่อยู่ด้านล่างและอื่นๆ
ข้อผิดพลาด
แฮกเกอร์ใช้ประโยชน์จาก Blacksmith.sol ของ Cover Protocol—สัญญา Shield Mining ซึ่งช่วยให้ผู้เดิมพันได้รับรางวัลเป็นโทเค็นของโปรเจ็กต์หรือกลุ่มเฉพาะ เช่น โทเค็น CLAIM และ NOCLAIM ภายใน Cover Protocol
เพื่อให้เข้าใจข้อผิดพลาดได้ดีขึ้น อันดับแรก มาดูที่สาธารณะกันก่อน สระว่ายน้ำ ตัวแปรซึ่งเป็นการแมป (เช่นการจัดเก็บข้อมูล):
At บรรทัด 118เราเห็นว่าสัญญาแคชข้อมูลพูลในหน่วยความจำผ่านคำหลัก "หน่วยความจำ"
จากนั้น บรรทัด 121, สัญญาปรับปรุงพูลในการจัดเก็บเป็น updatePool(ที่อยู่ _lpToken) ฟังก์ชัน ใช้ a สระเก็บสระ ตัวแปร
แต่ถ้าคุณมองลึกลงไปใน เงินฝาก (ที่อยู่ _lpToken, uint256 _amount) ฟังก์ชั่นก็ใช้เหมือนกัน สระ ตัวแปรจากบรรทัดที่ 118 ที่แคชไว้ในหน่วยความจำภายในฟังก์ชันสำหรับการคำนวณสำหรับ pool.accRewardsPerToken. ณ จุดนี้ไฟล์ สระ ตัวแปรถูกคัดลอกมาจาก สระว่ายน้ำ การทำแผนที่และถูกบันทึกไว้ในหน่วยความจำ
เป็นผลให้การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับ สระ ตัวแปรภายใน เงินฝาก (ที่อยู่ _lpToken, uint256 _amount) ฟังก์ชั่นจะไม่เปลี่ยน สระว่ายน้ำ การแมปในที่เก็บข้อมูลบนเครือข่ายของสัญญาเนื่องจากตัวแปรที่ใช้คีย์เวิร์ด "หน่วยความจำ" นั้นถูกจำกัดขอบเขตภายในฟังก์ชันเท่านั้น จากนั้นสัญญาจะอัปเดต pool.accRewardsPerToken ภายใน updatePool(ที่อยู่ _lpToken) ฟังก์ชันซึ่งใช้ที่เก็บข้อมูล ดังนั้น ภายใน updatePool(ที่อยู่ _lpToken) ทำหน้าที่ pool.accRewardsPerToken ที่อัปเดตเพิ่มขึ้นอย่างมากเนื่องจากเป็นสระว่ายน้ำใหม่ในทางเทคนิคและไม่เกี่ยวข้องกับ สระ ในความทรงจำ.
หลังจากช่องโหว่และการใช้ในทางที่ผิดระหว่างหน่วยความจำและที่เก็บข้อมูล miner.rewardWriteoff ภายใน เงินฝาก (ที่อยู่ _lpToken, uint256 _amount) ฟังก์ชันถูกคำนวณผิดเช่นเดียวกับการใช้ที่ไม่ถูกต้อง pool.accRewardsPerToken, เนื่องจากเรายังอยู่ในฟังก์ชันฝากซึ่งจัดการอินสแตนซ์แคชของหน่วยความจำ สระ.
นอกเหนือจากฟังก์ชันการฝากเงินแล้ว ทุกคน เช่น Grap Finance สามารถรับโทเค็นจำนวนมหาศาลได้เมื่อดำเนินการ รับรางวัล (ที่อยู่ _lpToken) การทำงาน. ฟังก์ชันนี้ใช้เพื่อคว้ารางวัล จบลงด้วยการเรียก _claimCoverRewards (พูลหน่วยความจำพูล ตัวขุดหน่วยความจำ Miner) ซึ่งอ้างอิงถึง miner.rewardWriteoff ที่เราเน้นไว้ข้างต้น เนื่องจากตัวแปรนั้นเล็กกว่าของจริงมาก pool.accRewardsPerTokenสัญญาส่งผลให้มีการสร้างโทเค็นจำนวนมาก
ประเด็นที่สำคัญ
CipherTrace หวังว่าพื้นหลังนี้ในจุดบกพร่องที่ถูกโจมตีจะชี้ให้เห็นถึงความสำคัญของการตรวจสอบความปลอดภัยอย่างละเอียดและการทดสอบสัญญาอัจฉริยะ blockchainblockchain—เทคโนโลยีที่อยู่เบื้องหลัง bitcoin และ c... More หนึ่งเลือกที่จะปรับใช้กับ แม้ว่า Grap Finance จะคืนเงินที่ได้รับจากการหาประโยชน์ แฮ็กเกอร์รายเดิมยังสามารถทำเงินสุทธิได้มากกว่า $4 ล้านเหรียญจากโปรโตคอล DeFi และมูลค่าของโทเค็น COVER ลดลงเกือบ 99%
ที่มา: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/