Après deux mois de développement, Linus Torvalds a présenté la version 6.2 du noyau Linux. Parmi les changements les plus notables, on note : l'acceptation de code sous licence Copyleft-Next, une amélioration de l'implémentation RAID5/6 dans Btrfs, la poursuite de l'intégration du support du langage Rust, une réduction des coûts liés à la protection contre les attaques Retbleed, l'ajout d'une fonctionnalité de régulation de la consommation mémoire lors de l'écriture inverse, l'ajout d'un mécanisme d'équilibrage TCP PLB (Protective Load Balancing), la mise en place d'un mécanisme hybride de protection des flux d'exécution (FineIBT), la possibilité de définir des objets et structures de données personnalisés dans BPF, l'inclusion de l'outil rv (Runtime Verification) et une réduction de la consommation d'énergie dans l'implémentation des verrous RCU.
La nouvelle version comprend 16 843 corrections de la part de 2 178 développeurs, la taille du patch étant de 62 Mo (les modifications ont touché 14 108 fichiers, ajouté 730 195 lignes de code et supprimé 409 485 lignes). Environ 42 % de toutes les modifications présentées dans le 6.2 sont liées aux pilotes de périphériques, environ 16 % concernent la mise à jour de code spécifique aux architectures matérielles, 12 % sont liées à la pile réseau, 4 % aux systèmes de fichiers et 3 % aux sous-systèmes internes du noyau.
Les principales nouveautés du noyau 6.2 :
- Mémoire et services système
- L'inclusion de code et de modifications fournis sous la licence Copyleft-Next 0.3.1 est désormais autorisée dans le noyau. La licence Copyleft-Next, créée par un des auteurs de la GPLv3, est totalement compatible avec la GPLv2, comme l'ont confirmé des avocats des entreprises SUSE et Red Hat. Comparée à la GPLv2, la licence Copyleft-Next est nettement plus concise et simple à comprendre (la préface et les références à des compromis obsolètes ont été supprimées), elle définit les délais et les procédures de résolution des infractions, et supprime automatiquement les exigences de copyleft pour les travaux qui ont plus de 15 ans.
Copyleft-Next contient également une clause accordant des droits sur des technologies brevetées, rendant cette licence compatible avec la licence Apache 2.0, contrairement à la GPLv2. Pour assurer une compatibilité totale avec la GPLv2, le texte de Copyleft-Next précise clairement qu'une œuvre dérivée peut être fournie non seulement sous la licence d'origine Copyleft-Next, mais également sous la licence GPL.
- Le paquet inclut l'utilitaire «rv», qui fournit une interface pour interagir depuis l'espace utilisateur avec les gestionnaires du sous-système RV (Runtime Verification), conçu pour vérifier la conformité des opérations sur des systèmes à haute fiabilité, garantissant l'absence de pannes. La vérification est effectuée en temps réel par l'attachement de gestionnaires aux points de traçage, qui comparent le déroulement réel à un modèle déterministe de référence prédéfini, définissant le comportement attendu du système.
- Dans le dispositif zRAM, qui permet de stocker la partition d'échange en mémoire de manière compressée (un périphérique de bloc est créé en mémoire sur lequel le swap est effectué avec compression), la possibilité de regrouper les pages avec un algorithme alternatif pour atteindre un niveau de compression plus élevé a été mise en œuvre. L'idée principale est de fournir un choix entre plusieurs algorithmes (lzo, lzo-rle, lz4, lz4hc, zstd) offrant divers compromis entre la vitesse de compression/décompression et le niveau de compression, ou optimaux dans des situations particulières (par exemple, pour la compression de grandes pages de mémoire).
- Une API «iommufd» a été ajoutée pour gérer depuis l'espace utilisateur le système de gestion de la mémoire d'entrée/sortie — IOMMU (I/O Memory-Management Unit). La nouvelle API permet de gérer les tables de pages de mémoire d'entrée/sortie en utilisant des descripteurs de fichiers.
- Dans BPF, il est désormais possible de créer des types, de définir des objets personnalisés, de construire sa propre hiérarchie d'objets et de former de manière flexible ses propres structures de données, telles que des listes chaînées. Un support des verrouillages bpf_rcu_read_{,un}lock() a été ajouté pour les programmes BPF transitoires (BPF_F_SLEEPABLE). Un type de carte BPF_MAP_TYPE_CGRP_STORAGE a été introduit, fournissant un stockage local pour les cgroups.
- Pour le mécanisme de verrouillage RCU (Read-copy-update), un mécanisme optionnel de rappels «paresseux» a été mis en œuvre, dans lequel plusieurs rappels sont traités en mode batch à intervalles. L'application de cette optimisation permet de réduire de 5 à 10% la consommation d'énergie sur les appareils Android et ChromeOS en reportant les demandes RCU pendant les périodes d'inactivité ou de faible charge système.
- Ajout de sysctl split_lock_mitigate pour gérer la réaction du système face à des blocages fractionnés (« split lock »), qui apparaissent lors d'un accès à des données non alignées dans la mémoire, lorsque des instructions atomiques traversent deux lignes de cache CPU. De tels blocages entraînent une diminution significative des performances. Si on définit split_lock_mitigate à 0, un simple avertissement est affiché concernant le problème, tandis qu'en le définissant à 1, un avertissement est également affiché et le processus à l'origine du blocage est ralenti pour préserver les performances du reste du système.
- Pour l'architecture PowerPC, une nouvelle implémentation des verrous qspinlock a été proposée, montrant de meilleures performances et résolvant certains problèmes de blocage survenant dans des cas exceptionnels.
- Le code de traitement des interruptions MSI (Message-Signaled Interrupts) a été retravaillé, résolvant des problèmes architecturaux accumulés et ajoutant le support de l'association de gestionnaires distincts à différents dispositifs.
- Pour les systèmes basés sur l'architecture du jeu d'instructions LoongArch, utilisée dans les processeurs Loongson 3 5000 et implémentant un nouveau RISC ISA similaire à MIPS et RISC-V, le support d'ftrace, de la protection de la pile, ainsi que des modes veille et attente a été mis en œuvre.
- La possibilité de nommer des zones de mémoire anonyme partagée a été ajoutée (auparavant, les noms ne pouvaient être attribués qu'à la mémoire anonyme privée, liée à un processus spécifique).
- Un nouveau paramètre de ligne de commande du noyau, « trace_trigger », a été ajouté pour activer l'activation de déclencheurs de traçage, utilisés pour l'association de commandes conditionnelles déclenchées lors d'une vérification (par exemple, trace_trigger=« sched_switch.stacktrace si prev_state == 2 »).
- Les exigences de version pour le paquet binutils ont été renforcées. Pour compiler le noyau, il nécessite maintenant au moins binutils 2.25.
- Lors de l'appel de exec(), il a été ajouté la possibilité de placer le processus dans un espace de noms temporel (time namespace), où le temps diffère de celui du système.
- Le transfert des fonctionnalités supplémentaires de la branche Rust-for-Linux liées à l'utilisation du langage Rust comme deuxième langage pour le développement de pilotes et de modules du noyau a commencé. Le support de Rust n'est pas actif par défaut et ne fait pas de Rust une dépendance de construction obligatoire pour le noyau. La fonctionnalité de base proposée dans la version précédente a été étendue avec des capacités pour le support de code bas niveau, telles que le type Vec et les macros pr_debug!(), pr_cont!() et pr_alert!(), ainsi que la macro procédurale « #[vtable] », qui simplifie le travail avec les tables de pointeurs de fonctions. L'ajout de liaisons Rust de haut niveau sur les sous-systèmes du noyau, permettant la création de pilotes complets en Rust, est prévu dans les prochaines versions.
- Le type « char » utilisé dans le noyau est maintenant par défaut déclaré comme non signé pour toutes les architectures.
- Le mécanisme de distribution de la mémoire slab - SLOB (slab allocator), conçu pour les systèmes avec peu de mémoire, est maintenant obsolète. Il est recommandé d'utiliser SLUB ou SLAB dans des conditions normales plutôt que SLOB. Pour les systèmes avec peu de mémoire, il est conseillé d'appliquer SLUB en mode SLUB_TINY.
- L'inclusion de code et de modifications fournis sous la licence Copyleft-Next 0.3.1 est désormais autorisée dans le noyau. La licence Copyleft-Next, créée par un des auteurs de la GPLv3, est totalement compatible avec la GPLv2, comme l'ont confirmé des avocats des entreprises SUSE et Red Hat. Comparée à la GPLv2, la licence Copyleft-Next est nettement plus concise et simple à comprendre (la préface et les références à des compromis obsolètes ont été supprimées), elle définit les délais et les procédures de résolution des infractions, et supprime automatiquement les exigences de copyleft pour les travaux qui ont plus de 15 ans.
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Des améliorations ont été apportées à Btrfs, visant à résoudre le problème du « write hole » dans l'implémentation RAID 5/6 (tentative de récupération RAID, si un crash survient pendant l'écriture et qu'il est impossible de déterminer quel bloc a été correctement écrit sur quel dispositif RAID, ce qui peut entraîner la corruption de blocs correspondant à des blocs non écrits). De plus, pour les SSD, l'exécution asynchrone de l'opération « discard » est maintenant automatiquement activée par défaut si possible, permettant d'obtenir une meilleure performance grâce à un groupement efficace des opérations « discard » dans la file d'attente et à leur traitement par un gestionnaire de fond. Les performances des opérations send et lseek, ainsi que d'ioctl FIEMAP, ont été améliorées.
- Les fonctionnalités de gestion des écritures différées (writeback, sauvegarde en arrière-plan des données modifiées) pour les dispositifs de bloc ont été étendues. Dans certaines situations, comme lors de l'utilisation de dispositifs de bloc en réseau ou de clés USB, l'écriture différée peut entraîner une consommation importante de mémoire vive. Pour gérer le comportement de l'écriture différée et maintenir la taille du cache de pages dans certaines limites dans sysfs (/sys/class/bdi/), de nouveaux paramètres strict_limit, min_bytes, max_bytes, min_ratio_fine et max_ratio_fine ont été proposés.
- Le système de fichiers F2FS a implémenté l'opération ioctl de remplacement atomique, permettant d'effectuer l'écriture de données dans un fichier dans le cadre d'une seule opération atomique. F2FS a également ajouté un cache de blocs d'extent, aidant à identifier les données utilisées activement ou celles qui n'ont pas été consultées depuis longtemps.
- Dans le système de fichiers ext4, seule la correction de bogues est notée.
- Dans le système de fichiers ntfs3, plusieurs nouvelles options de montage ont été proposées : «nocase» pour contrôler la prise en compte de la casse dans les noms de fichiers et de répertoires ; windows_name pour interdire la création de noms de fichiers contenant des caractères non valables pour le système d'exploitation Windows ; hide_dot_files pour gérer l'attribution d'une étiquette de fichiers cachés pour les fichiers commençant par un point.
- Dans le système de fichiers Squashfs, l'option de montage «threads=» a été mise en œuvre, permettant de définir le nombre de threads pour paralléliser les opérations de décompression. Dans Squashfs, il est également désormais possible de mapper les identifiants d'utilisateur des systèmes de fichiers montés, utilisables pour la correspondance des fichiers d'un utilisateur dans une partition montée par un autre utilisateur dans le système actuel.
- La mise en œuvre des listes de contrôle d'accès POSIX (POSIX ACL) a été retravaillée. Dans cette nouvelle mise en œuvre, les problèmes architecturaux ont été résolus, l'entretien de la base de code a été simplifié et des types de données plus sûrs ont été utilisés.
- La sous-système fscrypt, utilisé pour le chiffrement transparent des fichiers et des répertoires, a été étendu pour prendre en charge l'algorithme de chiffrement SM4 (norme chinoise GB/T 32907-2016).
- Il est désormais possible de compiler le noyau sans le support de NFSv2 (à l'avenir, le support de NFSv2 devrait être complètement abandonné).
- L'organisation de la vérification des droits d'accès aux dispositifs NVMe a été modifiée. Il est désormais possible de lire et d'écrire sur le dispositif NVMe si le processus d'écriture a accès à un fichier spécial du dispositif (auparavant, le processus devait avoir le droit CAP_SYS_ADMIN).
- Le pilote de paquet pour CD/DVD, obsolète depuis 2016, a été supprimé.
- Virtualisation et sécurité
- Une nouvelle méthode de protection contre la vulnérabilité Retbleed sur les CPU Intel et AMD a été mise en œuvre, utilisant le suivi de la profondeur des appels, ce qui ralentit moins le fonctionnement que la protection précédente contre Retbleed. Pour activer ce nouveau mode, un paramètre de ligne de commande du noyau, « retbleed=stuff », a été proposé.
- Un mécanisme hybride de protection du flux d'exécution des commandes FineIBT a été ajouté, combinant l'utilisation des instructions matérielles Intel IBT (Indirect Branch Tracking) et la protection logicielle kCFI (kernel Control Flow Integrity) pour bloquer les violations de l'ordre normal d'exécution (control flow) causées par des exploits modifiant les pointeurs de fonction stockés en mémoire. FineIBT ne permet l'exécution via un saut indirect que si le saut mène à une instruction ENDBR, qui se trouve au début de la fonction. De plus, à l'instar du mécanisme kCFI, un contrôle par hachage est effectué, garantissant l'intégrité des pointeurs.
- Des restrictions ont été ajoutées pour bloquer les attaques manipulant la génération d'états « oops », après quoi les tâches problématiques se terminent et l'état est rétabli sans arrêter le fonctionnement du système. En cas d'un très grand nombre d'appels d'états « oops », un dépassement de compteur de références (refcount) peut survenir, ce qui permet d'exploiter des vulnérabilités causées par le déréférencement de pointeurs NULL. Pour se protéger contre de telles attaques, une limite maximale pour le nombre d'occurrences « oops » a été ajoutée au noyau, après laquelle le noyau initiera un passage en état « panic » avec un redémarrage ultérieur, empêchant ainsi d'atteindre le nombre d'itérations nécessaire pour le dépassement de refcount. Par défaut, la limite est fixée à 10 000 « oops », mais elle peut être modifiée via le paramètre oops_limit.
- Ajout du paramètre de configuration LEGACY_TIOCSTI et de sysctl legacy_tiocsti pour désactiver la possibilité d'envoyer des données au terminal via l'ioctl TIOCSTI, car cette fonctionnalité peut être utilisée pour injecter des caractères arbitraires dans le tampon d'entrée du terminal et simuler une saisie utilisateur.
- Un nouveau type de structure interne encoded_page a été proposé, dans lequel les bits inférieurs de l'adresse sont utilisés pour conserver des informations supplémentaires, utilisées pour protéger contre le déréférencement accidentel du pointeur (en cas de réelle nécessité de déréférencer, il faut d'abord nettoyer ces bits supplémentaires).
- Sur la plateforme ARM64, à l'étape de démarrage, il est possible d'activer ou de désactiver l'implémentation logicielle du mécanisme Shadow Stack, utilisé pour protéger contre la corruption de l'adresse de retour d'une fonction en cas de débordement de tampon sur la pile (le principe de protection consiste à enregistrer, après la transmission du contrôle à la fonction, l'adresse de retour dans une 'pile d'ombre' distincte et à extraire cette adresse avant de sortir de la fonction). Le support à la fois de l'implémentation logicielle et matérielle du Shadow Stack dans une seule version du noyau permet d'utiliser un même noyau sur différents systèmes ARM, indépendamment du support des instructions pour l'authentification des pointeurs. L'activation de l'implémentation logicielle se fait par la substitution lors du chargement des instructions nécessaires dans le code.
- Support ajouté pour l'utilisation sur les processeurs Intel du mécanisme d'avis de sortie asynchrone (asynchronous exit notification), permettant de détecter les attaques par pas unique sur le code exécuté dans les enclaves SGX.
- Un ensemble d'opérations a été proposé pour permettre à l'hyperviseur de gérer les demandes des systèmes invités Intel TDX (Trusted Domain Extensions).
- Les options de construction du noyau RANDOM_TRUST_BOOTLOADER et RANDOM_TRUST_CPU ont été supprimées, à la place, il convient d'utiliser les options de ligne de commande correspondantes random.trust_bootloader et random.trust_cpu.
- Dans le mécanisme Landlock, qui permet de limiter l'interaction d'un groupe de processus avec l'environnement extérieur, un support pour le drapeau LANDLOCK_ACCESS_FS_TRUNCATE a été ajouté, permettant de contrôler l'exécution des opérations de troncature de fichiers.
- Sous-système réseau
- Pour l'IPv6, un support pour le PLB (Protective Load Balancing) a été ajouté, un mécanisme de répartition de la charge entre les liaisons réseau visant à réduire les points de surcharge sur les commutateurs des centres de données. En modifiant le Flow Label IPv6, le PLB change aléatoirement les chemins des paquets pour équilibrer la charge sur les ports du commutateur. Afin de réduire le réordre des paquets, cette opération est réalisée autant que possible après des périodes d'inactivité. L'application du PLB dans les centres de données Google a permis de réduire le déséquilibre de charge sur les ports des commutateurs en moyenne de 60 %, de diminuer la perte de paquets de 33 % et de réduire les latences de 20 %.
- Un pilote pour les appareils MediaTek prenant en charge le Wi-Fi 7 (802.11be) a été ajouté.
- Le support pour des liaisons de 800 gigabits a été ajouté.
- Il est désormais possible de renommer les interfaces réseau à la volée, sans interrompre le fonctionnement.
- Les messages de journalisation concernant le SYN flood incluent désormais l'adresse IP à laquelle le paquet a été reçu.
- Pour UDP, il est désormais possible d'utiliser des tables de hachage séparées pour différents espaces de noms réseau.
- Le support de la méthode d'authentification MAB (MAC Authentication Bypass) a été implémenté pour les ponts réseau.
- Pour le protocole CAN (CAN_RAW), le support du mode de socket SO_MARK a été ajouté pour attacher des filtres de trafic basés sur fwmark.
- Un nouveau paramètre bitmask a été ajouté dans ipset, permettant de définir un masque basé sur des bits arbitraires dans l'adresse IP (par exemple, «ipset create set1 hash:ip bitmask 255.128.255.0»).
- Le support du traitement des en-têtes internes (inner) contenus dans les paquets encapsulés a été ajouté dans nf_tables.
- Matériel
- Un sous-système «accel» a été ajouté avec la mise en œuvre d'un cadre pour les accélérateurs de calcul qui peuvent être fournis à la fois sous forme d'ASIC distincts et de blocs IP intégrés dans des SoC et GPU. Ces accélérateurs sont principalement orientés vers l'accélération des tâches d'apprentissage automatique.
- Le pilote amdgpu inclut le support des composants IP GC, PSP, SMU et NBIO. Le support du DCN (Display Core Next) a été ajouté pour les systèmes ARM64. La mise en œuvre de la sortie d'écran sécurisée a été mise à jour d'un usage de DCN10 vers DCN21 et peut désormais être utilisée lors de la connexion de plusieurs écrans.
- Le pilote i915 (Intel) a stabilisé le support des cartes graphiques discrètes Intel Arc (DG2/Alchemist).
- Le pilote Nouveau a ajouté le support du GPU NVIDIA GA102 (RTX 30) basé sur l'architecture Ampere. Pour les cartes nva3 (GT215), une gestion de l'éclairage d'arrière-plan a été ajoutée.
- Ajout de la prise en charge des adaptateurs sans fil basés sur les puces Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) et MediaTek MT7996, interfaces Bluetooth Broadcom BCM4377/4378/4387, ainsi que des contrôleurs Ethernet Motorcomm yt8521 et NVIDIA Tegra GE.
- Ajout de la prise en charge de l'ASoC (ALSA System on Chip) pour les puces audio intégrées HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Prise en charge de l'interface audio Focusrite Saffire Pro 40 ajoutée. Ajout du codec audio Realtek RT1318.
- Ajout de la prise en charge des smartphones et tablettes Sony (Xperia 10 IV, 5 IV, X et X compact, OnePlus One, 3, 3T et Nord N100, Xiaomi Poco F1 et Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
- Ajout de la prise en charge des SoC ARM et des cartes Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695), SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.
Simultanément, la Fondation latino-américaine pour le logiciel libre a formé une version entièrement libre du noyau 6.2 — Linux-libre 6.2-gnu, dépouillée des éléments de firmware et des pilotes contenant des composants non libres ou des portions de code dont l'utilisation est limitée par le fabricant. Dans cette nouvelle version, un nettoyage des nouveaux blobs dans le pilote nouveau a été effectué. Le chargement des blobs dans les pilotes mt7622, mt7996 wifi et bcm4377 bluetooth a été désactivé. Nettoyage des noms des blobs dans les fichiers dts pour l'architecture Aarch64. Le code de nettoyage des blobs dans divers pilotes et sous-systèmes a été mis à jour. Le nettoyage du pilote s5k4ecgx a été arrêté, car il a été supprimé du noyau.
Source : opennet.ru
