Après six mois de développement, la version de la bibliothèque système GNU C Library (glibc) 2.39 a été publiée, respectant entièrement les exigences des normes ISO C11 et POSIX.1-2017. Le nouveau lot comprend des corrections de 67 développeurs.
Parmi les améliorations mises en œuvre dans Glibc 2.39, on peut noter :
- Le support de la pile d'ombre (shadow stack) a été ajouté, qui est apparu dans le noyau Linux 6.6 et permet de bloquer le fonctionnement de nombreux exploits, en utilisant les capacités matérielles des processeurs Intel pour protéger contre l'écrasement de l'adresse de retour depuis une fonction en cas de débordement de tampon dans la pile. L'idée de la protection est que, après le transfert de contrôle à la fonction, les adresses de retour sont enregistrées par le processeur non seulement dans la pile ordinaire, mais aussi dans une « pile d'ombre » distincte, qui ne peut pas être modifiée directement. Avant de sortir de la fonction, l'adresse de retour est extraite de la pile d'ombre et comparée à l'adresse de retour de la pile principale. Une discordance des adresses entraîne la génération d'une exception qui bloque les situations où un exploit a réussi à écraser l'adresse dans la pile principale. Pour activer cette fonction, une option de compilation « —enable-cet » a été ajoutée.
- Un nouveau fichier d'en-tête <stdbit.h> a été ajouté, défini dans l'ébauche de la norme ISO C2X et incluant les fonctions 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 et stdc_bit_ceil pour les types « unsigned char », « unsigned short », « unsigned int », « unsigned long int » et « unsigned long long int ».
- Pour la plateforme Linux, les fonctions posix_spawnattr_getcgroup_np et posix_spawnattr_setcgroup_np ont été mises en œuvre, ainsi que le flag POSIX_SPAWN_SETCGROUP, qui permettent de configurer cgroupv2 dans un nouveau processus à l'aide des fonctions posix_spawn et posix_spawnp, en éliminant les conditions de concurrence. Ces fonctions sont des extensions GNU et nécessitent un noyau Linux supportant l'appel système clone3.
- Pour la plateforme Linux, les fonctions pidfd_spawn et pidfd_spawp ont été mises en place, qui sont sémantiquement proches de la fonction posix_spawn, mais retournent non pas un identifiant de processus (PID), mais un descripteur de fichier pour être utilisé dans des fonctions supportant le mécanisme PIDFD, telles que pidfd_send_signal, poll et waitid (PIDFD est lié à un processus particulier et ne change pas, tandis que PID peut être associé à un autre processus après la terminaison du processus actuel associé à ce PID).
- Une fonction pidfd_getpid a été ajoutée pour déterminer l'identifiant de processus (PID) à partir du descripteur de fichier du processus (PIDFD) retourné par les fonctions pid_spawn, fork_np et pidfd_open pour la plateforme Linux.
- Un modificateur de taille «wN» a été ajouté à la fonction de la famille scanf, applicable aux arguments de types intN_t, int_leastN_t, uintN_t et uint_leastN_t. Par exemple, pour lire les valeurs décimales avec les types int32_t et int_least32_t, vous pouvez spécifier «%w32d», et pour les hexadécimales — «%w32x». De même, un modificateur «wfN» a été ajouté pour les types int_fastN_t et uint_fastN_t, tels que définis dans le projet de norme ISO C2X.
- Une configuration «glibc.cpu.plt_rewrite» a été ajoutée, permettant de réécrire la PLT (Procedure Linkage Table) sur les systèmes x86-64, où l'éditeur de liens remplacera les branches indirectes dans la PLT par des branches directes.
- Une configuration «glibc.mem.decorate_maps» a été ajoutée pour inclure des informations supplémentaires sur l'allocation de mémoire (comme la pile de threads créée par la fonction pthread_create ou la mémoire allouée via malloc).
- Dans la structure «statvfs», le champ «f_type» est désormais rempli avec des informations sur le type de système de fichiers, équivalentes au contenu du champ dans la structure «statfs». Auparavant, dans Linux, le champ «f_type» était toujours rempli avec 0.
- Pour la plateforme AArch64, des annotations ont été ajoutées dans libmvec et math.h, permettant d'utiliser la vectorisation des appels lors de la compilation avec l'option «-ffast-math» dans GCC 9 et les versions ultérieures du compilateur. La vectorisation est activée pour les fonctions mathématiques 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 et tanf.
- La bibliothèque libcrypt et le fichier d'en-tête associé «» ont été supprimés. Les développeurs d'applications sont invités à passer à l'utilisation de bibliothèques alternatives, telles que libxcrypt.
- Dans l'utilitaire ldconfig, les fichiers contenant un symbole ‘;’ dans leur nom ou se terminant par «.dpkg.tmp» et «.dpkg.new» sont désormais omis, évitant ainsi le traitement des fichiers temporaires des gestionnaires de paquets rpm et dpkg.
- La prise en charge de l'architecture ia64 (ia64*-*-linux-gnu), utilisée dans les processeurs Intel Itanium, a été arrêtée.
- Vulnérabilités corrigées :
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 — des vulnérabilités critiques dans la fonction __vsyslog_internal(), permettant, par des manipulations lors du lancement d'applications SUID, d'exécuter du code avec des privilèges élevés.
- CVE-2023-4911 — une vulnérabilité dans Glibc ld.so, permettant d'obtenir des droits root sur le système. Cette vulnérabilité est causée par une erreur dans le code d'analyse de la chaîne indiquée dans la variable d'environnement GLIBC_TUNABLES, pouvant entraîner l'écriture de la valeur analysée au-delà du tampon alloué. Des exploits fonctionnels existent.
- CVE-2023-4806 — une vulnérabilité dans la fonction getaddrinfo, causée par un accès à la mémoire après sa libération (use-after-free). Le problème se manifeste lorsque le plugin NSS met en œuvre uniquement les appels de retour « _gethostbyname2_r » et « _getcanonname_r », mais ne prend pas en charge l'appel « _gethostbyname3_r ». Pour exploiter la vulnérabilité, le serveur DNS doit renvoyer un grand nombre d'adresses IPv6 et IPv4 pour l'hôte demandé, ce qui entraînera l'échec du processus qui a appelé la fonction getaddrinfo pour la famille AF_INET6 lors de la définition des drapeaux AI_CANONNAME, AI_ALL et AI_V4MAPPED.
- CVE-2023-4527 — une vulnérabilité dans la fonction getaddrinfo, permettant de lire des données en dehors des limites du tampon lors du traitement d'une réponse DNS reçue par TCP, de taille supérieure à 2048 octets. La vulnérabilité se manifeste lors de l'utilisation de l'option « no-aaaa » dans /etc/resolv.conf.
De plus, il convient de noter la sortie du paquet d'outils système GNU Binutils 2.42, qui comprend des programmes tels que GNU linker, GNU assembler, nm, objdump, strings, strip.
Dans la nouvelle version de Binutils :
- Dans l'assembleur (gas) pour les systèmes x86-64, une option expérimentale « —scfi=experimental » a été ajoutée pour la synthèse des constructions CFI (Control Flow Integrity) pour le code assembleur écrit à la main, conforme à System V AMD64 ABI.
- Dans le programme readelf, l'option « —extra-sym-info » a été ajoutée pour afficher des informations supplémentaires sur les symboles (« —symbols »), telles que le nom de la section à laquelle se réfère l'index st_shndx.
- Dans l'outil objcopy, une possibilité d'utiliser dans l'option « —set-section-flags » la valeur « large » pour définir le drapeau de section SHF_X86_64_LARGE pour les objets ELF sur les systèmes x86-64 a été introduite. Dans l'option « —visualize-jumps », la prise en charge de l'architecture s390 a été implémentée.
- Lors de la désassemblage des instructions s390, il est maintenant possible d'afficher des commentaires dans les descriptions d'instructions. Pour activer les descriptions dans objdump, vous pouvez spécifier le paramètre « -M insndesc », et dans gdb — la configuration « set disassembler-options insndesc ».
- Au linker, des options « -z mark-plt » et « -z nomark-plt » ont été ajoutées pour marquer les entrées dans la table PLT, en utilisant les balises DT_X86_64_PLT, DT_X86_64_PLTSZ et DT_X86_64_PLTENT.
- Le linker a ajouté la prise en charge du tri inversé.
- Des options «—warn-execstack-objects», «—error-execstack» et «—error-rxw-segments» ont été ajoutées pour afficher des avertissements ou des erreurs lors de l'utilisation dans des objets de pile d'exécution.
- La prise en charge de l'ABI 2.30 de l'architecture LoongArch a été mise en œuvre, ainsi que le support de nouvelles instructions définies dans la spécification LoongArch 1.10.
- La prise en charge de l'ensemble d'instructions KVX, utilisé dans les processeurs Kalray (par exemple, utilisé dans le SoC Coolidge), a été ajoutée.
- Pour les systèmes basés sur l'architecture Intel, la prise en charge des extensions suivantes a été ajoutée :
- Intel APX : 32 GPRs, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- Le port pour l'architecture RISC-V a été étendu avec le support des extensions suivantes :
- T-Head (XTheadVector, XTheadZvlsseg et XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- Le port pour l'architecture AArch64 a été étendu avec le support des extensions suivantes :
- SVE2.1 (Scalable Vector Extension 2.1).
- SME2.1 (Scalable Matrix Extension 2.1).
- B16B16 (BFloat16 et BFloat16 pour SVE2 et SME2).
- RASv2 (Fiabilité, Disponibilité et Maintenabilité v2).
- LSE128 (Atomique 128 bits).
- GCS (Pile de contrôle protégée).
- CHK (Vérifier l'état des fonctionnalités).
- SPECRES2 (Restriction de spéculation améliorée).
- LRCPC3 (Chargement-Acquérir RCpc).
- THE (Durcissement de la traduction).
- ITE (Trace d'instructions).
- D128 (descripteurs de table de pages mémoire de 128 bits).
- XS (attribut de mémoire XS).
- La prise en charge des processeurs AArch64 Cortex-A520, Cortex-A720, Cortex-X3 et Cortex-X4 a été ajoutée.
- Dans l'assembleur BPF, pour la compatibilité avec l'assembleur clang/LLVM, le support de la séparation des commentaires par les symboles «#» et «//», ainsi que l'utilisation du symbole «;» pour séparer les expressions sur ligne (le «;» ne peut plus être utilisé pour des commentaires) a été ajouté.
Source : opennet.ru
