ข้ามไปยังเนื้อหา

การป้องกันการใช้ข้อความข้ามเชนซ้ำ

การป้องกันการใช้ซ้ำผูกข้อความต้นทางที่ยืนยันความแท้แล้วกับรุ่นโปรโตคอลและโดเมนปลายทางหนึ่งชุด พร้อมเปิดให้ลองใหม่ได้โดยไม่ยอมให้เกิดผลทางเศรษฐกิจที่สำเร็จเกินหนึ่งครั้ง

อัปเดต

จัดทำขึ้นเพื่อการศึกษาเท่านั้น ไม่ใช่คำแนะนำการลงทุน การลงทุนอาจทำให้สูญเสียเงินลงทุนได้

คำตอบโดยตรง

การป้องกันการใช้ข้อความข้ามเชนซ้ำทำให้ข้อความต้นทางที่ยืนยันความแท้แล้วหนึ่งข้อความสร้างผลทางเศรษฐกิจที่สำเร็จได้ไม่เกินหนึ่งครั้งในโดเมนปลายทางที่ตั้งใจไว้ ผู้ส่งต่ออาจนำส่งหลักฐานเดิมหลายครั้ง และความพยายามที่ล้มเหลวอาจลองใหม่ได้ แต่ข้อความที่เสร็จสมบูรณ์แล้วต้องไม่สร้างสินทรัพย์ ปลดล็อกสินทรัพย์ หรือเรียกผู้รับซ้ำ

ความแท้จริง ความเป็นที่สุด และการป้องกันการใช้ซ้ำเป็นการตรวจคนละส่วน ลายมือชื่อที่ถูกต้อง คำรับรองของผู้ตรวจสอบ หรือหลักฐานการจัดเก็บ อาจยืนยันข้อมูลได้โดยไม่พิสูจน์ว่าเหตุการณ์ต้นทางเป็นที่สุดแล้ว มีการผูกปลายทางและผู้รับที่ตั้งใจไว้ หรือปลายทางยังไม่เคยประมวลผลข้อความนั้น เช่นเดียวกัน ผู้ส่งต่อที่ได้รับอนุญาตเป็นเพียงเส้นทางนำส่ง ตัวตนของผู้ส่งต่อใช้แทนการยืนยันความแท้ของข้อความไม่ได้

ไม่มี messageId ข้ามเชนที่ใช้ร่วมกันได้ทุกระบบ ข้อกำหนดของแต่ละโปรโตคอลเป็นผู้กำหนดการจัดเรียงข้อมูลและอัตลักษณ์ที่แน่นอน ซองข้อความที่รัดกุมมักผูกโปรโตคอลและรุ่น โดเมนต้นทางและผู้ส่งข้อความหรือผู้ปล่อยเหตุการณ์ ผู้ส่งต้นทาง nonce หรืออัตลักษณ์ธุรกรรมหรือล็อกต้นทาง โดเมนปลายทางและผู้รับ มูลค่า payload และวันหมดอายุ Wormhole, CCTP, Optimism และ ERC-5164 ใช้ฟิลด์และกลไกสถานะต่างกัน จึงนำตัวระบุมาใช้แทนกันไม่ได้

กลไกการทำงาน

การกระทำบนต้นทางปล่อยหรือจัดเก็บข้อความ หลังผ่านนโยบายการยืนยันหรือความเป็นที่สุดที่กำหนด ผู้ตรวจสอบ ผู้พิทักษ์ หรือระบบพิสูจน์จึงยืนยันความแท้ ที่ปลายทาง ตัวตรวจสอบจะตรวจรากหรือชุดลายมือชื่อที่เกี่ยวข้อง รุ่นโปรโตคอล ผู้ส่งระยะไกลที่เชื่อถือได้ ปลายทาง ผู้รับ payload และขอบเขตเวลา ผู้รับคำนวณอัตลักษณ์ตามที่โปรโตคอลกำหนดและตรวจสถานะการประมวลผลถาวรก่อนสร้างผลภายนอก

