2038 m. problema: 32 bitų Unix laiko perpildymas — kas tai ir sprendimai

2038 m. problema: sužinokite, kas yra 32 bitų Unix laiko perpildymas, kaip tai gali užliūliuoti sistemas ir kokie sprendimai (64 bitų laikas, atnaujinimai) apsaugos įrenginius.

Autorius: Leandro Alegsa

2038 m. problema — tai laiko saugojimo reperkūlija, atsirandanti sistemoje, kurioje laikas saugomas kaip 32 bitų sveikasis skaičius (signed int) nurodantis sekundžių skaičių nuo 1970-01-01 00:00:00 UTC (Unix epocha). Maksimali tokio 32 bitų skaičiaus reikšmė yra 2 147 483 647, tai atitinka 2038-01-19 03:14:07 UTC. Kitą sekundę skaitiklis perpildomas ir pirmoji reikšmė tampa -2 147 483 648, kas interpretuojama kaip 1901-12-13 20:45:52 UTC — t. y. laikas „nusisuka“ atgal.

Kaip ir kodėl tai vyksta

Linux, BSD, daug C bibliotekų ir kitų sistemų naudoja tipą time_t laiko žymoms. Tradiciškai time_t buvo 32 bitų ženklinis sveikasis skaičius. Kai pasiekiamas jo maksimalus užrašomas skaičius, seka overflow (perpildymas) — bitų derinys pereina į kraštinę reikšmę ir rezultatas interpretuojamas kaip neigiamas skaičius.

Taip nutinka ne dėl laikrodžio mechanizmo, o dėl to, kaip programa arba sistema skaitmeniniu būdu reprezentuoja sekundes.

Kam problema gali pakenkti

  • Senos operacinės sistemos ir programos, paleidžiamos 32 bitų aplinkoje arba naudojančios 32 bitų time_t (pvz., kai kurios įterptos sistemos, maršrutizatoriai, ATM, sensoriai, automobiliai, pramonės įrenginiai).
  • Duomenų bazės ar failų formatų sprendimai, kurie serijalizuoja laiką į 4 baitus (pvz., kai kurios senos TIMESTAMP realizacijos).
  • Tvarkaraščių ir planuotojų programos (cron, užduočių tvarkyklės), sertifikatų tikrinimo mechanizmai, žurnalavimo (log) įrašai ir bet kas, kas remiasi teisingu laiku.
  • Tinklo protokolai ar įrašų formatų aprašai, kuriuose laikas fiksuojamas 32 bitais.

Kokia yra rizika praktikoje

  • Programos gali pradėti duoti klaidas, suplanuotos užduotys gali nevykdyti arba vykdyti neteisingu laiku.
  • Saugumo mechanizmai, priklausantys nuo laiko (sertifikatų galiojimo, prisijungimų laiko žymos), gali neteisingai reaguoti.
  • Duomenų ir žurnalų interpretavimo klaidos (pvz., datų rūšiavimas, ataskaitos).

Sprendimai ir kaip problema jau sprendžiama

  • Perėjimas prie 64 bitų laiko: ilgalaikis sprendimas — naudoti 64 bitų time_t (tvarkymo intervalas tampa milžiniškas — apie 292 milijardus metų į priekį ir atgal). Daugelyje modernių 64 bitų sistemų laikas jau yra 64 bitų arba gali būti sukonfigūruotas taip.
  • Bibliotekų ir kompiliavimo pataisos: glibc ir kitos bibliotekos suteikė būdus kompiliuoti programoms su 64 bitų laiko tipu (pvz., naudojant _TIME_BITS=64 kompiliuojant). Taip pat atsirado atnaujinti API (laiko funkcijos), kurios naudoja 64 bitų sekas.
  • Linux branduolio palaikymas (time64): modernūs Linux branduoliai turi time64 syscall‘us ir suderintą palaikymą, kad 32 bitų vartotojo programos galėtų saugiai naudoti ilgą laiką be klaidų.
  • Protocol/formatų pataisos: pakeisti arba atnaujinti protokolus bei failų formatus, kurie naudoja 32 bitų sekundes (pvz., pereiti prie 64 bitų int arba tekstinio laiko formacijos).
  • Firmware atnaujinimai įterptoms sistemoms: gamintojai turi išleisti atnaujinimus, kurie saugo laiką 64 bitais arba kitaip apsaugo nuo overflow.

