SYS TEC - bLog

Wissenswert: Problem 2038

| News

März 2022

In Unix-basierten Systemen, wie z. B. Linux oder BSD, wird für die Zeit die sogenannte Unixzeit als Standard verwendet. Die Unixzeit ist dabei definiert durch die Anzahl an vergangenen Sekunden seit dem 1. Januar 1970, 00:00:00 Uhr UTC, wodurch sich beispielsweise für den 1. Januar 2022, 00:00:00 Uhr UTC eine Unixzeit von 1640991600 Sekunden ergibt. [1]

In den Unix-artigen Systemen wurde und wird zum Teil immer noch diese Unixzeit in Form einer vorzeichenbehafteten 32-Bit Ganzzahl gespeichert, wodurch sich eine maximale Kapazität von 2.147.483.647 Sekunden bzw. knapp 68 Jahren ergibt.
 Ausgehend vom Startzeitpunkt, dem 1. Januar 1970, 00:00:00 Uhr UTC, wird diese maximale Kapazität am 19. Januar 2038 um 03:14:07 Uhr UTC erreicht und in der darauffolgenden Sekunde überschritten. Die unmittelbare Folge aus einem solchen Zählerüberlauf wäre die Änderung des Vorzeichens und damit einhergehend der Sprung zurück auf den 13. Dezember 1901, 20:45:52 Uhr UTC innerhalb der betroffenen Systeme.

Während für Systeme auf Basis von 64-Bit Architekturen dieses Problem aufgrund der Vergrößerung der Kapazität auf die einer 64-Bit Ganzzahl nur bedingt relevant ist, sind vor allem Systeme auf Basis von 32-Bit Architekturen gefährdet am 19. Januar 2038 ein unvorhersehbares, möglicherweise fehlerhaftes Verhalten zu zeigen [2].
Insbesondere im Bereich der eingebetteten Systeme hat dieses Problem eine besondere Relevanz, da eingebettete Systeme einerseits sehr lange geplante Lebenszeiten von häufig mehreren Jahrzehnten haben und andererseits auch heute noch ein großer Teil der verbauten Hardware auf 32-Bit Architekturen basieren.

Als Ansatz, um dieses Problem zu umgehen, hat sich die Umstellung des Datentyps der Unixzeit von einer 32-Bit auf eine 64-Bit Ganzzahl auch bei Betriebssystemen für 32-Bit Architekturen bewährt. Während diese Umstellung bei einigen Betriebssystemen bereits sehr früh erfolgte, wie beispielsweise bei NetBSD mit Version 6.0 im Jahr 2012 oder bei OpenBSD mit Version 5.5 im Jahr 2014, unterstützt der Linux Kernel erst seit 2020 mit der Version 5.6 64-Bit Datentypen für die Zeit auf 32-Bit Architekturen [3] [4] [5].

Trotz der Umstellung auf 64-Bit Datentypen innerhalb der Kernel bestehen für gesamte Betriebssysteme nach wie vor noch einige Hürden, u.a.:

  • Betroffene Softwarebibliotheken, allen voran die Implementierungen der C-StandardBibliothek, müssen auf die neuen 64-Bit Datentypen und Systemaufrufe angepasst werden.
          - musl libc: vollständige Unterstützung der neuen Datentypen und Systemaufrufen seit Version 1.2 [6] 
          - glibc: neue Datentypen und Systemaufrufe werden seit Version 2.32 implementiert, aber auch aktuell mit Version 2.34 noch nicht vollständig unterstützt [7] [8]
  • Sämtliche Programme bzw. Anwendungen, die auf diesen betroffenen Bibliotheken basieren, müssen mit den angepassten Versionen der Bibliotheken neu kompiliert werden.
  • Bei Anwendungen in denen von den Änderungen betroffene direkte Systemaufrufe genutzt werden ist eine entsprechende Anpassung notwendig.
  • Betroffene Dateisysteme, beispielsweise ext2, ext3 und zum Teil auch ext4, müssen gegebenenfalls angepasst oder durch andere ersetzt werden.

Obwohl es auch im Userspace bereits einige Fortschritte im Hinblick auf das 2038 Problem gibt, wie beispielsweise die zum Teil vorhandene Implementierung und Unterstützung der neuen 64-Bit Datentypen und Systemaufrufe durch die C-Standard-Bibliotheken, fehlen an einigen Stellen nach wie vor die Voraussetzungen, um sowohl bestehende als auch neue Systeme auf Basis von 32-Bit Architekturen vor fehlerhaftem Verhalten im Jahr 2038 zu bewahren.

Wir werden die kommenden Entwicklungen in diesem Bereich weiter aufmerksam verfolgen und Sie zeitnah informieren, sobald die für ein entsprechendes Handeln notwendigen Voraussetzungen geschaffen wurden.


Verweise

[1] Hrsg.: The Open Group, „General Concepts,“ [Online]. Available: pubs.opengroup.org/onlinepubs/009695399/xrat/xbd_chap04.html. [Zugriff am 17 Februar 2022].

[2] Hrsg.: The Open Group, „64-bit and Data Size Neutrality,“ [Online]. Available: unix.org/whitepapers/64bit.html. [Zugriff am 17 Februar 2022].

[3] Hrsg.: OpenBSD, „OpenBSD 5.5 Changelog,“ [Online]. Available: www.openbsd.org/plus55.html. [Zugriff am 17 Februar 2022].

[4] Hrsg.: NetBSD, „Announcing NetBSD 6.0,“ [Online]. Available: www.netbsd.org/releases/formal-6/NetBSD-6.0.html. [Zugriff am 17 Februar 2022].

[5] A. Bergmann, „[GIT PULL] y2038: core, driver and file system changes,“ [Online]. Available: lkml.org/lkml/2020/1/29/355. [Zugriff am 17 Februar 2022].

[6] Hrsg.: musl libc, „musl time64 Release Notes,“ [Online]. Available: musl.libc.org/time64.html. [Zugriff am 17 Februar 2022].

[7] Hrsg.: GNU - Free Software Foundation, „The GNU C Library version 2.32 is now available,“ 6 August 2020. [Online]. Available: sourceware.org/pipermail/libc_announce/2020/000029.html. [Zugriff am 17 Februar 2022].

[8] Hrsg.: GNU - Free Software Foundation, „The GNU C Library: 64-bit time symbol handling in the GNU C Library,“ [Online]. Available: www.gnu.org/software/libc/manual/html_node/64_002dbit-time-symbol-handling.html. [Zugriff am 17 Februar 2022].