การนำส่งมักรับประกันอย่างน้อยหนึ่งครั้ง ขณะที่ผลทางธุรกิจที่ต้องการควรเกิดขึ้นจริงเพียงครั้งเดียว กลไกสถานะที่มีประโยชน์จะแยกสถานะยังไม่เคยลอง กำลังประมวลผล ล้มเหลวหรือลองใหม่ได้ และสำเร็จหรือใช้แล้ว การเรียกปลายทางที่ล้มเหลวไม่ใช่การโจมตีด้วยการใช้ซ้ำโดยอัตโนมัติ ตัวอย่างเช่น ERC-5164 กำหนดให้ข้อความสำเร็จได้ไม่เกินหนึ่งครั้ง แต่ยอมให้ลองอีกครั้งหลังล้มเหลว ทั้งนี้กฎการลองใหม่ การจัดการ gas และการบันทึกมูลค่าของแต่ละผลิตภัณฑ์ยังคงเป็นตัวกำหนด

ควรตั้งค่าสถานะป้องกันการใช้ซ้ำหรือตัวควบคุมการประมวลผลก่อนเรียกภายนอกที่ไม่น่าเชื่อถือ พร้อมควบคุมการเรียกกลับซ้ำ หากธุรกรรมทั้งรายการย้อนกลับ การเปลี่ยนสถานะนั้นมักย้อนกลับด้วย ทำให้ยังมีเส้นทางลองใหม่ที่กำหนดชัดเจน หากโปรโตคอลตั้งใจดักความล้มเหลวของระบบปลายทาง ต้องบันทึกสถานะล้มเหลวแยกต่างหากโดยไม่เก็บมูลค่าหรือผลบางส่วนไว้โดยไม่ตั้งใจ ผู้รับควรให้ผลลัพธ์เดิมเมื่อเรียกซ้ำด้วย หากระบบปลายทางอาจถูกเรียกผ่านเส้นทางอื่น

ขอบเขตของ nonce มีความสำคัญ nonce แบบเรียงลำดับบังคับลำดับได้ แต่ข้อความที่หายไปอาจกีดขวางข้อความถัดไป nonce แบบไม่เรียงลำดับหรือบิตแมปเปิดให้ส่งอย่างอิสระ แต่ต้องคำนวณ word และ bit อย่างแม่นยำ การออกแบบแบบกลุ่มต้องระบุว่าทั้งกลุ่มเป็นอะตอมหรือแต่ละ leaf มีหลักฐานและสถานะประมวลผลของตนเอง การทำเครื่องหมายเพียงรากของกลุ่มว่าใช้แล้วหลังประมวลผลบางส่วนอาจทำให้ leaf ที่สำเร็จเกิดซ้ำหรือทำให้ leaf ที่ล้มเหลวติดค้าง

นโยบายการจัดระเบียบเชนต้นทางใหม่เป็นส่วนหนึ่งของความปลอดภัยจากการใช้ซ้ำ ข้อสังเกตที่ลงนามก่อนมีความเป็นที่สุดเพียงพออาจยังถูกต้องทางวิทยาการเข้ารหัส แม้ภายหลังเหตุการณ์ต้นทางจะไม่อยู่บนเชนหลักแล้ว การอัปเกรดเป็นอีกขอบเขตหนึ่ง โครงสร้างพื้นที่จัดเก็บของพร็อกซี แมปข้อความที่ประมวลผลแล้ว โดเมนรุ่น จุดเข้าระบบเดิม การหมุนเวียนเพียร์ การแยกเชน หรือการใช้ chain ID ซ้ำ ต้องรักษาหรือยกเลิกอัตลักษณ์เดิมโดยเจตนา โดยไม่เปิดข้อความที่ใช้แล้วให้ใช้ซ้ำ