Praktiniai žingsniai — ką daryti dabar

  • Vartotojams: atnaujinkite savo operacines sistemas ir programas. Jei turite seną 32 bitų įrenginį (senas telefonas, maršrutizatorius, spausdintuvas, IoT įrenginys), patikrinkite ar gamintojas siūlo firmware atnaujinimą ar įsigykite naujesnį įrenginį.
  • Sistemų administratoriams: atlikite inventorizaciją — suraskite įrenginius, kurie vis dar naudoja 32 bitų vartotojo aplinką ar serijalizuotą 32 bitų laiką. Planavimas: atnaujinti, pakeisti arba izoliuoti kritinius 32 bitų įrenginius.
  • Programuotojams:
    • naudokite 64 bitų laiko tipus (time64, int64_t, struct timespec su 64 bitų tv_sec),
    • atidžiai patikrinkite serializaciją — binarinius formatus keiskite arba pridėkite versijas,
    • rekomenduojama testuoti programas nustatant sisteminį laikrodį artimam 2038 ribai ir stebėti elgesį.
  • Duomenų bazėms: patikrinkite, ar naudojami laiko tipai (pvz., MySQL TIMESTAMP) turi apribojimus. Jei taip — pertvarkykite į DATETIME ar 64 bitų laiko saugojimą.

Kaip patikrinti ar sistema yra pažeidžiama

  • Patikrinkite architektūrą: komanda uname -m (pvz., i386/i686 — 32 bitai, x86_64 — 64 bitai). 32 bitų vartotojo aplinka dažniau rizikuoja.
  • Išbandykite laiko ribą paleidę testą (Linux): date -d '@2147483647' -u turėtų grąžinti 2038-01-19 03:14:07 UTC. Jei sistema negali interpretuoti tokio įrašo arba elgiasi netikėtai, ji gali būti pažeidžiama.
  • Patikrinkite programos laiko tipo dydį su mažyte C programa:
    #include <stdio.h> #include <time.h> int main(){ printf("%zu\n", sizeof(time_t)); }
    Jei gražina 4, tai naudojamas 32 bitų time_t.
  • Peržiūrėkite įterptųjų įrenginių firmware specifikacijas arba kreipkitės į gamintoją.

Kiti svarbūs aspektai

  • Ne visi įrenginiai bus pataisyti centralizuotai — daug IoT/senų prietaisų gali likti pažeidžiami.
  • 2038 problema yra panaši į Y2K, bet skiriasi mastu: Y2K daug kur sprendėsi masiškai prieš 2000 metus, o 2038 sprendimai dalimis įdiegiami per ilgesnį laiką.
  • Jei jūsų programos bendrauja su kitomis sistemomis per tinklą, patikrinkite abipusį laiko formatą (pvz., NTP, SNTP, specialūs protokolai). NTP naudoja 64 bitų formatą (32 bitų sekundės + 32 bitų fractional part) ir turi savo rolingus periodus, todėl protokolo ypatingumų reikia žinoti atskirai.

Trumpa santrauka ir rekomendacijos

  • Kas sprendžia problemą: perėjimas prie 64 bitų laiko (time_t arba ekvivalento).
  • Kas jau padaryta: dauguma šiuolaikinių operacinių sistemų, bibliotekų ir serverių turi laikrodžio palaikymą 64 bitų lygmenyje arba siūlo pataisas.
  • Ką daryti dabar: inventorizuoti įrenginius ir programinę įrangą, atnaujinti OS/firmware, perkompiliuoti kritines programas su 64 bitų laiku, testuoti elgseną prie 2038 ribos ir pakeisti binarinius serijalizacijos formatus, jei jie naudoja 32 bitų sekundes.

Jei norite, galiu padėti: pateikti komandų sąrašą jūsų platformai patikrinti, parengti inventorizacijos šabloną ar patikrinti konkrečios programos/paketo ar įrenginio pažeidžiamumą — nurodykite platformą ar įrenginio modelį.

Animacija, kurioje rodoma, kaip būtų atstatoma data, išreikšta pasirašytu 32 bitų sveikuoju skaičiumi (2038 m. sausio 19 d. 03:14:08 UTC).Zoom
Animacija, kurioje rodoma, kaip būtų atstatoma data, išreikšta pasirašytu 32 bitų sveikuoju skaičiumi (2038 m. sausio 19 d. 03:14:08 UTC).



Ieškoti
AlegsaOnline.com - 2020 / 2025 - License CC3