Après six mois de développement, la version de la bibliothèque système GNU C Library (glibc) 2.35 a été publiée, respectant pleinement les exigences des normes ISO C11 et POSIX.1-2017. Cette nouvelle version inclut des correctifs provenant de 66 développeurs.
Parmi les améliorations apportées dans Glibc 2.35, on peut noter :
- Ajout du support pour la locale « C.UTF-8 », qui inclut des règles de tri pour tous les codes Unicode, mais qui, pour des raisons d'économie d'espace, est limitée à l'utilisation de plages ASCII dans les fonctions fnmatch, regexec et regcomp. La locale occupe environ 400 Ko, dont 346 Ko sont des données LC_CTYPE pour Unicode, et nécessite une installation distincte (non intégrée dans Glibc).
- Les données d'encodage, les informations sur les types de caractères et les tables de translittération ont été mises à jour pour supporter la spécification Unicode 14.0.0.
- Dans
- Dans
- Dans
- Pour les fonctions exp10, des macros correspondantes, non liées à des types spécifiques, ont été ajoutées dans le fichier d'en-tête .
- Dans , une macro _PRINTF_NAN_LEN_MAX, proposée dans le projet de norme ISO C2X, a été ajoutée.
- Dans les fonctions de la famille printf, des spécificateurs de format « %b » et « %B » ont été ajoutés pour imprimer des entiers en représentation binaire.
- Un nouvel algorithme de tri DSO a été mis en œuvre dans le système de liaison dynamique, utilisant la méthode de recherche en profondeur (DFS) pour résoudre les problèmes de performance liés au traitement des dépendances cycliques. Pour choisir l'algorithme de tri DSO, le paramètre glibc.rtld.dynamic_sort a été proposé, auquel on peut attribuer la valeur « 1 » pour revenir à l'ancien algorithme.
- La prise en charge d'une nouvelle fonction ‘__memcmpeq’ a été ajoutée à ABI, utilisée par les compilateurs pour optimiser l'utilisation de ‘memcmp’, dans les cas où la valeur retournée par cette fonction n'est utilisée que pour vérifier l'état de l'opération.
- Ajout de la prise en charge de l'enregistrement automatique des threads à l'aide de l'appel système rseq (séquences redémarrables), disponible depuis le noyau Linux 4.18. L'appel système rseq permet de gérer l'exécution ininterrompue d'un groupe d'instructions, qui ne sera pas interrompue et qui confirme le résultat de la dernière instruction du groupe. Cela fournit essentiellement un moyen d'exécuter des opérations atomiques très rapides, qui, en cas d'interruption par un autre thread, sont annulées et une nouvelle tentative d'exécution est entreprise.
- Ajout d'un lien symbolique /usr/bin/ld.so.
- La construction par défaut de tous les exécutables des programmes intégrés et des ensembles de tests est assurée en mode PIE (exécutable indépendant de la position). Pour désactiver ce comportement, une option «—disable-default-pie» est prévue.
- Pour Linux, la configuration glibc.malloc.hugetlb a été ajoutée, permettant de changer l'implémentation de malloc afin d'utiliser l'appel système madvise avec le drapeau MADV_HUGEPAGE pour mmap et sbrk ou d'utiliser directement de grandes pages mémoire en spécifiant le drapeau MAP_HUGETLB dans les appels mmap. Dans le premier cas, il est possible d'augmenter les performances si les Transparent Huge Pages sont utilisées en mode madvise, et dans le second, cela permet d'utiliser les grandes pages (Huge Pages) réservées par le système.
- Ajout de la fonction _dl_find_object, qui peut être utilisée pour ajouter des informations sur le déroulement de la pile d'appels (unwind).
- Prise en charge de l'architecture OpenRISC (or1k-linux-gnu) en mode traitement logiciel des opérations à virgule flottante (soft-float). Pour faire fonctionner ce port, les binutils 2.35, GCC 11 et le noyau Linux 5.4 sont requis.
- Ajout d'un drapeau de construction «—with-rtld-early-cflags», qui permet de spécifier des drapeaux de compilation supplémentaires utilisés lors de la construction du code initial pour la liaison dynamique.
- Pour la plateforme Linux, la fonction epoll_pwait2 a été ajoutée, qui se distingue de epoll_wait par la spécification d'un délai d'attente avec une précision en nanosecondes.
- Ajout de la fonction posix_spawn_file_actions_addtcsetpgrp_np, éliminant les conditions de course lors de la définition du terminal de contrôle pour un nouveau processus.
- Pour les applications compilées avec Glibc et GCC 12+, le mode de protection « _FORTIFY_SOURCE=3 » a été implémenté, détectant les possibles débordements de tampon lors de l’exécution des fonctions de chaîne définies dans le fichier d’en-tête string.h. La différence avec le mode « _FORTIFY_SOURCE=2 » réside dans des vérifications supplémentaires qui peuvent potentiellement réduire la performance.
- Le support des extensions Intel MPX (Memory Protection Extensions), utilisées pour vérifier que les pointeurs respectent les limites des zones mémoire, a été arrêté (cette technologie n’a pas été largement adoptée et a déjà été supprimée de GCC et LLVM).
- Le mécanisme prelink et les variables d'environnement LD_TRACE_PRELINKING et LD_USE_LOAD_BIAS sont déclarés obsolètes et seront supprimés dans la prochaine version.
Vulnérabilités corrigées :
- CVE-2022-23218, CVE-2022-23219 — débordement de tampon dans les fonctions svcunix_create et clnt_create, causé par la copie sur la pile du contenu d’un paramètre contenant un nom de fichier sans vérifier la taille des données copiées. Pour les applications compilées sans protection de pile et utilisant le protocole « unix », cette vulnérabilité peut permettre l'exécution de code malveillant lors du traitement de noms de fichiers très longs.
- CVE-2021-3998 — vulnérabilité dans la fonction realpath(), causée par le retour, dans certaines conditions, d’une valeur incorrecte contenant des données résiduelles non nettoyées de la pile. Pour un programme SUID-root comme fusermount, cette vulnérabilité peut être exploitée pour obtenir des informations confidentielles à partir de la mémoire du processus, comme des informations sur les pointeurs.
- CVE-2021-3999 — débordement de tampon d’un octet dans la fonction getcwd(). Le problème est causé par une erreur présente depuis 1995. Pour provoquer le débordement, il suffit d’appeler chdir() pour le répertoire « / » dans un espace de noms de points de montage distinct.
Source : opennet.ru