ใช้ขั้นตอนดังต่อไปนี้:

  1. ตรึงโปรโตคอล รุ่นที่ติดตั้ง โดเมนต้นทางและปลายทาง ผู้ส่งข้อความหรือผู้ปล่อยเหตุการณ์ที่เชื่อถือได้ ผู้ส่ง ผู้รับ มูลค่า payload nonce หรืออัตลักษณ์เหตุการณ์ และความหมายของวันหมดอายุ
  2. สร้างการเข้ารหัสตามมาตรฐานและเวกเตอร์ทดสอบ messageId ตามข้อกำหนดขึ้นใหม่ ปฏิเสธการต่อข้อมูลที่กำกวม ฟิลด์ที่ถูกละ และสมมติฐานที่ยืมจากบริดจ์อื่น
  3. ตรวจการรวมข้อมูลต้นทางและนโยบายความเป็นที่สุดหรือการยืนยันที่กำหนด จากนั้นตรวจรากหลักฐาน องค์ประชุมลายมือชื่อ ชุดผู้ตรวจสอบหรือผู้พิทักษ์ และรุ่นให้ถูกต้อง
  4. ตรวจปลายทาง ผู้รับ ผู้ส่งข้ามโดเมน มูลค่า payload และวันหมดอายุแยกจากกัน ให้ถือผู้ส่งต่อที่ยื่นข้อมูลเป็นผู้ขนส่ง ไม่ใช่ผู้มีอำนาจ
  5. อ่านสถานะข้อความถาวรและเข้าสู่สถานะกำลังประมวลผลหรือใช้แล้วก่อนเรียกภายนอกที่ไม่น่าเชื่อถือ พร้อมการป้องกันการเรียกกลับซ้ำและการทดสอบพฤติกรรมเมื่อธุรกรรมย้อนกลับอย่างชัดเจน
  6. กำหนดการเปลี่ยนสถานะสำเร็จ ล้มเหลว และลองใหม่ได้ พฤติกรรม nonce แบบเรียงลำดับหรือบิตแมป ความเป็นอะตอมของกลุ่ม และการบันทึกมูลค่า พิสูจน์ว่าการนำส่งซ้ำไม่ทำให้ leaf ที่สำเร็จเกิดซ้ำ
  7. ทดสอบการอัปเกรด การย้ายพื้นที่จัดเก็บ การปิดจุดเข้าระบบเดิม การหมุนเวียนเพียร์ การแยกเชน และการกู้คืนฉุกเฉิน จากนั้นกระทบยอดใบรับ เหตุการณ์ สถานะที่ประมวลผลแล้ว และยอดคงเหลือปลายทาง

ตัวอย่าง

  • การผูกโดเมนปลายทาง คำสั่งสองรายการมี nonce 42 และมูลค่า 1,000 เท่ากัน แต่รายการหนึ่งมุ่งไปเชน 10 และอีกรายการมุ่งไปเชน 8453 ตัวระบุที่ไม่รวมปลายทางจะถือ 2 messages เป็นตัวเลือกการชนกันหนึ่งรายการ ส่วนการเข้ารหัสมาตรฐานที่ผูกปลายทางจะสร้าง 2 distinct IDs ฟังก์ชันแฮชและรูปแบบโดเมนจริงต้องมาจากโปรโตคอล
  • บิตแมปแบบไม่เรียงลำดับ สำหรับ nonce 513 จะได้ word = floor(513 / 256) = 2, bit = 513 mod 256 = 1 และ mask = 1 << 1 = 2 ความสำเร็จครั้งแรกเปลี่ยน word ของบิตแมป 2 จาก 0 เป็น 2 รายการซ้ำพบ 2 & 2 = 2 จึงถูกปฏิเสธ ขณะที่ nonce 512 ใช้ bit 0 แยกกัน
  • การลองใหม่ไม่ใช่ผลครั้งที่สอง ข้อความที่ยืนยันความแท้เดียวกันถูกนำส่ง 3 ครั้ง การเรียกปลายทางที่ใช้ gas 110,000 และ 125,000 ล้มเหลวและย้อนกลับ ส่วนครั้งที่สามใช้ gas 140,000 และสำเร็จหนึ่งครั้ง gas รวมคือ 110,000 + 125,000 + 140,000 = 375,000 ที่ 20 gwei เท่ากับ 0.0075 ETH การนำส่งเท่ากับ 3 แต่ผลทางธุรกิจที่สำเร็จเท่ากับ 1
  • การบันทึกกลุ่มบางส่วน leaf ที่ดำเนินการแยกกันได้ 4 รายการมี 25 + 40 + 15 + 20 = 100 หน่วย leaf 0, 1 และ 3 สำเร็จเป็น 25 + 40 + 20 = 85 ส่วน leaf 2 ล้มเหลวและเหลือ 15 รอดำเนินการ การใช้เฉพาะรากของกลุ่มจะทำให้ 15 ติดค้าง ส่วนการลองทั้งกลุ่มใหม่โดยไม่มีสถานะราย leaf อาจทำให้ 85 เกิดซ้ำ ให้ใช้การย้อนกลับแบบอะตอมหรือสถานะที่ประมวลผลแล้วราย leaf ตามข้อกำหนด

