Помилка в 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). /* sanity check week number, GPS epoch, against leap seconds * Does no work well with regressions because the leap_sconds * could be from the receiver, or from BUILD_LEAPSECONDS. */ if (0 < session->context->leap_seconds && 19 > session->context->leap_seconds && 2180 < week) { /* assume leap second = 19 by 31 Dec 2022 * so week > 2180 , Do not allow it */ week -= 1024; GPSD_LOG(LOG_WARN, &session->context->errout, «GPS week confusion. Adjusted week %u for leap %d\n», week, session->context->leap_seconds); }

Джерело: opennet.ru

Додати коментар або відгук