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

นาฬิกาสองเรือนมีความสำคัญที่นี่ และการแก้ไขเรือนที่มองเห็นได้คือส่วนที่ผู้คนทำก่อน เรือนที่มักต้องการความสนใจคืออีกเรือนหนึ่ง

รหัสเป็นฟังก์ชันของเวลา ไม่ใช่รหัสผ่าน

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

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

นาฬิกาสองเรือนต้องตรงกัน ไม่ใช่เรือนเดียว

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

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

การขยายหน้าต่างมีต้นทุนอะไร

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

การแก้ไขนาฬิกาคือการซ่อม ส่วนการขยายหน้าต่างคือยาระงับ อย่างแรกขจัดสาเหตุ ส่วนอย่างที่สองซ่อนมันไว้

ตรวจสอบนาฬิกาทั้งสองเรือนก่อนลองใหม่

อ่านเวลาบนอุปกรณ์และบนเซิร์ฟเวอร์ แล้วเปรียบเทียบความคลาดเคลื่อนแทนเวลาท้องถิ่นที่แสดง คำสั่งด้านล่างแสดงสถานะการซิงโครไนซ์และเวลา UTC ดิบบนโฮสต์หรือเซิร์ฟเวอร์ลินุกซ์ ควรรันทั้งสองปลายก่อนเปลี่ยนการตั้งค่าการพิสูจน์ตัวตนใด ๆ

timedatectl
date -u +'%Y-%m-%dT%H:%M:%SZ'
chronyc tracking
timedatectl timesync-status

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

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

บทความที่เกี่ยวข้อง