ข้อผิดพลาดใน GPSD วันอาทิตย์นี้ จะทำให้ย้อนเวลากลับไป 19 ปี

พบปัญหาร้ายแรงในแพ็คเกจ GPSD ซึ่งใช้ในการดึงข้อมูลเวลาและตำแหน่งที่แม่นยำจากอุปกรณ์ GPS เนื่องจากเวลาจะเปลี่ยนกลับไป 24 สัปดาห์ในวันที่ 1024 ตุลาคม กล่าวคือ เวลาจะเปลี่ยนเป็นเดือนมีนาคม พ.ศ. 2002 ปัญหานี้ปรากฏในรุ่น 3.20 ถึง 3.22 และได้รับการแก้ไขใน GPSD 3.23 ผู้ใช้ระบบทั้งหมดที่ใช้ GPSD จำเป็นต้องติดตั้งการอัปเดตทันที หรือเตรียมพร้อมสำหรับความล้มเหลว

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

โปรโตคอล GPS ประกอบด้วยตัวนับสัปดาห์ที่นับสัปดาห์ตั้งแต่วันที่ 5 มกราคม 1980 ปัญหาคือในระหว่างการออกอากาศจะมีการจัดสรรเพียง 10 บิตสำหรับตัวนับนี้ ซึ่งหมายความว่าล้นทุก ๆ 1023 สัปดาห์ (19.7 ปี) ภาวะล้นครั้งแรกเกิดขึ้นในปี 1999 ครั้งที่สองในปี 2019 และครั้งที่สามจะเกิดขึ้นในปี 2038 เหตุการณ์เหล่านี้ได้รับการตรวจสอบโดยผู้ผลิตและมีการจัดการพิเศษไว้สำหรับเหตุการณ์เหล่านี้ ในปัจจุบัน รูปแบบข้อความ GPS ใหม่ (CNAV) ได้รับการแนะนำแบบขนาน โดยจะมีการจัดสรร 13 บิตสำหรับตัวนับ (เช่น คาดว่าจะล้นในปี 2137 เท่านั้น)

ใน GPSD ในตรรกะสำหรับการปรับลักษณะของวินาทีพิเศษ (เพิ่มเพื่อซิงโครไนซ์นาฬิกาอะตอมอ้างอิงของโลกกับเวลาทางดาราศาสตร์ของโลก) มีข้อผิดพลาดเกิดขึ้นเนื่องจากในวันที่ 24 ตุลาคม 2021 1024 จะถูกลบออกก่อนเวลาอันควรจาก ตัวนับสัปดาห์ ตามที่ผู้เขียนรหัสระบุว่า การเปลี่ยนแปลงควรจะเกิดขึ้นในวันที่ 31 ธันวาคม 2022 แต่การแปลวันที่นี้เป็นจำนวนสัปดาห์ไม่ได้ดำเนินการอย่างถูกต้อง และจริงๆ แล้วจำนวนสัปดาห์ที่ระบุในเช็คนั้นต่ำกว่าเดือนตุลาคม 2021 (ค่าที่ระบุคือ 2180 แทนที่จะเป็น 2600) /* หมายเลขสัปดาห์ตรวจสอบสุขภาพจิต, ยุค GPS เทียบกับวินาทีอธิกสุรทิน * ทำงานได้ไม่ดีกับการถดถอยเนื่องจาก leap_sconds * อาจมาจากเครื่องรับ หรือจาก BUILD_LEAPSECONDS */ if (0 < session->context->leap_seconds && 19 > session->context->leap_seconds && 2180 < week) { /* ถือว่าวินาทีกระโดด = 19 ภายในวันที่ 31 ธันวาคม 2022 * ดังนั้น week > 2180 จะเป็นไปในอนาคต ไม่อนุญาตให้ */ สัปดาห์ -= 1024; GPSD_LOG(LOG_WARN, &session->context->errout, "ความสับสนของสัปดาห์ GPS ปรับสัปดาห์ %u สำหรับการก้าวกระโดด %d\n", สัปดาห์, เซสชัน->บริบท->leap_seconds); }

ที่มา: opennet.ru

เพิ่มความคิดเห็น