Nach sechs Monaten Entwicklung wurde die Version der GNU C Library (glibc) 2.39 veröffentlicht, die vollstÀndig den Anforderungen der ISO C11- und POSIX.1-2017-Standards entspricht. Der neue Release enthÀlt Korrekturen von 67 Entwicklern.
Unter den in Glibc 2.39 umgesetzten Verbesserungen sind hervorzuheben:
- Die UnterstĂŒtzung fĂŒr den Shadow Stack wurde eingefĂŒhrt, der im Linux-Kernel 6.6 verfĂŒgbar ist und die FunktionalitĂ€t vieler Exploits blockiert, indem er die Hardwarefunktionen von Intel-Prozessoren zum Schutz vor der Ăberschreibung der RĂŒcksprungadresse aus einer Funktion bei einem Buffer Overflow im Stack nutzt. Der Schutzmechanismus besteht darin, dass nach der Ăbergabe der Kontrolle an die Funktion die RĂŒcksprungadressen nicht nur im herkömmlichen Stack, sondern auch in einem separaten âShadowâ-Stack vom Prozessor gespeichert werden, der nicht direkt verĂ€ndert werden kann. Vor dem Verlassen der Funktion wird die RĂŒcksprungadresse aus dem Shadow-Stack extrahiert und mit der RĂŒcksprungadresse aus dem Hauptstack verglichen. Eine Abweichung der Adressen fĂŒhrt zur Generierung einer Ausnahme, die verhindert, dass ein Exploit die Adresse im Hauptstack ĂŒberschreibt. Um dies zu aktivieren, wurde die Compiler-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 fĂŒr die Typen âunsigned charâ, âunsigned shortâ, âunsigned intâ, âunsigned long intâ und âunsigned long long intâ einschlieĂt.
- 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 mithilfe der Funktionen posix_spawn und posix_spawnp einzurichten, wodurch ein Rennen vermieden wird. Diese Funktionen sind Erweiterungen von GNU 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 eine Prozess-ID (PID) zurĂŒckgeben, sondern einen Dateideskriptor, der in Funktionen verwendet wird, 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 nach dem Abschluss des aktuellen Prozesses, der mit dieser PID assoziiert ist, einem anderen Prozess zugeordnet werden kann).
- FĂŒr die Linux-Plattform wurde die Funktion pidfd_getpid hinzugefĂŒgt, um die Prozess-ID (PID) basierend auf dem aus den Funktionen pid_spawn, fork_np und pidfd_open zurĂŒckgegebenen Prozess-Dateideskriptor (PIDFD) zu bestimmen.
- 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 werden kann. Analog wurde der Modifikator âwfNâ fĂŒr die Typen int_fastN_t und uint_fastN_t, die im Entwurfstandard ISO C2X dargestellt sind, hinzugefĂŒgt.
- Eine Einstellung âglibc.cpu.plt_rewriteâ wurde hinzugefĂŒgt, die die Umschreibung der PLT (Procedure Linkage Table) auf x86-64-Systemen aktiviert, bei der der Linker indirekte SprĂŒnge in der PLT durch direkte ersetzt.
- Die Einstellung âglibc.mem.decorate_mapsâ wurde hinzugefĂŒgt, um zusĂ€tzliche Informationen zur Speicherzuweisung bereitzustellen (z. B. zum Thread-Stack, der durch die Funktion pthread_create erstellt wurde, oder zu dem durch malloc zugewiesenen Speicher).
- In der Struktur âstatvfsâ wird das Feld âf_typeâ nun mit Informationen ĂŒber den FS-Typ ausgefĂŒllt, die dem Inhalt des Feldes in der Struktur âstatfsâ entsprechen. Zuvor wurde in Linux immer 0 in das Feld âf_typeâ geschrieben.
- FĂŒr die Plattform AArch64 wurden in libmvec und math.h Anmerkungen hinzugefĂŒgt, die es ermöglichen, bei Angabe der Option â-ffast-mathâ bei der Kompilierung Vektorisierung von Funktionsaufrufen in GCC 9 und neueren Compiler-Versionen zu verwenden. 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 sowie die zugehörige Header-Datei ââ wurden entfernt. Anwendungsentwickler wird empfohlen, auf alternative Bibliotheken wie libxcrypt umzusteigen.
- In der ldconfig-Anwendung 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 rpm- und dpkg-Paketmanagern ermöglicht.
- Die UnterstĂŒtzung fĂŒr die ia64-Architektur (ia64*-*-linux-gnu), die in Intel Itanium-Prozessoren verwendet wird, wurde eingestellt.
- Behobene SicherheitsanfÀlligkeiten:
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 â kritische SicherheitsanfĂ€lligkeiten in der Funktion __vsyslog_internal(), die es durch Manipulation beim Start von SUID-Anwendungen ermöglicht, Code mit erhöhten Rechten auszufĂŒhren.
- CVE-2023-4911 â SicherheitsanfĂ€lligkeit in Glibc ld.so, die es ermöglicht, Root-Rechte im System zu erlangen. Die AnfĂ€lligkeit resultiert aus einem Fehler im Code zur Verarbeitung des Strings, der in der Umgebungsvariable GLIBC_TUNABLES angegeben ist, und kann dazu fĂŒhren, dass der analysierte Wert auĂerhalb des zugewiesenen Puffers geschrieben wird. Es gibt funktionierende Exploits.
- CVE-2023-4806 â SicherheitsanfĂ€lligkeit in der Funktion getaddrinfo, verursacht durch den Zugriff auf den Speicher nach dessen Freigabe (use-after-free). Das Problem tritt auf, wenn das NSS-Plugin nur Call-Back-Aufrufe von â_gethostbyname2_râ und â_getcanonname_râ implementiert, jedoch den Aufruf â_gethostbyname3_râ nicht unterstĂŒtzt. Um die AnfĂ€lligkeit auszunutzen, 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 Familie AF_INET6 mit den Flags AI_CANONNAME, AI_ALL und AI_V4MAPPED aufruft.
- CVE-2023-4527 â SicherheitsanfĂ€lligkeit in der Funktion getaddrinfo, die es erlaubt, Daten auĂerhalb des Pufferrandes zu lesen, wenn eine DNS-Antwort, die ĂŒber TCP mit einer GröĂe von mehr als 2048 Bytes empfangen wurde, verarbeitet wird. Die AnfĂ€lligkeit tritt bei Verwendung der Option âno-aaaaâ in /etc/resolv.conf auf.
ZusÀtzlich kann die Veröffentlichung des Sets von Systemdienstprogrammen GNU Binutils 2.42 erwÀhnt werden, das Programme wie den GNU-Linker, den GNU-Assembler, nm, objdump, strings und strip umfasst.
In der neuen Version von Binutils:
- Im Assembler (gas) fĂŒr x86-64-Systeme wurde die experimentelle Option ââscfi=experimentalâ hinzugefĂŒgt, um CFI-Konstrukte (Control Flow Integrity) fĂŒr manuell geschriebenen Assembler-Code entsprechend der System V AMD64 ABI zu synthetisieren.
- In das Programm readelf wurde die Option ââextra-sym-infoâ hinzugefĂŒgt, um erweiterte Informationen ĂŒber Symbole (ââsymbolsâ) auszugeben, wie z.B. den Namen der Sektion, auf die der Index st_shndx verweist.
- In dem Dienstprogramm objcopy wurde die Möglichkeit zur Verwendung des Wertes âlargeâ in der Option ââset-section-flagsâ bereitgestellt, um das Flag SHF_X86_64_LARGE fĂŒr ELF-Objekte auf x86-64-Systemen zu setzen. In der Option ââvisualize-jumpsâ wurde die UnterstĂŒtzung fĂŒr die Architektur s390 implementiert.
- Beim Disassemblieren von s390-Anweisungen wurde die Möglichkeit implementiert, Kommentare in der Beschreibung der Anweisungen anzuzeigen. Um Beschreibungen in objdump einzuschlieĂen, kann der Parameter â-M insndescâ angegeben werden, und in gdb wird die Einstellung âset disassembler-options insndescâ verwendet.
- Dem Linker wurden die Optionen â-z mark-pltâ und â-z nomark-pltâ hinzugefĂŒgt, um EintrĂ€ge in der PLT-Tabelle zu kennzeichnen, unter Verwendung der Tags DT_X86_64_PLT, DT_X86_64_PLTSZ und DT_X86_64_PLTENT.
- Im Linker wurde die UnterstĂŒtzung fĂŒr die Sortierung in umgekehrter Reihenfolge hinzugefĂŒgt.
- Die Optionen ââwarn-execstack-objectsâ, ââerror-execstackâ und ââerror-rxw-segmentsâ wurden hinzugefĂŒgt, um Warnungen oder Fehler bei der Verwendung in ausfĂŒhrbaren Stackobjekten auszugeben.
- Die UnterstĂŒtzung fĂŒr die ABI 2.30 der LoongArch-Architektur wurde implementiert, sowie die UnterstĂŒtzung neuer Anweisungen, die in der Spezifikation LoongArch 1.10 definiert sind.
- Die UnterstĂŒtzung fĂŒr den Befehlssatz KVX, der in den Prozessoren von Kalray verwendet wird (zum Beispiel in SoC Coolidge), wurde hinzugefĂŒgt.
- FĂŒr Systeme auf Basis der Intel-Architektur wurde die UnterstĂŒtzung fĂŒr die Erweiterungen hinzugefĂŒgt:
- Intel APX: 32 GPRs, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- Im Port fĂŒr die RISC-V-Architektur wurde die UnterstĂŒtzung fĂŒr die Erweiterungen hinzugefĂŒgt:
- T-Head (XTheadVector, XTheadZvlsseg und XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- Im Port fĂŒr die AArch64-Architektur wurde die UnterstĂŒtzung fĂŒr die 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 Atomar).
- GCS (Guarded Control Stack).
- CHK (Feature-Zustand ĂŒberprĂŒfen).
- SPECRES2 (Erweiterte SpekulationsbeschrÀnkung).
- LRCPC3 (Load-Acquire RCpc).
- THE (Ăbersetzungsabsicherung).
- ITE (Befehlsverfolgung).
- D128 (128-Bit-Seitentabellen-Deskriptoren).
- XS (XS-Speicherattribut).
- Die UnterstĂŒtzung fĂŒr die AArch64-Prozessoren Cortex-A520, Cortex-A720, Cortex-X3 und Cortex-X4 wurde hinzugefĂŒgt.
- Im BPF-Assembler wurde zur KompatibilitĂ€t mit dem Assembler clang/LLVM die UnterstĂŒtzung fĂŒr die Trennung von Kommentaren mit den Symbolen â#â und â//â sowie die Verwendung des Symbols â;â zur Trennung von AusdrĂŒcken in einer Zeile hinzugefĂŒgt (das â;â kann nicht mehr fĂŒr Kommentare verwendet werden).
Quelle: opennet.ru
