Dopo sei mesi di sviluppo, è stato pubblicato il rilascio della libreria di sistema GNU C Library (glibc) 2.41, che soddisfa completamente i requisiti degli standard ISO C11 e POSIX.1-2017. Alla creazione del nuovo rilascio hanno partecipato 79 sviluppatori.
Tra i miglioramenti realizzati in Glibc 2.41 si possono segnalare:
- Per la piattaforma Linux sono state aggiunte nuove funzioni sched_setattr e sched_getattr, attraverso le quali è possibile impostare/leggere i parametri dello scheduler. Nella pratica, le funzioni consentono di configurare politiche di scheduling delle richieste, come SCHED_DEADLINE, in cui vengono utilizzati parametri aggiuntivi oltre alla priorità.
- Nell'utilità iconv è stata aggiunta la funzione di supporto per la conversione della codifica in loco (se i nomi dei file di input e output coincidono, iconv ora crea automaticamente un file temporaneo e, dopo il completamento della conversione, lo sostituisce con il file originale).
- Nel file di intestazione math.h sono state aggiunte funzioni trigonometrica, apparse nello standard C23 (TS 18661-4:2015): acospi, asinpi, atan2pi, atanpi, cospi, sinpi e tanpi.
- Dal progetto CORE-MATH sono state trasferite varianti ottimizzate e con arrotondamento corretto delle funzioni exp10m1f, exp2m1f, expm1f, log10f, log2p1f, log1pf, log10p1f, cbrtf, erff, erfcf, lgammaf, tgammaf, tanf, acosf, acoshf, asinf, asinhf, atanf, atan2f, atanhf, coshf, sinhf e tanhf.
- È stato aggiunto il supporto per l'estensione ARM64 GCS (Guarded Control Stack) per la protezione hardware degli indirizzi di ritorno dalle funzioni e il blocco di exploit che utilizzano metodi di programmazione orientati al ritorno (ROP - Return-Oriented Programming, l'exploit è composto da pezzi di istruzioni macchina esistenti che terminano con un'istruzione di ritorno). ARM64 GCS consente di utilizzare la tecnica dello shadow stack per proteggere i processi nello spazio utente: dopo che il controllo è passato a una funzione, gli indirizzi di ritorno vengono salvati dal processore non solo nello stack normale, ma anche in uno stack separato che non può essere modificato direttamente. Prima di uscire dalla funzione, l'indirizzo di ritorno viene estratto dallo shadow stack e confrontato con l'indirizzo di ritorno dallo stack principale. Per compilare Glibc con supporto GCS è necessario avere almeno le versioni binutils 2.44 e GCC 15.
- È stato compiuto un grande lavoro per migliorare la generazione del codice e aumentare le prestazioni delle funzioni matematiche per l'architettura ARM64/AArch64. Sono state implementate ottimizzazioni utilizzando istruzioni vettoriali (SVE, Scalable Vector Extension) e estensioni SIMD (Neon).
- Per i sistemi con processori ARM64/AArch64 è stata aggiunta la supporto per il meccanismo Memory Protection Keys, utilizzato per limitare l'accesso alle pagine di memoria senza modificare la tabella delle pagine di memoria.
- Per i sistemi con processori PowerPC64 è stata aggiunta la supporto per istruzioni avanzate per proteggere contro l'uso di programmi orientati al ritorno negli exploit.
- È stato aggiunto un nuovo tipo di architettura arch_kind_hygon per i processori x86-64 Hygon cinesi, basati su tecnologie AMD.
- Il set di test per glibc è stato notevolmente ampliato, con il numero di test aumentato da 5408 a 6232 rispetto alla versione precedente.
- È stata aggiunta la possibilità di testare la build di glibc utilizzando compilatori C e C++ diversi da quelli utilizzati per la build effettiva. Ad esempio, ‘configure TEST_CC="gcc-6.4.1" TEST_CXX="g++-6.4.1"‘ e ‘configure TEST_CC="clang" TEST_CXX="clang++"‘.
- Nelle opzioni specificate nel file /etc/resolv.conf e nella variabile d'ambiente RES_OPTIONS è stata implementata la possibilità di utilizzare il prefisso “-” per annullare un'opzione precedentemente impostata con questo nome. Ad esempio, se nel file /etc/resolv.conf è specificato
- Nell'resolver DNS è stata aggiunta la supporto per l'opzione “strict-error”, secondo la quale la funzione getaddrinfo(), se non è specificato esplicitamente il tipo di indirizzi (AF_UNSPEC), cercherà di ottenere valori per i record A (IPv4) e AAAA (IPv6) da un altro server DNS, se la richiesta per il record A o AAAA al primo server DNS ha avuto esito negativo. Senza specificare “strict-error” in una situazione del genere, verrà restituito l'indirizzo ottenuto a seguito di una richiesta elaborata con successo, mentre il valore della richiesta non riuscita verrà ignorato. Ad esempio, se server restituisce il record “A”, ma ha restituito un errore nella richiesta “AAAA”, getaddrinfo senza l'opzione “strict-error” restituirà subito solo l'indirizzo IPv4, mentre con l'opzione “strict-error” cercherà di ripetere le richieste a un altro server DNS.
- I dati di codifica, le informazioni sui tipi di caratteri e le tabelle di traslitterazione sono stati aggiornati per supportare la specifica Unicode 16.0.0.
- È stato aggiunto il macro «_ISOC2Y_SOURCE», che consente di attivare le funzionalità definite nella bozza dello standard C2Y. È possibile attivare funzionalità simili anche utilizzando il macro _GNU_SOURCE e tramite i flag del compilatore («gcc -std=gnu2y»).
- È stato implementato lo strumento benchtest per monitorare le prestazioni di varie funzioni (di solito matematiche).
- È stata aggiunta l'impostazione glibc.rtld.execstack, che consente di vietare esplicitamente l'uso dello stack eseguibile.
- È stata aggiunta la supporto per l'ABI estensibile rseq (sequenze riavviabili), che fornisce un meccanismo per l'esecuzione atomica rapida delle operazioni (in caso di interruzione dell'operazione da un altro thread, lo stato viene ripristinato e viene effettuato un nuovo tentativo di esecuzione). Nella nuova versione è stata introdotta la possibilità di utilizzare in rseq funzionalità avanzate assenti nell'ABI originale, come gli identificatori di esecuzione parallela (mm_cid, memory-map concurrency ID) e gli identificatori del nodo NUMA (node_id).
- È stata interrotta la supporto per il porto per sistemi big-endian ARC (arceb-linux-gnu).
- È stata risolta una vulnerabilità (CVE-2025-039) che portava a un overflow del buffer durante l'esecuzione della funzione assert(). L'overflow si verifica quando viene fornito un nome di programma troppo lungo (argv[0]). Il problema è considerato non pericoloso, poiché oltre il buffer vengono scritti 4 byte, il cui contenuto non può essere controllato dall'attaccante. È interessante il fatto stesso che sia emersa in funzioni di debug una vulnerabilità causata da un errore nell'output del nome dell'applicazione corrente.
Fonte: opennet.ru
