Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.2. Tra le modifiche più significative: è stata consentita l'inclusione di codice sotto licenza Copyleft-Next, migliorata l'implementazione RAID5/6 in Btrfs, proseguita l'integrazione del supporto per il linguaggio Rust, ridotte le spese per la protezione contro gli attacchi Retbleed, aggiunta la possibilità di regolare il consumo di memoria durante la scrittura inversa, per TCP è stato aggiunto un meccanismo di bilanciamento PLB (Protective Load Balancing), introdotto un meccanismo ibrido di protezione del flusso di esecuzione dei comandi (FineIBT), in BPF è stata aggiunta la possibilità di definire oggetti e strutture dati personalizzati, è stato incluso uno strumento rv (Runtime Verification) e ridotto il consumo energetico nell'implementazione dei blocchi RCU.
Nella nuova versione sono stati accettati 16843 riparazioni da 2178 sviluppatori, la dimensione della patch è di 62 MB (le modifiche hanno riguardato 14108 file, aggiunte 730195 righe di codice, rimosse 409485 righe). Circa il 42% di tutte le modifiche presentate in 6.2 riguarda i driver dei dispositivi, circa il 16% delle modifiche è relativo all'aggiornamento di codice specifico per architetture hardware, il 12% è legato allo stack di rete, il 4% ai file system e il 3% ai sottosistemi interni del kernel.
Le principali novità del kernel 6.2:
- Memoria e servizi di sistema
- È consentito includere nel kernel codice e modifiche forniti sotto licenza Copyleft-Next 0.3.1. La licenza Copyleft-Next è stata creata da uno degli autori della GPLv3 ed è completamente compatibile con la licenza GPLv2, come confermato dagli avvocati delle aziende SUSE e Red Hat. Rispetto alla GPLv2, la licenza Copyleft-Next è notevolmente più compatta e più facile da comprendere (è stata rimossa l'introduzione e la menzione di compromessi obsoleti), definisce scadenze e procedure per la risoluzione delle violazioni e rimuove automaticamente i requisiti di copyleft per cosa obsoleta, che ha più di 15 anni.
Copyleft-Next contiene anche un articolo che concede diritti su tecnologie brevettate, il che, a differenza della GPLv2, rende questa licenza compatibile con la licenza Apache 2.0. Per garantire la piena compatibilità con la GPLv2, nel testo di Copyleft-Next è esplicitamente indicato che l'opera derivata può essere fornita non solo sotto la licenza originale Copyleft-Next, ma anche sotto la licenza GPL.
- È stato incluso uno strumento "rv" che fornisce un'interfaccia per l'interazione dallo spazio utente con i gestori del sottosistema RV (Runtime Verification), progettato per verificare la correttezza operativa su sistemi ad alta affidabilità, garantendo l'assenza di errori. La verifica avviene durante l'esecuzione tramite l'attacco di gestori a punti di tracciamento che confrontano l'effettivo progresso dell'esecuzione con un modello deterministico di riferimento predefinito, che definisce il comportamento atteso del sistema.
- Nel dispositivo zRAM, che consente di memorizzare una partizione di swap in memoria in forma compressa (viene creato un dispositivo a blocchi in memoria che causa il swapping con compressione), è stata implementata la possibilità di ri-pacchettizzare le pagine utilizzando un algoritmo alternativo per raggiungere un livello di compressione più elevato. L'idea principale è quella di fornire una scelta tra diversi algoritmi (lzo, lzo-rle, lz4, lz4hc, zstd), che offrono compromessi diversi tra velocità di compressione/decompressione e livello di compressione o che sono ottimali in situazioni particolari (ad esempio, per la compressione di grandi pagine di memoria).
- È stato aggiunto l'API "iommufd" per gestire dallo spazio utente il sistema di gestione della memoria in ingresso e uscita — IOMMU (I/O Memory-Management Unit). La nuova API consente di gestire le tabelle delle pagine di memoria in ingresso/uscita utilizzando descrittori di file.
- In BPF è stata fornita la possibilità di creare tipi, definire oggetti personalizzati, costruire la propria gerarchia di oggetti e formare in modo flessibile le proprie strutture dati, come le liste collegate. Per le BPF-program che transitano in modalità di sospensione (BPF_F_SLEEPABLE) è stato aggiunto il supporto per i blocchi bpf_rcu_read_{,un}lock(). È stato implementato il salvataggio degli oggetti task_struct. È stato aggiunto un tipo di mappa BPF_MAP_TYPE_CGRP_STORAGE, che fornisce uno spazio di archiviazione locale per cgroups.
- Per il meccanismo dei blocchi RCU (Read-copy-update) è stato implementato un meccanismo opzionale di callback "pigri", in cui più callback vengono elaborati contemporaneamente in modalità batch tramite un timer. L'applicazione dell'ottimizzazione proposta consente di ridurre il consumo energetico del 5-10% sui dispositivi Android e ChromeOS ritardando le richieste RCU durante i periodi di inattività o di bassa carico sul sistema.
- È stato aggiunto sysctl split_lock_mitigate per gestire la reazione del sistema quando vengono rilevate le lock disperse («split lock»), che si verificano quando si accede a dati non allineati in memoria a causa del fatto che, durante l'esecuzione di un'istruzione atomica, i dati attraversano due linee di cache della CPU. Tali lock portano a un significativo calo delle prestazioni. Impostando split_lock_mitigate a 0, viene emesso un semplice avviso sulla presenza del problema, mentre impostandolo a 1 oltre all'avviso viene anche ridotto il tempo di esecuzione del processo che ha causato la lock, per preservare le prestazioni del resto del sistema.
- Per l'architettura PowerPC è stata proposta una nuova implementazione delle lock qspinlock, che mostra prestazioni superiori e risolve alcuni problemi di lock che si verificano in casi eccezionali.
- Il codice di gestione delle interruzioni MSI (Message-Signaled Interrupts) è stato rielaborato per correggere problemi architetturali accumulati e per aggiungere il supporto per l'associazione di singoli gestori a diversi dispositivi.
- Per i sistemi basati sull'architettura del set di istruzioni LoongArch, utilizzata nei processori Loongson 3 5000 e che implementa il nuovo RISC ISA, simile a MIPS e RISC-V, è stato implementato il supporto per ftrace, protezione dello stack, modalità di sospensione e attesa.
- È stata fornita la possibilità di assegnare nomi alle aree di memoria condivisa anonima (in precedenza, i nomi potevano essere assegnati solo alla memoria anonima privata, legata a un processo specifico).
- È stato aggiunto un nuovo parametro della riga di comando del kernel «trace_trigger», destinato ad attivare un trigger di tracciamento, utilizzato per associare comandi condizionali chiamati all'attivazione di un controllo (ad esempio, trace_trigger="sched_switch.stacktrace if prev_state == 2").
- Sono stati aumentati i requisiti per la versione del pacchetto binutils. Per compilare il kernel ora è richiesto almeno binutils 2.25.
- All'invocazione di exec() è stata aggiunta la possibilità di collocare il processo nello spazio dei nomi del tempo (time namespace), in cui il tempo differisce da quello di sistema.
- È iniziato il trasferimento dalla branch Rust-for-Linux di funzionalità aggiuntive legate all’uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel. Il supporto per Rust è disabilitato di default e non porta all'inclusione di Rust tra le dipendenze di compilazione obbligatorie per il kernel. La funzionalità di base proposta nel rilascio precedente è stata ampliata con funzionalità per supportare codice a basso livello, come il tipo Vec e i macro pr_debug!(), pr_cont!() e pr_alert!(), oltre al macro procedurale «#[vtable]», che semplifica il lavoro con le tabelle di puntatori a funzioni. L'aggiunta di wrapper Rust ad alto livello sopra le sottosistemi del kernel, che permetterà di creare driver completi in Rust, è attesa nei prossimi rilasci.
- Il tipo «char» utilizzato nel kernel è ora dichiarato come senza segno per tutte le architetture di default.
- Il meccanismo di allocazione della memoria slab - SLOB (slab allocator), progettato per sistemi con piccole quantità di memoria, è stato dichiarato obsoleto. In circostanze normali, è consigliato utilizzare SLUB o SLAB al posto di SLOB. Per i sistemi con piccole quantità di memoria, si consiglia di utilizzare SLUB in modalità SLUB_TINY.
- È consentito includere nel kernel codice e modifiche forniti sotto licenza Copyleft-Next 0.3.1. La licenza Copyleft-Next è stata creata da uno degli autori della GPLv3 ed è completamente compatibile con la licenza GPLv2, come confermato dagli avvocati delle aziende SUSE e Red Hat. Rispetto alla GPLv2, la licenza Copyleft-Next è notevolmente più compatta e più facile da comprendere (è stata rimossa l'introduzione e la menzione di compromessi obsoleti), definisce scadenze e procedure per la risoluzione delle violazioni e rimuove automaticamente i requisiti di copyleft per cosa obsoleta, che ha più di 15 anni.
- Sottosistema disco, I/O e file system
- In Btrfs sono stati apportati miglioramenti mirati a risolvere il problema del «write hole» nell'implementazione RAID 5/6 (tentativo di recuperare RAID se il guasto si è verificato durante la scrittura, e non è possibile determinare quale blocco su quale dei dispositivi RAID sia stato scritto correttamente, il che può portare a Danneggiare i blocchi corrispondenti ai blocchi non scritti). Inoltre, per gli SSD, ora viene attivata automaticamente, se possibile, l'esecuzione asincrona dell'operazione «discard», che consente di ottenere prestazioni più elevate grazie all'efficiente raggruppamento delle operazioni «discard» in coda e alla gestione della coda da parte di un gestore in background. Sono state migliorate le prestazioni delle operazioni send e lseek, oltre a ioctl FIEMAP.
- Sono state ampliate le opzioni di gestione della scrittura ritardata (writeback, salvataggio in background dei dati modificati) per i dispositivi a blocchi. In alcune situazioni, ad esempio con dispositivi a blocchi di rete o unità USB, la scrittura ritardata può portare a un alto consumo di memoria. Per gestire il comportamento della scrittura ritardata e mantenere la dimensione della cache di pagina entro determinati limiti, in sysfs (/sys/class/bdi/) sono stati introdotti nuovi parametri: strict_limit, min_bytes, max_bytes, min_ratio_fine e max_ratio_fine.
- Nel file system F2FS è stata implementata un'operazione ioctl di sostituzione atomica che consente di scrivere dati in un file come un'unica operazione atomica. Inoltre, in F2FS è stato aggiunto un cache a blocchi per gli extent, utile per identificare i dati utilizzati attivamente o quelli a cui non si è acceduto per lungo tempo.
- Nel file system ext4 è stato effettuato esclusivamente un fix di bug.
- Nel file system ntfs3 sono state proposte diverse nuove opzioni di montaggio: «nocase» per gestire la distinzione tra maiuscole e minuscole nei nomi di file e directory; «windows_name» per vietare la creazione di nomi di file contenenti caratteri non validi per il sistema operativo Windows; «hide_dot_files» per gestire l'assegnazione del flag di file nascosti ai file che iniziano con un punto.
- Nel file system Squashfs è stata implementata un'opzione di montaggio «threads=», che consente di definire il numero di thread per parallelizzare le operazioni di estrazione. Inoltre, in Squashfs è stata aggiunta la possibilità di mappare gli ID degli utenti dei file system montati, utilizzata per associare file di un determinato utente su una partizione montata di un altro utente con un altro utente nel sistema attuale.
- È stata riprogettata l'implementazione delle liste di controllo degli accessi POSIX (POSIX ACL). Nella nuova implementazione sono stati risolti problemi architettonici, semplificata la manutenzione del codice e utilizzati tipi di dati più sicuri.
- Nella sottosistema fscrypt, utilizzato per la crittografia trasparente di file e cartelle, è stata aggiunta la supporto per l'algoritmo di crittografia SM4 (standard cinese GB/T 32907-2016).
- È stata fornita la possibilità di compilare il kernel senza il supporto per NFSv2 (in futuro il supporto per NFSv2 sarà completamente interrotto).
- È stata modificata l'organizzazione del controllo dei diritti di accesso ai dispositivi NVMe, consentendo la lettura e la scrittura sui dispositivi NVMe se il processo di scrittura ha accesso a un file dispositivo speciale (in precedenza il processo doveva avere la capacità CAP_SYS_ADMIN).
- È stato rimosso il driver pacchettizzato per CD/DVD, che era stato dichiarato obsoleto nel 2016.
- Virtualizzazione e sicurezza
- È stato implementato un nuovo metodo di protezione contro la vulnerabilità Retbleed nelle CPU Intel e AMD, utilizzando il tracciamento della profondità delle chiamate, senza rallentare il funzionamento tanto quanto la protezione contro Retbleed presente in precedenza. Per abilitare la nuova modalità, è stato proposto il parametro della riga di comando del kernel «retbleed=stuff».
- È stato aggiunto un meccanismo ibrido di protezione del flusso di esecuzione delle istruzioni FineIBT, che combina l'uso delle istruzioni hardware Intel IBT (Indirect Branch Tracking) e la protezione software kCFI (kernel Control Flow Integrity) per bloccare la violazione dell'ordine normale di esecuzione (control flow) a seguito dell'uso di exploit che alterano i puntatori delle funzioni memorizzati. FineIBT consente l'esecuzione tramite transizioni indirette solo nel caso di una transizione all'istruzione ENDBR, che è posizionata all'inizio della funzione. Inoltre, analogamente al meccanismo kCFI, viene effettuato il controllo degli hash, garantendo l'immutabilità dei puntatori.
- Sono state aggiunte restrizioni per bloccare attacchi che manipolano la generazione di stati «oops», dopo i quali i processi problematici vengono terminati e lo stato viene ripristinato senza interrompere il funzionamento del sistema. In presenza di un numero molto elevato di chiamate allo stato «oops», si verifica un overflow del contatore di riferimenti (refcount), che consente di sfruttare vulnerabilità causate dalla dereferenziazione di puntatori NULL. Per proteggere da tali attacchi, è stato aggiunto un limite al numero massimo di attivazioni «oops» nel kernel, oltre il quale il kernel avvierà una transizione allo stato di «panic» con successivo riavvio, impedendo così di raggiungere il numero di iterazioni necessario per l'overflow del refcount. Di default, il limite è impostato a 10.000 «oops», ma si può modificare tramite il parametro oops_limit.
- È stato aggiunto il parametro di configurazione LEGACY_TIOCSTI e il sysctl legacy_tiocsti per disabilitare la possibilità di inserire dati nel terminale tramite ioctl TIOCSTI, poiché tale funzionalità può essere utilizzata per inserire simboli arbitrari nel buffer di input del terminale e simulare l'input dell'utente.
- È stata proposta una nuova tipologia di strutture interne encoded_page, in cui i bit inferiori del puntatore vengono utilizzati per memorizzare informazioni aggiuntive, utilizzate per proteggere contro la dereferenziazione accidentale del puntatore (in caso di reale necessità di dereferenziazione, è necessario prima azzerare questi bit aggiuntivi).
- Sulla piattaforma ARM64, durante il processo di avvio, è stata introdotta la possibilità di attivare e disattivare l'implementazione software del meccanismo Shadow Stack, utilizzato per proteggere contro la sovrascrittura dell'indirizzo di ritorno da una funzione in caso di overflow del buffer nello stack (la protezione consiste nel salvare, dopo aver trasferito il controllo alla funzione, l'indirizzo di ritorno in un "shadow" stack separato e recuperare tale indirizzo prima di uscire dalla funzione). Il supporto sia per l'implementazione hardware che software dello Shadow Stack in un'unica build del kernel consente di utilizzare lo stesso kernel su diversi sistemi ARM, indipendentemente dal supporto delle istruzioni per l'autenticazione dei puntatori. L'attivazione dell'implementazione software avviene tramite la sostituzione delle istruzioni necessarie nel codice durante l'avvio.
- È stato aggiunto il supporto per l'utilizzo sui processori Intel del meccanismo di notifica asincrona di uscita (asynchronous exit notification), che consente di rilevare attacchi a singolo passo (single-step) sul codice eseguito negli enclave SGX.
- È stato proposto un insieme di operazioni che consentono al hypervisor di gestire le richieste dai sistemi guest Intel TDX (Trusted Domain Extensions).
- Sono state rimosse le impostazioni di build del kernel RANDOM_TRUST_BOOTLOADER e RANDOM_TRUST_CPU, per le quali è ora necessario utilizzare le opzioni corrispondenti della riga di comando random.trust_bootloader e random.trust_cpu.
- Nel meccanismo Landlock, che limita l'interazione di un gruppo di processi con l'ambiente esterno, è stato aggiunto il supporto per il flag LANDLOCK_ACCESS_FS_TRUNCATE, che consente di controllare l'esecuzione delle operazioni di troncamento dei file.
- Sottosistema di rete
- Per IPv6 è stato aggiunto il supporto PLB (Protective Load Balancing), un meccanismo di bilanciamento del carico tra i collegamenti di rete, mirato a ridurre i punti di sovraccarico sugli switch dei data center. Modificando l'IPv6 Flow Label, PLB cambia casualmente i percorsi dei pacchetti per bilanciare il carico sulle porte degli switch. Per ridurre il riordino dei pacchetti, quest'operazione viene eseguita, se possibile, dopo i periodi di inattività. L'applicazione di PLB nei data center di Google ha consentito di ridurre il disavanzo di carico sulle porte degli switch in media del 60%, diminuire la perdita di pacchetti del 33% e ridurre i ritardi del 20%.
- È stato aggiunto un driver per dispositivi MediaTek con supporto per Wi-Fi 7 (802.11be).
- Aggiunto il supporto per collegamenti a 800 gigabit.
- È stata aggiunta la possibilità di rinominare interfacce di rete al volo, senza interrompere il funzionamento.
- Nei messaggi di log registrati riguardanti SYN flood è stata aggiunta la menzione dell'indirizzo IP del pacchetto ricevuto.
- Per UDP è stata realizzata la possibilità di utilizzare tabelle hash separate per diversi spazi dei nomi di rete.
- Per i bridge di rete è stato implementato il supporto per il metodo di autenticazione MAB (MAC Authentication Bypass).
- Per il protocollo CAN (CAN_RAW) è stato implementato il supporto della modalità socket SO_MARK per l'attacco di filtri del traffico basati su fwmark.
- In ipset è stato realizzato un nuovo parametro bitmask, che consente di specificare una maschera basata su bit arbitrari in un indirizzo IP (ad esempio, "ipset create set1 hash:ip bitmask 255.128.255.0").
- In nf_tables è stato aggiunto il supporto per l'elaborazione degli header interni (inner headers) che si trovano all'interno dei pacchetti incapsulati.
- Attrezzature
- È stata aggiunta la sottosistema "accel" con implementazione di un framework per acceleratori di calcolo, che possono essere forniti sia come ASIC distinti che come blocchi IP all'interno di SoC e GPU. Questi acceleratori sono principalmente orientati a velocizzare la risoluzione di compiti di apprendimento automatico.
- Nel driver amdgpu è stato incluso il supporto per i componenti IP GC, PSP, SMU e NBIO. Per le sistemi ARM64 è stato realizzato il supporto per DCN (Display Core Next). L'implementazione dell'uscita protetta sullo schermo è stata aggiornata da DCN10 a DCN21 e può ora essere utilizzata quando si collegano più schermi.
- Nel driver i915 (Intel) è stato stabilizzato il supporto per schede grafiche discrete Intel Arc (DG2/Alchemist).
- Nel driver Nouveau è stato implementato il supporto per GPU NVIDIA GA102 (RTX 30) basato sull'architettura Ampere. Per le schede nva3 (GT215) è stata aggiunta la possibilità di controllare l'illuminazione di sfondo.
- È stato aggiunto il supporto per adattatori wireless basati su chip Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) e MediaTek MT7996, interfacce Bluetooth Broadcom BCM4377/4378/4387, nonché controller Ethernet Motorcomm yt8521, NVIDIA Tegra GE.
- È stato aggiunto il supporto per ASoC (ALSA System on Chip) per chip audio integrati HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. È stato aggiunto il supporto per l'interfaccia audio Focusrite Saffire Pro 40. È stato aggiunto il codec audio Realtek RT1318.
- Aggiunto il supporto per smartphone e tablet Sony (Xperia 10 IV, 5 IV, X e X compact, OnePlus One, 3, 3T e Nord N100, Xiaomi Poco F1 e Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1).
- Aggiunto il supporto per SoC ARM e schede 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.
Nel frattempo, la Fondazione del Software Libero dell'America Latina ha creato una versione completamente libera del kernel 6.2 — Linux-libre 6.2-gnu, priva di elementi di firmware e driver contenenti componenti o sezioni di codice non liberi, la cui area di applicazione è limitata dal produttore. In questo nuovo rilascio sono stati ripuliti nuovi blob nel driver nouveau. È stata disattivata la caricamento dei blob nei driver mt7622, mt7996 wifi e bcm4377 bluetooth. È avvenuta una ripulitura dei nomi dei blob nei file dts per l'architettura Aarch64. È stato aggiornato il codice di pulizia dei blob in vari driver e sottosistemi. Si è cessata la pulizia del driver s5k4ecgx, in quanto è stato rimosso dal kernel.
Fonte: opennet.ru
