โพสต์ในบล็อกนี้เปิดเผยภัยคุกคามต่อเครือข่าย Ethereum ที่มีอยู่ตั้งแต่ Merge จนถึง Dencun exhausting fork
พื้นหลัง
ก่อนการผสาน ขีดจำกัดขนาดข้อความที่แตกต่างกันสำหรับการสื่อสาร RPC ได้รับการตั้งค่าเพื่อปกป้องไคลเอ็นต์จากการโจมตีแบบปฏิเสธการให้บริการ (DOS) ขีดจำกัดเหล่านี้ซึ่งใช้กับข้อความที่ได้รับผ่านตำแหน่งข้อมูล HTTP จะถูกส่งต่อไปยัง API กลไก ซึ่งมีบทบาทสำคัญในการเชื่อมต่อไคลเอ็นต์ Execution และ Consensus Layer ในระหว่างการผลิตแบบบล็อก เนื่องจาก API ของเครื่องยนต์มีส่วนร่วมในการผลิตบล็อก จึงเป็นไปได้สำหรับบล็อกที่จะผลิตเกินขีดจำกัดขนาด RPC ของไคลเอ็นต์บางราย แต่ยังคงอยู่ในช่วงที่ยอมรับได้สำหรับไคลเอ็นต์อื่นๆ
หากผู้โจมตีสร้างข้อความที่เกินขนาดจำกัดของไคลเอนต์ด้วยการตั้งค่าต่ำสุด ในขณะที่ยังคงปฏิบัติตามข้อกำหนดขีดจำกัดของแก๊ส จากนั้นรอให้สร้างบล็อก อาจส่งผลให้เกิดสถานการณ์ที่ไคลเอนต์บางรายพิจารณาบล็อกนั้น ถูกต้อง ในขณะที่ผู้อื่นปฏิเสธ โดยออกรหัสข้อผิดพลาด HTTP “413: เนื้อหาใหญ่เกินไป”
ผลกระทบ
ผู้โจมตีที่สามารถสร้างข้อความเหล่านี้จะสามารถบังคับให้โหนดส่วนใหญ่ (=geth) ปฏิเสธการบล็อกที่ส่วนน้อยยอมรับได้ บล็อกเหล่านี้จะถูกแยกออกไปและผู้เสนอจะพลาดรางวัล
ในตอนแรกเราคิดว่าเป็นไปได้ที่จะสร้างบล็อกเหล่านี้โดยใช้ผู้สร้างหรือไคลเอนต์เวอร์ชันที่แก้ไขเท่านั้น Geth มีขีดจำกัดในการทำธุรกรรมอยู่ที่ 128KB ซึ่งหมายความว่าธุรกรรมขนาดใหญ่เช่นเดียวกับที่อยู่ระหว่างการสนทนาจะไม่จบลงในกลุ่มธุรกรรมของโหนด geth ใดๆ อย่างไรก็ตาม ยังคงเป็นไปได้ที่จะกระตุ้นขีดจำกัดโดยให้ไคลเอนต์ที่มีขีดจำกัดสูงกว่าเสนอบล็อก และ CL ร้องขอการตรวจสอบความถูกต้องของบล็อกที่ใหญ่กว่าที่เสนอนี้
เราเสนอวิธีแก้ปัญหาในการลดขีดจำกัด RPC บนไคลเอนต์ทั้งหมดลงชั่วคราวเป็นค่าต่ำสุด (5MB) สิ่งนี้จะทำให้การบล็อกไม่ถูกต้องและผู้โจมตีจะถูกจำกัดอย่างมากในความสับสนวุ่นวายที่อาจเกิดขึ้นในเครือข่าย เนื่องจากโหนดส่วนใหญ่จะปฏิเสธการบล็อกของพวกเขา
อย่างไรก็ตาม เมื่อวันที่ 7 กุมภาพันธ์ เราพบว่ามีความเป็นไปได้ที่จะสร้างบล็อกที่จะถึงขีดจำกัด 5MB ด้วยธุรกรรมจำนวนมากที่ต่ำกว่าขีดจำกัด 128KB และไม่เกิน 30 ล้านแก๊ซ
นี่เป็นปัญหาที่ใหญ่กว่าเพราะเราตระหนักว่าผู้โจมตีสามารถสร้างธุรกรรมที่จ่ายเงินสูงจำนวนมากและส่งพวกเขาไปยังเครือข่าย เนื่องจากเขาจ่ายเงินมากกว่าคนอื่นๆ ใน mempool ทุกโหนด (แม้แต่โหนด geth) จะรวมธุรกรรมการโจมตีไว้ในบล็อก ดังนั้นการสร้างบล็อกที่เครือข่ายส่วนใหญ่จะไม่ได้รับการยอมรับ ส่งผลให้เกิดการ fork จำนวนมาก (ถือว่าทั้งหมดถูกถือว่า ถูกต้องโดยโหนดส่วนน้อย) และห่วงโซ่จะจัดระเบียบใหม่ซ้ำแล้วซ้ำเล่า
ต่อมาในวันที่ 7 กุมภาพันธ์ เราได้ข้อสรุปว่าทุกคนที่เพิ่มขีดจำกัด RPC ของตนจะเป็นทางเลือกที่ปลอดภัยกว่า
เส้นเวลา
- 06-02-2024 13:00: Toni (EF), Pari (EF) และ Justin (Besu) พยายามส่งธุรกรรมที่มีรายละเอียดเฉพาะไปยังเครือข่าย ธุรกรรมนี้มีส่วนบล็อกสูงสุด 2.7 MB เมื่อบีบอัดอย่างรวดเร็ว
- 06-02-2024 13:25: Pari ได้รับข้อผิดพลาดจากโหนด Geth ในเครื่องของเขา แม้ว่าธุรกรรมควรจะถูกต้องก็ตาม
- 06-02-2024 15:14: Justin จัดการธุรกรรมในบล็อกและส่งผ่านไคลเอนต์ Besu
- 06-02-2024 20:46: Sam (EF) แจ้งเตือน Pari (ขอขอบคุณเป็นพิเศษสำหรับ ความลึกลับ บน X) โทนีและอเล็กซ์เกี่ยวกับโหนด Sepolia ที่กำลังดิ้นรน
- 06-02-2024 21:05: ทีมตรวจสอบอีกครั้งกับ Marius จาก Geth และยืนยันจุดบกพร่อง
- 06-02-2024 21:10: เพื่อนๆ รวมตัวกันเพื่อแก้ไขจุดบกพร่อง
- 07-02-2024 23:40: เราตัดสินใจให้ลูกค้าทุกรายจำกัดขีดจำกัดคำขอ RPC ไว้ที่ 5MB
- 07-02-2024 6:40: เราค้นพบว่าอาจมีปัญหาใหญ่กว่าและการโจมตีสามารถทำได้ด้วยธุรกรรมที่มีขนาดน้อยกว่า 128KB
- 07-02-2024 10:00: เราตัดสินใจให้ลูกค้าทุกรายเพิ่มขีดจำกัดคำขอ RPC
- 07-02-2024 21:00: การแก้ไขถูกรวมเข้ากับ geth
- 09-02-2024: เกทได้รับการปล่อยตัว
แม้ว่า Geth จะเป็นไคลเอ็นต์เพียงรายเดียวที่ได้รับผลกระทบจากจุดบกพร่องนี้ แต่ไคลเอ็นต์อื่นๆ ยังได้อัปเดตค่าเริ่มต้นของตนเพื่อให้ปลอดภัยจากการโจมตีนี้ แม้ว่าขีดจำกัดของก๊าซจะเพิ่มขึ้นก็ตาม ทีมลูกค้าระบุว่าการอัปเดตต่อไปนี้มีขีดจำกัด rpc ที่ปลอดภัย:
เก็ท: v1.13.12
คนร้าย: v1.25.4
เบซู: 24.1.2
เอริกอน: v2.58.0
รายละเอียด: v0.1.0-alpha.18