Nach sechsmonatiger Entwicklung wurde die Version der GNU C Library (glibc) 2.39 veröffentlicht, die vollständig den Anforderungen der Standards ISO C11 und POSIX.1-2017 entspricht. In dieser neuen Version sind Korrekturen von 67 Entwicklern enthalten.
Zu den Verbesserungen in Glibc 2.39 gehören:
- Die Unterstützung des Shadow Stacks, der mit dem Linux-Kernel 6.6 eingeführt wurde, ermöglicht es, viele Exploits zu blockieren, indem die Hardware-Funktionen von Intel-Prozessoren zum Schutz gegen die Überschreibung der Rücksprungadresse in Fällen von Pufferüberlauf im Stack genutzt werden. Der Schutzmechanismus besteht darin, dass nach Übergabe der Steuerung an eine Funktion die Rücksprungadressen nicht nur im normalen Stack, sondern auch in einem separaten "Shadow-Stack" gespeichert werden, der nicht direkt verändert werden kann. Beim Verlassen der Funktion wird die Rücksprungadresse aus dem Shadow-Stack extrahiert und mit der Rücksprungadresse aus dem Hauptstack abgeglichen. Eine Abweichung der Adressen führt zur Generierung einer Ausnahme, die Situationen blockiert, in denen ein Exploit die Adresse im Hauptstack überschreiben konnte. Zum Aktivieren wurde die Build-Option "—enable-cet" hinzugefügt.
- Eine neue Header-Datei wurde hinzugefügt, die im Entwurf des ISO C2X Standards definiert ist und Funktionen wie stdc_leading_zeros, stdc_leading_ones, stdc_trailing_zeros, stdc_trailing_ones, stdc_first_leading_zero, stdc_first_leading_one, stdc_first_trailing_zero, stdc_first_trailing_one, stdc_count_zeros, stdc_count_ones, stdc_has_single_bit, stdc_bit_width, stdc_bit_floor und stdc_bit_ceil in den Typvarianten „unsigned char“, „unsigned short“, „unsigned int“, „unsigned long int“ und „unsigned long long int“ enthält.
- Für die Linux-Plattform wurden die Funktionen posix_spawnattr_getcgroup_np und posix_spawnattr_setcgroup_np sowie das Flag POSIX_SPAWN_SETCGROUP implementiert, die es ermöglichen, cgroupv2 im neuen Prozess über die Funktionen posix_spawn und posix_spawnp zu konfigurieren, ohne ein Race Condition zu verursachen. Diese Funktionen sind GNU-Erweiterungen und erfordern einen Linux-Kernel mit Unterstützung für den Systemaufruf clone3.
- Für die Linux-Plattform wurden die Funktionen pidfd_spawn und pidfd_spawp implementiert, die semantisch der Funktion posix_spawn ähnlich sind, jedoch nicht die Prozess-ID (PID) zurückgeben, sondern einen Dateideskriptor für die Verwendung in Funktionen, die den PIDFD-Mechanismus unterstützen, wie pidfd_send_signal, poll und waitid. (PIDFD ist an einen bestimmten Prozess gebunden und ändert sich nicht, während die PID an einen anderen Prozess gebunden werden kann, nachdem der aktuelle Prozess, der mit dieser PID assoziiert ist, beendet wurde.)
- Für die Linux-Plattform wurde die Funktion pidfd_getpid hinzugefügt, um die Prozess-ID (PID) auf der Grundlage des von den Funktionen pid_spawn, fork_np und pidfd_open zurückgegebenen Prozess-Dateideskriptors (PIDFD) zu ermitteln.
- In der scanf-Familie von Funktionen wurde der Größenmodifikator „wN“ hinzugefügt, der für Argumente mit den Typen intN_t, int_leastN_t, uintN_t und uint_leastN_t angewendet wird. Zum Beispiel kann für das Lesen von Dezimalwerten mit den Typen int32_t und int_least32_t „%w32d“ angegeben werden, während für hexadezimale Werte „%w32x“ verwendet wird. Ebenso wurde der Modifikator „wfN“ für die Typen int_fastN_t und uint_fastN_t, die im Entwurfstandard ISO C2X vorgestellt wurden, hinzugefügt.
- Die Einstellung „glibc.cpu.plt_rewrite“ wurde hinzugefügt, um die PLT (Procedure Linkage Table) auf x86-64-Systemen zu überschreiben, bei der der Linker indirekte Verzweigungen in der PLT durch direkte ersetzt.
- Die Einstellung „glibc.mem.decorate_maps“ wurde hinzugefügt, um zusätzliche Informationen zur Speicherzuweisung bereitzustellen, z.B. über den von der Funktion pthread_create erstellten Thread-Stack oder den über malloc zugewiesenen Speicher.
- In der Struktur „statvfs“ wird das Feld „f_type“ nun mit Informationen über den FS-Typ gefüllt, die dem Inhalt des Feldes in der Struktur „statfs“ entsprechen. Zuvor wurde im Linux-Feld „f_type“ immer 0 eingetragen.
- Für die AArch64-Plattform wurden in libmvec und math.h Annotations hinzugefügt, die es ermöglichen, bei der Angabe der Options „-ffast-math“ Vektorisierung bei der Kompilierung in GCC 9 und neueren Compiler-Versionen zu nutzen. Die Vektorisierung wird für mathematische Funktionen wie acos, acosf, asin, asinf, atan, atanf, atan2, atan2f, cos, cosf, exp, expf, exp10, exp10f, exp2, exp2f, expm1, expm1f, log, logf, log10, log10f, log1p, log1pf, log2, log2f, sin, sinf, tan und tanf aktiviert.
- Die Bibliothek libcrypt und die dazugehörige Header-Datei „“ wurden entfernt. Entwicklern wird empfohlen, auf alternative Bibliotheken wie libxcrypt umzusteigen.
- In der Utility ldconfig werden jetzt Dateien mit dem Symbol ';' im Dateinamen oder die auf «.dpkg.tmp» und «.dpkg.new» enden, übersprungen, was die Verarbeitung temporärer Dateien von den Paketmanagern rpm und dpkg verhindert.
- Die Unterstützung für die Architektur ia64 (ia64*-*-linux-gnu), die in Intel Itanium-Prozessoren verwendet wird, wurde eingestellt.
- Sicherheitsanfälligkeiten wurden behoben:
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 – kritische Sicherheitsanfälligkeiten in der Funktion __vsyslog_internal(), die es ermöglichen, über Manipulationen beim Start von SUID-Anwendungen eigenen Code mit erhöhten Rechten auszuführen.
- CVE-2023-4911 – eine Sicherheitsanfälligkeit in Glibc ld.so, die einem Zugriff auf Root-Rechte im System ermöglicht. Die Schwachstelle wird durch einen Fehler im Parsing-Code der Umgebungsvariablen GLIBC_TUNABLES verursacht und kann dazu führen, dass das analysierte Wert außerhalb des zugewiesenen Puffers geschrieben wird. Es existieren funktionierende Exploits.
- CVE-2023-4806 — eine Schwachstelle in der getaddrinfo-Funktion, verursacht durch einen Zugriff auf den Speicher nach dessen Freigabe (use-after-free). Das Problem tritt auf, wenn das NSS-Plugin nur Callback-Aufrufe von „_gethostbyname2_r“ und „_getcanonname_r“ implementiert, jedoch den Aufruf „_gethostbyname3_r“ nicht unterstützt. Zur Ausnutzung der Schwachstelle muss der DNS-Server für den angeforderten Host eine große Anzahl von IPv6- und IPv4-Adressen zurückgeben, was zum Absturz des Prozesses führt, der die Funktion getaddrinfo für die Adresse AF_INET6 mit den Flags AI_CANONNAME, AI_ALL und AI_V4MAPPED aufruft.
- CVE-2023-4527 — eine Schwachstelle in der getaddrinfo-Funktion, die das Auslesen von Daten aus dem Bereich außerhalb des Puffers erlaubt, wenn eine DNS-Antwort über TCP mit einer Größe von mehr als 2048 Byte verarbeitet wird. Die Schwachstelle zeigt sich bei Verwendung der Option „no-aaaa“ in /etc/resolv.conf.
Zusätzlich kann die Veröffentlichung des Satzes von Systemwerkzeugen GNU Binutils 2.42 hervorgehoben werden, der Programme wie GNU Linker, GNU Assembler, nm, objdump, strings, strip umfasst.
In der neuen Version von Binutils:
- Im Assembler (gas) für x86-64-Systeme wurde eine experimentelle Option „—scfi=experimental“ hinzugefügt, um CFI (Control Flow Integrity) Konstruktionen für manuell geschriebenen Assembler-Code zu synthetisieren, die den System V AMD64 ABI entsprechen.
- Im Programm readelf wurde die Option „—extra-sym-info“ hinzugefügt, um erweiterte Informationen zu Symbolen („—symbols“) auszugeben, wie den Namen der Sektion, auf die der Index st_shndx verweist.
- Im Dienstprogramm objcopy wurde die Möglichkeit eingeführt, in der Option „—set-section-flags“ den Wert „large“ zu verwenden, um das Flag SHF_X86_64_LARGE für ELF-Objekte auf x86-64-Systemen zu setzen. In der Option „—visualize-jumps“ wird die Unterstützung für die Architektur s390 bereitgestellt.
- Beim Disassemblieren von s390-Anweisungen ist es möglich, Kommentare zu den Anweisungsbeschreibungen anzuzeigen. Um die Beschreibungen in objdump zu aktivieren, kann der Parameter „-M insndesc“ angegeben werden, während in gdb die Einstellung „set disassembler-options insndesc“ verwendet wird.
- Dem Linker wurden die Optionen „-z mark-plt“ und „-z nomark-plt“ hinzugefügt, um Einträge in der PLT-Tabelle mithilfe der Tags DT_X86_64_PLT, DT_X86_64_PLTSZ und DT_X86_64_PLTENT zu markieren.
- Im Linker wurde die Unterstützung für die umgekehrte Sortierung hinzugefügt.
- Es wurden die Optionen „—warn-execstack-objects“, „—error-execstack“ und „—error-rxw-segments“ hinzugefügt, um Warnungen oder Fehler auszugeben, wenn Objekte mit ausführbarem Stack verwendet werden.
- Die Unterstützung für ABI 2.30 der LoongArch-Architektur sowie für neue Anweisungen, die in der Spezifikation LoongArch 1.10 definiert sind, wurde implementiert.
- Unterstützung für den KVX-Befehlssatz hinzugefügt, der in den Kalray-Prozessoren verwendet wird (zum Beispiel in SoCs wie Coolidge).
- Für Systeme auf Basis der Intel-Architektur wurde die Unterstützung für Erweiterungen hinzugefügt:
- Intel APX: 32 GPRs, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- Für die RISC-V-Architektur wurde die Unterstützung für Erweiterungen hinzugefügt:
- T-Head (XTheadVector, XTheadZvlsseg und XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- Für die AArch64-Architektur wurde die Unterstützung für Erweiterungen hinzugefügt:
- SVE2.1 (Scalable Vector Extension 2.1).
- SME2.1 (Scalable Matrix Extension 2.1).
- B16B16 (BFloat16 und BFloat16 für SVE2 und SME2).
- RASv2 (Reliability, Availability and Serviceability v2).
- LSE128 (128-Bit Atomare Operationen).
- GCS (Guarded Control Stack).
- CHK (Feature-Status Überprüfung).
- SPECRES2 (Erweiterte Spekulationseinschränkung).
- LRCPC3 (Load-Acquire RCpc).
- THE (Übersetzungs-Härtung).
- ITE (Befehlsverfolgung).
- D128 (128-Bit-Speicherseiten-Tabellendeklarationen).
- XS (XS-Speicherattribut).
- Unterstützung für AArch64-Prozessoren Cortex-A520, Cortex-A720, Cortex-X3 und Cortex-X4 hinzugefügt.
- Im BPF-Assembler wurde Unterstützung für die Trennung von Kommentaren mit den Zeichen „#“ und „//“ sowie für die Verwendung des Zeichens „;“ zur Trennung von Ausdrücken in einer Zeile hinzugefügt („;“ kann nun nicht mehr für Kommentare verwendet werden).
Quelle: opennet.ru
