Dopo sei mesi di sviluppo, è stato pubblicato il rilascio della libreria C GNU (glibc) 2.39, che è completamente conforme agli standard ISO C11 e POSIX.1-2017. Questa nuova versione include correzioni da parte di 67 sviluppatori.
Tra i miglioramenti realizzati in Glibc 2.39, possiamo segnalare:
- È stato garantito il supporto per lo shadow stack, introdotto nel kernel Linux 6.6, che consente di bloccare il funzionamento di molti exploit, utilizzando le capacità hardware dei processori Intel per proteggere contro la sovrascrittura dell'indirizzo di ritorno dalla funzione in caso di overflow del buffer nello stack. L'idea alla base della protezione è che, dopo aver ceduto il controllo alla funzione, gli indirizzi di ritorno vengono salvati dal processore non solo nello stack normale, ma anche in un "shadow" 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. Una discrepanza negli indirizzi genera un'eccezione, bloccando le situazioni in cui l'exploit è riuscito a sovrascrivere l'indirizzo nello stack principale. È stata aggiunta l'opzione di compilazione "—enable-cet" per attivarla.
- È stato aggiunto un nuovo header file <stdbit.h>, definito nella bozza dello standard ISO C2X, che include le funzioni 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 e stdc_bit_ceil nelle varianti con i tipi "unsigned char", "unsigned short", "unsigned int", "unsigned long int" e "unsigned long long int".
- Per la piattaforma Linux sono state implementate le funzioni posix_spawnattr_getcgroup_np e posix_spawnattr_setcgroup_np, nonché il flag POSIX_SPAWN_SETCGROUP, che consentono di configurare cgroupv2 nel nuovo processo tramite le funzioni posix_spawn e posix_spawnp, evitando stati di competizione. Le funzioni sono estensioni GNU e richiedono un kernel Linux con supporto per la chiamata di sistema clone3.
- Per la piattaforma Linux sono state implementate le funzioni pidfd_spawn e pidfd_spawn, che sono semanticamente simili alla funzione posix_spawn, ma restituiscono un file descriptor invece dell'identificatore di processo (PID), da utilizzare con funzioni che supportano il meccanismo PIDFD, come pidfd_send_signal, poll e waitid (PIDFD è legato a un processo specifico e non cambia, mentre il PID può essere collegato a un altro processo dopo la conclusione del processo corrente associato a quel PID).
- Per la piattaforma Linux è stata aggiunta la funzione pidfd_getpid per determinare l'identificatore di processo (PID) basato sul file descriptor del processo (PIDFD) restituito dalle funzioni pid_spawn, fork_np e pidfd_open.
- Nella famiglia di funzioni scanf è stato aggiunto il modificatore di dimensione "wN", applicabile agli argomenti con i tipi intN_t, int_leastN_t, uintN_t e uint_leastN_t. Ad esempio, per leggere valori decimali con i tipi int32_t e int_least32_t, si può specificare "%w32d", mentre per i valori esadecimali "%w32x". Inoltre, è stato aggiunto il modificatore "wfN" per i tipi int_fastN_t e uint_fastN_t, inclusi nella bozza dello standard ISO C2X.
- È stata aggiunta la configurazione "glibc.cpu.plt_rewrite", che abilita la riscrittura della PLT (Procedure Linkage Table) sui sistemi x86-64, in cui il linker sostituirà i salti indiretti nella PLT con salti diretti.
- È stata aggiunta la configurazione "glibc.mem.decorate_maps" per aggiungere informazioni aggiuntive sull'allocazione della memoria (ad esempio sullo stack dei thread creato dalla funzione pthread_create o sulla memoria allocata tramite malloc).
- Nella struttura "statvfs" è stata implementata la compilazione del campo "f_type" con informazioni sul tipo di FS, equivalente al contenuto del campo nella struttura "statfs". In precedenza, in Linux, il campo "f_type" conteneva sempre 0.
- Per la piattaforma AArch64 in libmvec e math.h sono state aggiunte annotazioni che consentono di utilizzare la vectorizzazione delle chiamate durante la compilazione con l'opzione "-ffast-math" a partire da GCC 9 e versioni successive del compilatore. La vectorizzazione è attivata per le funzioni matematiche 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 e tanf.
- È stata rimossa dalla libreria libcrypt e dal relativo header file "<crypt.h>". Si consiglia agli sviluppatori di applicazioni di passare all'uso di librerie alternative, come libxcrypt.
- Nell'utility ldconfig ora vengono saltati i file con il simbolo ‘;’ nel nome del file o che terminano con «.dpkg.tmp» e «.dpkg.new», evitando che vengano elaborati file temporanei dei gestori di pacchetti rpm e dpkg.
- È stata interrotta la supporto per l'architettura ia64 (ia64*-*-linux-gnu), utilizzata nei processori Intel Itanium.
- Vulnerabilità risolte:
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 - vulnerabilità critiche nella funzione __vsyslog_internal(), che consentono, attraverso manipolazioni nell'avvio di applicazioni SUID, di eseguire codice con privilegi elevati.
- CVE-2023-4911 — vulnerabilità in Glibc ld.so che consente di ottenere diritti di root nel sistema. La vulnerabilità è causata da un errore nel codice di parsing della stringa specificata nella variabile d'ambiente GLIBC_TUNABLES e può portare alla scrittura del valore analizzato oltre il buffer allocato. Sono disponibili exploit funzionanti.
- CVE-2023-4806 — vulnerabilità nella funzione getaddrinfo, causata da un accesso alla memoria dopo il rilascio (use-after-free). Il problema si verifica quando il plugin NSS implementa solo le callback «_gethostbyname2_r» e «_getcanonname_r», ma non supporta la chiamata «_gethostbyname3_r». Per sfruttare la vulnerabilità, il server DNS deve restituire per l'host richiesto un gran numero di indirizzi IPv6 e IPv4, causando un crash del processo che ha invocato la funzione getaddrinfo per la famiglia AF_INET6 con i flag AI_CANONNAME, AI_ALL e AI_V4MAPPED.
- CVE-2023-4527 — vulnerabilità nella funzione getaddrinfo che consente di leggere dati da fuori i limiti del buffer durante l'elaborazione di una risposta DNS ricevuta tramite TCP, di dimensioni superiori a 2048 byte. La vulnerabilità si manifesta quando si utilizza l'opzione «no-aaaa» in /etc/resolv.conf.
È importante notare il rilascio del pacchetto di utilità di sistema GNU Binutils 2.42, che include programmi come il linker GNU, l'assemblatore GNU, nm, objdump, strings, strip.
Nella nuova versione di Binutils:
- Per l'assemblatore (gas) per sistemi x86-64 è stata aggiunta l'opzione sperimentale «—scfi=experimental» per la sintesi delle costruzioni CFI (Control Flow Integrity) per il codice assembly scritto a mano che segue l'ABI AMD64 di System V.
- Nel programma readelf è stata aggiunta l'opzione «—extra-sym-info» per l'output di informazioni estese sui simboli («—symbols»), come il nome della sezione a cui si riferisce l'indice st_shndx.
- Nell'utilità objcopy è stata introdotta la possibilità di utilizzare l'opzione «—set-section-flags» con il valore «large» per impostare il flag SHF_X86_64_LARGE per gli oggetti ELF sui sistemi x86-64. Nell'opzione «—visualize-jumps» è stata implementata la supporto per l'architettura s390.
- Nella disassemblazione delle istruzioni s390 è stata implementata la possibilità di visualizzare commenti nella descrizione delle istruzioni. Per includere le descrizioni in objdump è possibile specificare il parametro «-M insndesc», mentre in gdb è necessaria la configurazione «set disassembler-options insndesc».
- Per il linker sono state aggiunte le opzioni «-z mark-plt» e «-z nomark-plt» per contrassegnare le voci nella tabella PLT utilizzando i tag DT_X86_64_PLT, DT_X86_64_PLTSZ e DT_X86_64_PLTENT.
- Nel linker è stata aggiunta la supporto per l'ordinamento in ordine inverso.
- Sono state aggiunte le opzioni «—warn-execstack-objects», «—error-execstack» e «—error-rxw-segments» per avvisare o segnalare errori quando si utilizzano oggetti con stack eseguibile.
- Implementata la supporto per ABI 2.30 dell'architettura LoongArch, così come il supporto per nuove istruzioni definite nella specifica LoongArch 1.10.
- Aggiunta la supporto per il set di istruzioni KVX, utilizzato nei processori Kalray (ad esempio, utilizzati in SoC Coolidge).
- Per i sistemi basati su architettura Intel è stata aggiunta la supporto per le estensioni:
- Intel APX: 32 GPR, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- Nel port per l'architettura RISC-V è stata aggiunta la supporto per le estensioni:
- T-Head (XTheadVector, XTheadZvlsseg e XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- Nel port per l'architettura AArch64 è stata aggiunta la supporto per le estensioni:
- SVE2.1 (Scalable Vector Extension 2.1).
- SME2.1 (Scalable Matrix Extension 2.1).
- B16B16 (BFloat16 e BFloat16 per SVE2 e SME2).
- RASv2 (Reliability, Availability and Serviceability v2).
- LSE128 (128-bit Atomic).
- GCS (Guarded Control Stack).
- CHK (Check Feature Status).
- SPECRES2 (Enhanced Speculation Restriction).
- LRCPC3 (Load-Acquire RCpc).
- THE (Translation Hardening).
- ITE (Instruction Trace).
- D128 (128-bit Memory Page Table Descriptors).
- XS (XS Memory Attribute).
- Aggiunta la supporto per i processori AArch64 Cortex-A520, Cortex-A720, Cortex-X3 e Cortex-X4.
- Nell'assemblatore BPF, per la compatibilità con l'assemblatore clang/LLVM, è stato aggiunto il supporto per separare i commenti con i simboli «#» e «//», oltre a utilizzare il simbolo «;» per separare le espressioni nella riga («;» non può più essere usato per i commenti).
Fonte: opennet.ru
