Hat hónapnyi fejlesztés után megjelent a GNU C Library (glibc) 2.39 verziója, amely teljes mértékben megfelel az ISO C11 és a POSIX.1-2017 szabványok követelményeinek. Az új kiadásban 67 fejlesztő javításai találhatóak.
A Glibc 2.39-ben megvalósított fejlesztések közül kiemelhető:
- Támogatottá vált az árnyékverem (shadow stack), amely a Linux 6.6 kernelben jelent meg, és lehetővé teszi számos exploit működésének blokkolását az Intel processzorok hardveres lehetőségeit kihasználva, hogy megakadályozza a visszatérési cím veremben való felülírását a verem túlcsordulása esetén. A védelem lényege, hogy a függvény vezérlésének átadása után a visszatérési címeket a processzor nemcsak a hagyományos veremben, hanem egy külön „árnyék” veremben is tárolja, amelyet közvetlenül nem lehet módosítani. A függvényből való kilépés előtt a visszatérési cím az árnyék veremből kerül előtérbe, és összehasonlításra kerül a fő veremből származó visszatérési címmel. Ha a címek eltérnek, kivétel kerül generálásra, amely blokkolja azokat az eseteket, amikor az exploit képes volt felülírni a címet a fő veremben. Bekapcsoláshoz hozzá lett adva a „--enable-cet” fordítási lehetőség.
- Új fejléc fájl került hozzáadásra: <stdbit.h>, amelyet az ISO C2X szabvány vázlata határozott meg, és tartalmazza a 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 és stdc_bit_ceil funkciókat „unsigned char”, „unsigned short”, „unsigned int”, „unsigned long int” és „unsigned long long int” típusvariánsokkal.
- Linux platform számára megvalósításra kerültek a posix_spawnattr_getcgroup_np és posix_spawnattr_setcgroup_np funkciók, valamint a POSIX_SPAWN_SETCGROUP zászló, amelyek lehetővé teszik a cgroupv2 beállítását az új folyamatban a posix_spawn és posix_spawnp funkciók segítségével, kizárva a versenyhelyzetek kialakulását. A funkciók a GNU kiterjesztései, és működésükhöz Linux kernel szükséges, amely támogatja a clone3 rendszerhívást.
- Linux platform számára megvalósításra kerültek a pidfd_spawn és pidfd_spawn funkciók, amelyek jelentésükben hasonlóak a posix_spawn funkcióhoz, de nem folyamatazonosítót (PID) adnak vissza, hanem fájlkészletet, amelyet a PIDFD mechanizmust támogató funkciókban, például pidfd_send_signal, poll és waitid használhatók (a PIDFD egy adott folyamathoz van kötve, és nem változik, míg a PID más folyamathoz is kötődhet az aktuális folyamat befejezése után, amely hozzárendelve van ehhez a PID-hez).
- A Linux platformra hozzáadva a pidfd_getpid funkció, amely lehetővé teszi a folyamat azonosítójának (PID) meghatározását a folyamat fájlleírója (PIDFD) alapján, amelyet a pid_spawn, fork_np és pidfd_open funkciók adnak vissza.
- A scanf család funkcióiban hozzáadva a méretmódosító „wN”, amely az intN_t, int_leastN_t, uintN_t és uint_leastN_t típusú argumentumokra alkalmazható. Például, a 32-bites decimális értékek olvasásához „%w32d”, míg a hexadecimális értékekhez „%w32x” használható. Hasonlóan hozzáadva a „wfN” módosító az int_fastN_t és uint_fastN_t típusokhoz, amelyeket az ISO C2X előzetes szabványa tartalmaz.
- Hozzáadva a „glibc.cpu.plt_rewrite” beállítás, amely a PLT (Procedure Linkage Table) átírását tartalmazza x86-64 rendszereken, ahol a linker az PLT-ban lévő közvetett ugrásokat közvetlen ugrásokra cseréli.
- Hozzáadva a „glibc.mem.decorate_maps” beállítást, amely további információt ad a memóriakezelésekről (például a pthread_create funkció által létrehozott szálveremről vagy a malloc révén lefoglalt memóriáról).
- A „statvfs” struktúrában az „f_type” mező kitöltése az FS típusának információjával, amely egyenértékű a „statfs” struktúrában lévő mező tartalmával. Korábban a Linuxban az „f_type” mezőbe mindig 0 volt beírva.
- A libmvec és a math.h könyvtárakhoz AArch64 platformon annotációkat adtak hozzá, amelyek lehetővé teszik a -ffast-math opció megadását a GCC 9 és újabb verziókban, így vektorizálhatók a hívások. A vektorizálás engedélyezve van a következő matematikai funkciók esetében: 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 és tanf.
- A libcrypt könyvtár és a hozzá kapcsolódó „” fejléc eltávolítva. Az alkalmazásfejlesztőknek ajánlott alternatív könyvtárakra áttérni, mint például a libxcrypt.
- Az ldconfig utility mostantól kihagyja azokat a fájlokat, amelyek neve ‘;’ szimbólummal rendelkezik, vagy „.dpkg.tmp” és „.dpkg.new” végződéssel zárulnak, lehetővé téve így a rpm és dpkg csomagkezelők ideiglenes fájljainak kihagyását.
- A ia64 architektúra (ia64*-*-linux-gnu) támogatása leállítva, amely az Intel Itanium processzorokban alkalmazott.
- Sebezhetőségek kiküszöbölve:
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 – kritikus sebezhetőségek a __vsyslog_internal() funkcióban, amelyek lehetővé teszik, hogy a SUID-alkalmazások futtatásának manipulálásával a kódot emelt jogosultságokkal hajtsák végre.
- CVE-2023-4911 — egy hiba a Glibc ld.so rendszerben, amely lehetővé teszi a root jogosultságok megszerzését. A hiba a GLIBC_TUNABLES környezeti változóban megadott sztring parszolásának hibájából adódik, és a parszolt érték kiírásához vezethet a lefoglalt puffer terjedelmén kívül. Működő exploitok állnak rendelkezésre.
- CVE-2023-4806 — egy hiba a getaddrinfo függvényben, amely a memória használatára vonatkozó hibából (use-after-free) ered. A probléma akkor jelentkezik, amikor az NSS bővítmény csak a „_gethostbyname2_r” és „_getcanonname_r” callback hívásokat valósítja meg, de nem támogatja a „_gethostbyname3_r” hívást. A sebezhetőség kihasználásához a DNS szervernek nagy számú IPv6 és IPv4 címet kell visszaadnia a kért hosthoz, ami a getaddrinfo függvény hívó folyamatának összeomlásához vezet AF_INET6 családban, AI_CANONNAME, AI_ALL és AI_V4MAPPED zászlók beállítása mellett.
- CVE-2023-4527 — egy hiba a getaddrinfo függvényben, amely lehetővé teszi, hogy adatokat olvassunk a puffer határain kívüli területről egy, a TCP-n keresztül kapott DNS válasz feldolgozása során, amely nagyobb, mint 2048 bájt. A hiba akkor jelentkezik, ha a „no-aaaa” opciót használják a /etc/resolv.conf fájlban.
Továbbá megemlítjük a GNU Binutils 2.42 rendszersegédprogram-csomag kiadását, amelynek része többek között a GNU linker, GNU assembler, nm, objdump, strings és strip programok.
Az új Binutils verzióban:
- Az x86-64 rendszerekhez készült assemblerhez (gas) hozzáadták a kísérleti „—scfi=experimental” opciót a CFI (Control Flow Integrity) konstrukciók szintéziséhez a manuálisan írt assembler kódhoz, amely megfelel a System V AMD64 ABI-nek.
- A readelf programhoz hozzáadták a „—extra-sym-info” opciót a szimbolumok kiterjesztett információinak („—symbols”) megjelenítésére, például a szekció nevét, amelyre a st_shndx index utal.
- Az objcopy utilityhez lehetőséget biztosít a „—set-section-flags” opcióban a „large” érték használatára, a SHF_X86_64_LARGE szekciós zászló beállításához az ELF objektumok esetében x86-64 rendszereken. A „—visualize-jumps” opcióban támogatást kaptak az s390 architektúrához.
- Az s390 utasítások disassemblálásakor lehetőség nyílik a megjegyzések megjelenítésére az utasítások leírásában. Az objdump esetében a leírások bekapcsolásához megadható a „-M insndesc” paraméter, a gdb-ben pedig a „set disassembler-options insndesc” beállítás.
- A linkerhez hozzáadták a „-z mark-plt” és „-z nomark-plt” opciókat a PLT táblázat bejegyzéseinek megjelöléséhez, a DT_X86_64_PLT, DT_X86_64_PLTSZ és DT_X86_64_PLTENT tagek használatával.
- A linkerben hozzáadták a fordított sorrend szerinti rendezés támogatását.
- Hozzáadva a „—warn-execstack-objects”, „—error-execstack” és „—error-rxw-segments” opciók, amelyek figyelmeztetéseket vagy hibákat adnak vissza végrehajtható verem objektumok esetén.
- Megvalósult az ABI 2.30 támogatása a LoongArch architektúrához, valamint az új utasítások támogatása, amelyeket a LoongArch 1.10 specifikáció határoz meg.
- Hozzáadva a KVX utasításkészlet támogatása, amelyet a Kalray processzorai használnak (például, a Coolidge SoC-ban).
- Intel architektúrájú rendszerekhez a következő kiterjesztések támogatása került bevezetésre:
- Intel APX: 32 GPR, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- A RISC-V architektúrához készült portban a következő kiterjesztések támogatása került bevezetésre:
- T-Head (XTheadVector, XTheadZvlsseg és XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- A AArch64 architektúrához készült portban a következő kiterjesztések támogatása került bevezetésre:
- SVE2.1 (Skálázható Vektor Kiterjesztés 2.1).
- SME2.1 (Skálázható Mátrix Kiterjesztés 2.1).
- B16B16 (BFloat16 és BFloat16 az SVE2 és SME2 esetében).
- RASv2 (Megbízhatóság, Elérhetőség és Szervizelhetőség v2).
- LSE128 (128-bites Atomikus).
- GCS (Védett Vezérlési Verem).
- CHK (Funkcióállapot Ellenőrzés).
- SPECRES2 (Fejlett Spekulációs Korlátozás).
- LRCPC3 (Betöltés-Akár RCpc).
- THE (Fordítási Megerősítés).
- ITE (Utasítás Nyomozás).
- D128 (128-bites memóriaoldal-táblázat leírók).
- XS (memória attribútum XS).
- Hozzáadva az AArch64 Cortex-A520, Cortex-A720, Cortex-X3 és Cortex-X4 processzorok támogatása.
- A BPF assemblerben az clang/LLVM assemblerrel való kompatibilitás érdekében hozzáadva a megjegyzések elválasztása a „#” és „//” karakterekkel, valamint a „;” karakter használata a kifejezések elválasztására a sorban (a „;” már nem használható megjegyzésként).
Forrás: opennet.ru