ความเสี่ยง

  • ตัวระบุไม่รวมเชนหรือโดเมนปลายทาง
  • ตัวระบุไม่รวมผู้ส่งข้อความหรือผู้ปล่อยเหตุการณ์ต้นทาง
  • โดเมนไม่มีรุ่นโปรโตคอลหรือรุ่นข้อความ
  • ขอบเขต nonce ชนกันระหว่างผู้ส่งหรือการติดตั้ง
  • การเข้ารหัสแบบอัดแน่นที่กำกวมทำให้ชุดฟิลด์ต่างกันชนกัน
  • การแยกเชนหรือ chain ID ที่ใช้ซ้ำทำให้โดเมนเก่ากลับมาใช้ได้
  • เหตุการณ์ต้นทางถูกรับก่อนมีความเป็นที่สุดเพียงพอแล้วถูกจัดออกจากเชนหลัก
  • มีการยอมรับรากหลักฐาน ชุดผู้ตรวจสอบ หรือชุดผู้พิทักษ์ที่ผิด
  • โดเมนลายมือชื่อเก่ายังใช้ได้หลังอัปเกรด
  • พื้นที่จัดเก็บพร็อกซีเสียหายจนรีเซ็ตหรือทำให้สถานะข้อความทับซ้อนกัน
  • การย้ายข้อมูลละเว้นข้อความที่ใช้แล้วหรือยังเปิดจุดเข้าระบบเดิม
  • มีการทำเครื่องหมายสถานะหลังเรียกภายนอกเท่านั้น จึงเปิดให้เรียกกลับซ้ำ
  • การเรียกที่ล้มเหลวถูกทำเครื่องหมายว่าสำเร็จและลองใหม่ไม่ได้
  • การเรียกที่สำเร็จไม่ถูกบันทึกและสร้างผลทางเศรษฐกิจซ้ำ
  • nonce แบบเรียงลำดับที่หายไปกีดขวางข้อความถัดไปทั้งหมด
  • การคำนวณ word, bit หรือการยกเลิกในบิตแมปผิด
  • สถานะรากของกลุ่มขัดกับการประมวลผลบางส่วนราย leaf
  • การลองใหม่ทำให้ leaf ที่สำเร็จแล้วเกิดซ้ำ
  • มีการอ่านหน่วยของเส้นตาย วันหมดอายุ หรือนาฬิกาปลายทางผิด
  • มีการเข้าใจผิดว่า allowlist ผู้ส่งต่อคือการอนุญาตข้อความ

ความเข้าใจผิดที่พบบ่อย

  • nonce เพียงอย่างเดียวไม่ซ้ำกันทั่วโลก ผู้ส่ง โปรโตคอล การติดตั้ง และโดเมนต้นทางกับปลายทางเป็นตัวกำหนดขอบเขตของ nonce
  • มีเพียงผู้ส่งต่อที่ได้รับอนุญาตเท่านั้นที่ป้องกันการใช้ซ้ำได้ ผู้ส่งต่อมีหน้าที่นำส่ง การตรวจที่ปลายทางและสถานะใช้แล้วแบบถาวรต่างหากที่บังคับอำนาจและควบคุมการใช้ซ้ำ
  • การนำส่งซ้ำทุกครั้งเป็นการโจมตี เครือข่ายที่นำส่งอย่างน้อยหนึ่งครั้งอาจลองข้อความที่ล้มเหลวใหม่ เงื่อนไขคงที่คือเกิดผลสำเร็จได้ไม่เกินหนึ่งครั้ง
  • หลักฐานหรือลายมือชื่อที่ถูกต้องพิสูจน์ความเป็นที่สุดและเจตนา หลักฐานอาจไม่ผูกเป้าหมายที่ตั้งใจไว้ ผูกรุ่นผิด หรือรับรองสถานะต้นทางที่ถูกจัดระเบียบใหม่ภายหลัง
  • ธุรกรรมบริดจ์ที่สำเร็จพิสูจน์ว่าเสร็จเพียงครั้งเดียว ต้องตรวจสถานะใบรับ พื้นที่จัดเก็บการประมวลผล เหตุการณ์ผู้รับ และยอดคงเหลือจริง รวมถึง leaf ทุกใบในกลุ่ม

หัวข้อที่เกี่ยวข้อง

แหล่งข้อมูล

การนำทาง

ค้นหาในวิกิ...