nonce ใน VPN คืออะไร และทำไมการใช้ซ้ำจึงทำให้อุโมงค์แตก
nonce คือค่าประจำแต่ละข้อความที่ต้องไม่ซ้ำภายใต้คีย์เดียว และโดยปกติมันเดินทางแบบเปิดเผย การแก้ไขด้วยมือคือข้อผิดพลาดที่ควรหลีกเลี่ยง
คนส่วนใหญ่พบคำว่า nonce ในโปรไฟล์ VPN และคิดว่าเป็นความลับร่วมอีกตัวที่ต้องคัดลอกระหว่างคู่สัญญา ไม่ใช่เช่นนั้น nonce คือค่าที่ต้องไม่ซ้ำภายใต้คีย์เดียวกัน และในการเข้ารหัสที่อิง nonce ส่วนใหญ่ มันเดินทางแบบเปิดเผย ความสับสนยังคงไม่เป็นอันตรายจนกว่าจะมีคนแก้ไขด้วยมือ และนั่นคือจุดที่ความเสียหายจริงเริ่มต้น
nonce มาจากไหนจริง ๆ
การเข้ารหัสที่ผ่านการรับรองความถูกต้องต้องใช้ nonce ที่ต่างกันสำหรับทุกข้อความที่เข้ารหัสภายใต้คีย์ โปรโตคอลตอบสนองข้อกำหนดนี้ด้วยวิธีต่าง ๆ เช่น ตัวนับที่เพิ่มขึ้นแบบโมโนโทนิก เกลือที่รวมกับตัวระบุแพ็กเก็ต หรือค่าสุ่มที่ยาวพอ IKEv2 แลกเปลี่ยน nonce ระหว่างการแลกเปลี่ยนเริ่มต้น และค่าเหล่านี้เป็นอินพุตสาธารณะสำหรับการสร้างคีย์ ไม่ใช่ความลับ
ความเป็นเอกลักษณ์อาจเป็นเชิงโครงสร้างหรือเชิงความน่าจะเป็น ตัวนับไม่สามารถซ้ำได้จนกว่าจะวนกลับ ซึ่งเป็นเหตุผลที่โปรโตคอลกำหนดจุดเปลี่ยนคีย์ไว้ล่วงหน้าไกลมาก ค่าสุ่มอาศัยบิตที่มากพอจนการชนกันไม่น่าเกิดขึ้นภายในขีดจำกัดข้อความ ซึ่งเป็นข้อโต้แย้งที่ต่างออกไปพร้อมโหมดความล้มเหลวที่ต่างกัน เอกสารโปรโตคอลระบุว่าใช้วิธีใด และทั้งสองวิธีปลอดภัยเฉพาะเมื่อเคารพขีดจำกัดที่ระบุไว้
| Design | Where uniqueness comes from | Exhaustion is handled by |
|---|---|---|
| AES-GCM records | An IV, typically a counter | Rekey before the counter wraps |
| ChaCha20-Poly1305 | A 96-bit nonce from a counter or generator | A message limit per key |
| WireGuard | A per-key 64-bit counter | Rekey at a message cap |
| OpenVPN AEAD | Packet identifier plus implicit key material | Rekey on the packet-id limit |
| IKEv2 | Fresh nonces per exchange | A new security association |
การใช้ซ้ำมีต้นทุนจริงคืออะไร
การใช้ nonce ซ้ำภายใต้คีย์เดียวไม่ใช่เรื่องประสิทธิภาพเล็กน้อย ด้วย GCM ข้อความสองข้อความที่ใช้ IV ร่วมกันทำให้ผู้สังเกตสามารถกู้คีย์รับรองความถูกต้องและคำนวณเอกซ์คลูซีฟออร์ของข้อความธรรมดาทั้งสองได้ โครงสร้างที่อิงสตรีมก็ใช้คีย์สตรีมซ้ำในลักษณะเดียวกัน ซึ่งเปลี่ยนข้อความเข้ารหัสให้เป็นปริศนาแทนที่จะเป็นความลับ
นี่คือเหตุผลที่ การใช้งานจริงเปลี่ยนคีย์ก่อนที่ตัวนับจะวนกลับ และเป็นเหตุผลที่มันหยุดแทนที่จะดำเนินต่อเมื่อสถานะไม่แน่นอน การรีบูตที่รีเซ็ตตัวนับในขณะที่คู่สัญญายังถือคีย์เก่า หรือเครื่องเสมือนที่กู้คืนจากสแนปช็อตที่ถ่ายกลางเซสชัน คือสถานการณ์ที่ขีดจำกัดมีอยู่เพื่อป้องกัน ไม่ต้องมีผู้โจมตี การดำเนินงานปกติก็เพียงพอ
ทำไมการแก้ไขด้วยมือจึงเป็นวิธีแก้ที่ผิด
ตัวนับ เกลือ และตัวระบุแพ็กเก็ตเป็นเครื่องสถานะที่ทั้งสองฝั่งใช้ร่วมกัน การเปลี่ยนฝั่งหนึ่งทำให้อีกฝั่งขาดการซิงโครไนซ์ และอุโมงค์ล้มเหลวในลักษณะที่ดูเหมือนปัญหาเส้นทาง สิ่งที่รองรับคือการแลกเปลี่ยนคีย์ใหม่ ซึ่งรีเซ็ตสถานะทั้งสองฝั่งพร้อมกัน
รหัสผ่านและ nonce ก็มีบทบาทต่างกัน รหัสผ่านเป็นอินพุตที่เป็นความลับสำหรับการสร้างคีย์ ส่วน nonce เป็นอินพุตสาธารณะต่อข้อความ ฟิลด์โปรไฟล์ที่ติดป้าย nonce และขอความลับยาว ๆ มักเป็นคีย์คงที่หรือความลับที่แบ่งปันล่วงหน้าภายใต้ชื่ออื่น ดังนั้นควรอ่านเอกสารของฟิลด์นั้นแทนการสันนิษฐาน
เมื่อคำแนะนำเกี่ยวกับการจัดการ nonce การแก้ไขคือเวอร์ชันที่ผู้ดูแลแก้ไขแล้ว ไม่ใช่การเข้ารหัสอื่นหรือคีย์ที่สั้นลง การเปลี่ยนการเข้ารหัสเพื่อหลีกเลี่ยงคำว่า nonce ย้ายปัญหาแทนที่จะแก้ไข
อ่านคำเตือนโดยไม่เดา
บรรทัดบันทึกเกี่ยวกับตัวนับหรือ nonce มักอธิบายสถานะที่สูญหาย ไม่ใช่การโจมตี ตรวจสอบว่าคู่สัญญาฝั่งหนึ่งรีสตาร์ตหรือไม่ เครื่องเสมือนที่โคลนใช้ตัวตนเดิมซ้ำหรือไม่ และทั้งสองฝั่งเห็นตรงกันเรื่องการตั้งค่าการเปลี่ยนคีย์หรือไม่ จากนั้นสร้างเซสชันใหม่และดูว่าข้อความกลับมาหรือไม่
แยกการวินิจฉัยออกจากความล้มเหลวที่ไม่เกี่ยวข้อง หน้าที่โหลดไม่ได้ หรือพรอมต์ข้อมูลรับรองที่วนซ้ำ ไม่ใช่หลักฐานของการใช้ nonce ซ้ำ และการปฏิบัติต่อมันเช่นนั้นจะทำให้คุณลงไปในชั้นการเข้ารหัสในขณะที่ปัญหาอยู่เหนือชั้นนั้น
สำหรับการใช้งานทั่วไป กฎที่ปลอดภัยนั้นสั้น: ให้การใช้งานจัดการ nonce รักษาทั้งสองฝั่งไว้บนเวอร์ชันที่รองรับ และถือว่าการรีเซ็ตสถานะใด ๆ เป็นเหตุผลในการเปลี่ยนคีย์แทนการแก้ไขค่า หากฟิลด์โปรไฟล์ไม่อยู่ในเอกสารของผู้ขาย อย่าสร้างค่าขึ้นมาเอง การซ่อมอุโมงค์เริ่มจากการรู้ว่าคุณกำลังดูชั้นไหน