După șase luni de dezvoltare, a fost lansată versiunea bibliotecii sistemului GNU C Library (glibc) 2.39, care respectă pe deplin cerințele standardelor ISO C11 și POSIX.1-2017. Noua versiune include corecturi de la 67 de dezvoltatori.
Printre îmbunătățirile implementate în Glibc 2.39 se numără:
- A fost asigurată suportul pentru stiva de protecție (shadow stack), introdusă în nucleul Linux 6.6, care permite blocarea funcționării multor exploatații, utilizând capacitățile hardware ale procesorilor Intel pentru protecția împotriva rescrierii adresei de returnare din funcție în cazul unui overflow de buffer în stivă. Esența protecției este aceea că după transferul controlului către funcție, adresele de returnare sunt salvate de procesor nu doar în stiva obișnuită, ci și într-o stivă „shadow” separată, care nu poate fi modificată direct. Înainte de ieșirea din funcție, adresa de returnare este extrasă din stiva shadow și comparată cu adresa de returnare din stiva principală. Divergența adreselor duce la generarea unei excepții, blochează situațiile în care exploatatorului i-a reușit să rescrie adresa din stiva principală. Pentru activare, a fost adăugată opțiunea de compilare „—enable-cet”.
- A fost adăugat un nou fișier de antet <stdbit.h>, definit în proiectul de standard ISO C2X, care include funcțiile 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 și stdc_bit_ceil în variantele cu tipurile „unsigned char”, „unsigned short”, „unsigned int”, „unsigned long int” și „unsigned long long int”.
- Pentru platforma Linux, au fost implementate funcțiile posix_spawnattr_getcgroup_np și posix_spawnattr_setcgroup_np, precum și flagul POSIX_SPAWN_SETCGROUP, care permit configurarea cgroupv2 în noul proces prin intermediul funcțiilor posix_spawn și posix_spawnp, excluzând apariția stării de cursă. Funcțiile sunt extensii GNU și necesită un nucleu Linux care suportă apelul de sistem clone3.
- Pentru platforma Linux, au fost implementate funcțiile pidfd_spawn și pidfd_spawp, care sunt apropiate ca semantică de funcția posix_spawn, dar returnează nu identificatorul procesului (PID), ci un descriptor de fișier pentru utilizare în funcțiile care suportă mecanismul PIDFD, cum ar fi pidfd_send_signal, poll și waitid (PIDFD este legat de un anumit proces și nu se schimbă, în timp ce PID poate fi asociat cu un alt proces după încheierea procesului curent asociat cu acest PID).
- Pentru platforma Linux a fost adăugată funcția pidfd_getpid pentru a determina identificatorul procesului (PID) pe baza descriptorului de fișier al procesului (PIDFD), returnat de funcțiile pid_spawn, fork_np și pidfd_open.
- În funcția din familia scanf a fost adăugat modificatorul de dimensiune „wN”, aplicabil pentru argumente cu tipuri intN_t, int_leastN_t, uintN_t și uint_leastN_t. De exemplu, pentru a citi valori zecimale cu tipurile int32_t și int_least32_t se poate specifica „%w32d”, iar pentru cele hexazecimale — „%w32x”. De asemenea, a fost adăugat modificatorul „wfN” pentru tipurile int_fastN_t și uint_fastN_t, prezentate în standardul draft ISO C2X.
- A fost adăugată setarea „glibc.cpu.plt_rewrite”, care include rescrierea PLT (Procedure Linkage Table) pe sistemele x86-64, în care linkerul va înlocui salturile indirecte (indirect branch) în PLT cu unele directe.
- A fost adăugată setarea „glibc.mem.decorate_maps” pentru a adăuga informații suplimentare despre alocarea memoriei (de exemplu, despre stiva firului creată prin funcția pthread_create sau memoria alocată prin malloc).
- În structura „statvfs” s-a asigurat completarea câmpului „f_type” cu informații despre tipul FS, echivalent cu conținutul câmpului din structura „statfs”. Anterior, în Linux, câmpul „f_type” era întotdeauna setat pe 0.
- Pentru platforma AArch64, în libmvec și math.h au fost adăugate adnotări care permit, la specificarea opțiunii de compilare „-ffast-math”, utilizarea vectorizării apelurilor în GCC 9 și versiunile mai noi ale compilatorului. Vectorizarea este activată pentru funcțiile matematice 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 și tanf.
- Din compunere a fost eliminată biblioteca libcrypt și fișierul de antet asociat „”. Dezvoltatorii de aplicații sunt încurajați să treacă la utilizarea unor biblioteci alternative, cum ar fi libxcrypt.
- În utilitarul ldconfig, acum se sar peste fișierele cu simbolul ‘;’ în numele fișierului sau care se termină în „.dpkg.tmp” și „.dpkg.new”, ceea ce permite să nu se proceseze fișiere temporare ale managerilor de pachete rpm și dpkg.
- A fost întreruptă suportul pentru arhitectura ia64 (ia64*-*-linux-gnu), utilizată în procesoarele Intel Itanium.
- S-au remediat vulnerabilitățile:
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 — vulnerabilități critice în funcția __vsyslog_internal(), care permit, prin manipulări ale lansării aplicațiilor SUID, executarea codului propriu cu privilegii elevate.
- CVE-2023-4911 — o vulnerabilitate în Glibc ld.so, care permite obținerea drepturilor root în sistem. Vulnerabilitatea este cauzată de o eroare în codul de analiză a șirului specificat în variabila de mediu GLIBC_TUNABLES și poate duce la scrierea valorii analizate în afara buffer-ului alocat. Există exploatări funcționale.
- CVE-2023-4806 — o vulnerabilitate în funcția getaddrinfo, cauzată de accesarea memoriei după ce aceasta a fost eliberată (use-after-free). Problema apare atunci când pluginul NSS implementează doar apelurile de tip callback „_gethostbyname2_r” și „_getcanonname_r”, dar nu suportă apelul „_gethostbyname3_r”. Pentru exploatarea vulnerabilității, serverul DNS trebuie să returneze un număr mare de adrese IPv6 și IPv4 pentru gazda solicitată, ceea ce va duce la prăbușirea procesului care a apelat funcția getaddrinfo pentru familia AF_INET6 cu flag-urile AI_CANONNAME, AI_ALL și AI_V4MAPPED.
- CVE-2023-4527 — o vulnerabilitate în funcția getaddrinfo, care permite citirea datelor dintr-o zonă în afara limitelor buffer-ului în procesarea răspunsului DNS primit prin TCP, cu o dimensiune mai mare de 2048 de octeți. Vulnerabilitatea apare atunci când se utilizează opțiunea „no-aaaa” în /etc/resolv.conf.
De asemenea, se poate menționa lansarea setului de utilitare sistem GNU Binutils 2.42, care include programe precum GNU linker, GNU assembler, nm, objdump, strings, strip.
În noua versiune a Binutils:
- În asamblor (gas) pentru sistemele x86-64 a fost adăugată o opțiune experimentală „—scfi=experimental” pentru sinteza construcțiilor CFI (Control Flow Integrity) pentru codul de asamblare scris manual, corespunzător System V AMD64 ABI.
- În programul readelf a fost adăugată opțiunea „—extra-sym-info” pentru a afișa informații extinse despre simboluri („—symbols”), cum ar fi numele secțiunii la care se referă indexul st_shndx.
- În utilitarul objcopy a fost adăugată posibilitatea de a utiliza în opțiunea „—set-section-flags” valoarea „large” pentru a marca secțiunea cu flagul SHF_X86_64_LARGE pentru obiectele ELF pe sistemele x86-64. În opțiunea „—visualize-jumps” a fost implementat suportul pentru arhitectura s390.
- La disassemblarea instrucțiunilor s390, a fost implementată posibilitatea de a afișa comentarii despre descrierile instrucțiunilor. Pentru a include descrierile în objdump, se poate specifica parametrul „-M insndesc”, iar în gdb — setarea „set disassembler-options insndesc”.
- La linker au fost adăugate opțiunile „-z mark-plt” și „-z nomark-plt” pentru a marca înregistrările din tabelul PLT, folosind etichetele DT_X86_64_PLT, DT_X86_64_PLTSZ și DT_X86_64_PLTENT.
- La linker a fost adăugată suportul pentru sortarea în ordine inversă.
- Au fost adăugate opțiunile „—warn-execstack-objects”, „—error-execstack” și „—error-rxw-segments” pentru a afișa avertizări sau erori în timpul utilizării în obiectele stivei executabile.
- A fost implementat suport pentru ABI 2.30 al arhitecturii LoongArch, precum și suport pentru noi instrucțiuni definite în specificația LoongArch 1.10.
- A fost adăugat suport pentru setul de instrucțiuni KVX, utilizat în procesoarele Kalray (de exemplu, folosit în SoC Coolidge).
- Pentru sistemele bazate pe arhitectura Intel a fost adăugat suport pentru extensii:
- Intel APX: 32 GPR-uri, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- În portul pentru arhitectura RISC-V a fost adăugat suport pentru extensii:
- T-Head (XTheadVector, XTheadZvlsseg și XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- În portul pentru arhitectura AArch64 a fost adăugat suport pentru extensii:
- SVE2.1 (Scalable Vector Extension 2.1).
- SME2.1 (Scalable Matrix Extension 2.1).
- B16B16 (BFloat16 și BFloat16 pentru SVE2 și SME2).
- RASv2 (Reliability, Availability and Serviceability v2).
- LSE128 (Atomic de 128 biți).
- GCS (Guarded Control Stack).
- CHK (Verificare Stare Funcție).
- SPECRES2 (Restricție Îmbunătățită a Speculației).
- LRCPC3 (Load-Acquire RCpc).
- THE (Întărirea Traduce).
- ITE (Urmărire Instrucțiuni).
- D128 (Descriptoare de 128 biți pentru tabelele de pagini de memorie).
- XS (atribut de memorie XS).
- A fost adăugat suport pentru procesoarele AArch64 Cortex-A520, Cortex-A720, Cortex-X3 și Cortex-X4.
- În asamblorul BPF pentru compatibilitate cu asamblorul clang/LLVM a fost adăugat suport pentru delimitarea comentariilor cu simbolurile „#” și „//”, precum și utilizarea simbolului „;” pentru delimitarea expresiilor pe o singură linie („;” nu mai poate fi folosit pentru comentarii).
Sursa: opennet.ro
