Nach sechs Monaten Entwicklung wurde die Version 2.41 der GNU C Library (glibc) veröffentlicht, die vollständig den Anforderungen der ISO C11- und POSIX.1-2017-Standards entspricht. An der Erstellung dieser neuen Version waren 79 Entwickler beteiligt.
Zu den in Glibc 2.41 implementierten Verbesserungen zählen:
- Für die Linux-Plattform wurden die neuen Funktionen sched_setattr und sched_getattr hinzugefügt, über die die Parameter des Task-Schedulers festgelegt bzw. gelesen werden können. In der Praxis ermöglichen diese Funktionen die Konfiguration von Scheduling-Politiken wie SCHED_DEADLINE, die neben der Priorität zusätzliche Parameter nutzen.
- Das Hilfsprogramm iconv unterstützt jetzt die Konvertierung von Zeichencodierungen vor Ort (wenn der Name der Eingangs- und Ausgangsdateien übereinstimmt, erstellt iconv nun automatisch eine temporäre Datei und ersetzt nach Abschluss der Konvertierung die ursprüngliche Datei durch sie).
- In die Header-Datei math.h wurden die Trigonometriefunktionen aufgenommen, die im C23-Standard (TS 18661-4:2015) eingeführt wurden: acospi, asinpi, atan2pi, atanpi, cospi, sinpi und tanpi.
- Aus dem Projekt CORE-MATH wurden optimierte Versionen der Funktionen exp10m1f, exp2m1f, expm1f, log10f, log2p1f, log1pf, log10p1f, cbrtf, erff, erfcf, lgammaf, tgammaf, tanf, acosf, acoshf, asinf, asinhf, atanf, atan2f, atanhf, coshf, sinhf und tanhf übernommen, die korrekt gerundet werden.
- Die Unterstützung der ARM64 GCS-Erweiterung (Guarded Control Stack) wurde hinzugefügt, um die Hardware-Sicherung der Rückgabeargumente von Funktionen zu gewährleisten und Exploits zu blockieren, die auf Rücksprungorientiertes Programmieren (ROP — Return-Oriented Programming) basieren (der Exploit wird aus bereits vorhandenen Maschineninstruktionen zusammengesetzt, die mit einer Rücksprunganweisung enden). ARM64 GCS ermöglicht den Einsatz der Technik des Shadow Stacks zum Schutz von Anwendungsspeicherprozessen — nach der Übergabe der Kontrolle an eine Funktion speichert der Prozessor die Rückgabewerte nicht nur im regulären Stack, sondern auch im separaten Shadow Stack, der nicht direkt verändert werden kann. Vor dem Verlassen einer Funktion wird die Rückgabeadresse aus dem Shadow Stack entnommen und mit der Rückgabeadresse des Hauptstacks abgeglichen. Für den Bau von Glibc mit GCS-Unterstützung ist mindestens die Version 2.44 von binutils und GCC 15 erforderlich.
- Es wurden umfassende Arbeiten zur Verbesserung der Codegenerierung und zur Steigerung der Leistung mathematischer Funktionen für die Architektur ARM64/AArch64 durchgeführt. Optimierungen unter Verwendung von Vektorbefehlen (SVE, Scalable Vector Extension) und SIMD-Erweiterungen (Neon) wurden implementiert.
- Für Systeme mit ARM64/AArch64-Prozessoren wurde die Unterstützung für den Mechanismus Memory Protection Keys hinzugefügt, der zur Einschränkung des Zugriffs auf Speicherseiten dient, ohne die Speichertabelle zu ändern.
- Für Systeme mit PowerPC64-Prozessoren wurde die Unterstützung für erweiterte Befehle eingeführt, die gegen die Ausnutzung von Rücksprungangriffen in Exploits schützen.
- Ein neuer Architektursatz arch_kind_hygon für die chinesischen x86-64-Prozessoren Hygon, die auf AMD-Technologien basieren, wurde hinzugefügt.
- Das Testset für glibc wurde erheblich erweitert, wobei sich die Anzahl der Tests im Vergleich zur vorherigen Version von 5408 auf 6232 erhöht hat.
- Es wurde die Möglichkeit hinzugefügt, einen glibc-Build mit C- und C++-Compilern zu testen, die sich von denen unterscheiden, die für den tatsächlichen Build verwendet wurden. Zum Beispiel ‚configure TEST_CC="gcc-6.4.1" TEST_CXX="g++-6.4.1"‘ und ‚configure TEST_CC="clang" TEST_CXX="clang++"‘.
- In den Optionen, die in der Datei /etc/resolv.conf und der Umgebungsvariable RES_OPTIONS angegeben werden, wurde die Möglichkeit implementiert, das Präfix „-“ zu verwenden, um eine zuvor festgelegte Option mit diesem Namen zurückzunehmen. Wenn in /etc/resolv.conf beispielsweise „options no-aaaa“ angegeben ist, wird beim Starten des Prozesses mit der Umgebungsvariable „RES_OPTIONS=-no-aaaa“ das Verbot für die Versendung von DNS-Anfragen zur Abfrage von AAAA-Einträgen aufgehoben.
- Im DNS-Resolver wurde die Unterstützung für die Option „strict-error“ hinzugefügt, bei der die Funktion getaddrinfo(), wenn der Adresstyp (AF_UNSPEC) nicht eindeutig angegeben ist, versucht, die Werte der A (IPv4)- und AAAA (IPv6)-Einträge von einem anderen DNS-Server abzurufen, wenn die Anfrage für A oder AAAA beim ersten DNS-Server fehlerhaft war. Ohne die Angabe von „strict-error“ wird in einer solchen Situation die Adresse zurückgegeben, die aus der erfolgreich verarbeiteten Anfrage abgeleitet wurde, während das Ergebnis der fehlerhaften Anfrage ignoriert wird. Zum Beispiel, wenn Server eine „A“-Aufzeichnung zurückgegeben wurde, aber ein Fehler bei der Anfrage nach „AAAA“ aufgetreten ist, wird getaddrinfo ohne die Option „strict-error“ sofort nur die IPv4-Adresse zurückgeben, während es mit der Option „strict-error“ versuchen wird, die Anfragen an einen anderen DNS-Server zu wiederholen.
- Die Kodierungsdaten, Informationen über Zeichentypen und Transliterationstabellen wurden aktualisiert, um die Spezifikation Unicode 16.0.0 zu unterstützen.
- Ein Makro „_ISOC2Y_SOURCE“ wurde hinzugefügt, das es ermöglicht, die im Entwurf des C2Y-Standards definierten Funktionen zu aktivieren. Solche Funktionen können auch durch das Makro _GNU_SOURCE und über Compiler-Flags aktiviert werden („gcc -std=gnu2y“).
- Ein Werkzeug namens benchtest wurde implementiert, um die Leistung verschiedener Funktionen (in der Regel mathematischer Funktionen) zu verfolgen.
- Die Einstellung glibc.rtld.execstack wurde hinzugefügt, die es ermöglicht, die Verwendung des ausführbaren Stacks ausdrücklich zu verbieten.
- Unterstützung für die erweiterbare ABI rseq (restartable sequences) wurde hinzugefügt, die einen Mechanismus für eine schnelle atomare Ausführung von Operationen bereitstellt (im Falle einer Unterbrechung der Operation durch einen anderen Thread wird der Zustand zurückgesetzt und ein erneuter Ausführungsversuch unternommen). In der neuen Version gibt es die Möglichkeit, in rseq erweiterte Funktionen zu nutzen, die im ursprünglichen ABI fehlen, wie z. B. Identifikatoren für parallele Ausführung (mm_cid, memory-map concurrency ID) und NUMA-Knoten-Identifikatoren (node_id).
- Die Unterstützung für den Port für big-endian Systeme ARC (arceb-linux-gnu) wurde eingestellt.
- Eine Sicherheitsanfälligkeit (CVE-2025-039), die zu einem Buffer Overflow bei der Ausführung der Funktion assert() führt, wurde behoben. Der Überlauf tritt auf, wenn ein zu langer Programmname angegeben wird (argv[0]). Das Problem wird als unkritisch angesehen, da 4 Bytes über den Buffer hinaus geschrieben werden, deren Inhalt vom Angreifer nicht kontrolliert werden kann. Interessant ist jedoch der Umstand, dass in den Debugging-Funktionen eine Schwachstelle auftritt, die aufgrund eines Fehlers beim Ausgeben des Namens der aktuellen Anwendung entsteht.
Quelle: opennet.ru
