Efter seks måneders udvikling er udgivelsen af systembiblioteket GNU C Library (glibc) 2.39 offentliggjort, som fuldt ud overholder kravene i standarderne ISO C11 og POSIX.1-2017. Den nye udgave inkluderer rettelser fra 67 udviklere.
Blandt de forbedringer, der er implementeret i Glibc 2.39, kan nævnes:
- Der er tilføjet støtte til en shadow stack, som blev introduceret i Linux-kernen 6.6 og som gør det muligt at blokere mange exploits ved at bruge hardwarefunktioner fra Intel-processorer til at beskytte mod overskrivning af returadresser fra funktioner i tilfælde af stack-overflow. Beskyttelsens kerne er, at efter overførsel af kontrol til en funktion, gemmes returadresserne ikke kun i den almindelige stack, men også i en separat 'shadow' stack, som ikke kan ændres direkte. Før funktionen forlades, hentes returadressen fra shadow stack og kontrolleres mod returadressen fra den primære stack. Uoverensstemmelse mellem adresserne fører til et undtagelsesgenerering, der blokerer situationer, hvor et exploit har haft succes med at overskrive adressen i den primære stack. For at aktivere dette er der tilføjet en kompilationsmulighed "—enable-cet".
- En ny headerfil er blevet tilføjet, defineret i udkastet til standarden ISO C2X, og inkluderer funktionerne 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 og stdc_bit_ceil med typerne 'unsigned char', 'unsigned short', 'unsigned int', 'unsigned long int' og 'unsigned long long int'.
- For Linux-platformen er funktionerne posix_spawnattr_getcgroup_np og posix_spawnattr_setcgroup_np blevet implementeret, samt flagget POSIX_SPAWN_SETCGROUP, som gør det muligt at konfigurere cgroupv2 i den nye proces ved hjælp af funktionerne posix_spawn og posix_spawnp, hvilket eliminerer risikoen for race conditions. Funktionerne er GNU-udvidelser og kræver, at Linux-kernen understøtter systemopkaldet clone3.
- For Linux-platformen er funktionerne pidfd_spawn og pidfd_spawn blevet implementeret, som er semantisk nært beslægtede med funktionen posix_spawn, men returnerer ikke en proces-ID (PID), men en fildescriptor til brug i funktioner, der understøtter PIDFD-mekanismen, såsom pidfd_send_signal, poll og waitid (PIDFD binder sig til en specifik proces og ændres ikke, mens PID kan bindes til en anden proces efter afslutningen af den aktuelle proces, der er associeret med denne PID).
- Funktionen pidfd_getpid er blevet tilføjet til Linux-platformen for at bestemme procesidentifikatoren (PID) baseret på procesens filbeskriver (PIDFD), som returneres af funktionerne pid_spawn, fork_np og pidfd_open.
- Modifikatoren for størrelse "wN" er blevet tilføjet til scanf-funktionerne og anvendes til argumenter med typerne intN_t, int_leastN_t, uintN_t og uint_leastN_t. For eksempel kan "%w32d" bruges til at læse decimale værdier med typerne int32_t og int_least32_t, mens "%w32x" bruges til hexadecimale. Ligeledes er modifikatoren "wfN" blevet tilføjet for typerne int_fastN_t og uint_fastN_t, som præsenteres i kladdestandarden ISO C2X.
- Indstillingen "glibc.cpu.plt_rewrite" er blevet tilføjet, hvilket inkluderer omskrivning af PLT (Procedure Linkage Table) på x86-64 systemer, hvor linker vil erstatte indirekte overgange i PLT med direkte.
- Indstillingen "glibc.mem.decorate_maps" er blevet tilføjet for at tilføje supplerende oplysninger om hukommelsesallokering (f.eks. om trådstacken, der er oprettet af pthread_create, eller hukommelse tildelt via malloc).
- I strukturen "statvfs" er feltet "f_type" blevet udfyldt med oplysninger om TS, der svarer til indholdet af feltet i strukturen "statfs". Tidligere i Linux blev 0 altid skrevet i feltet "f_type".
- For AArch64-platformen er der blevet tilføjet annotationer i libmvec og math.h, der gør det muligt at bruge vektorisering af opkald ved kompilering med indstillingen "-ffast-math" i GCC 9 og nyere versioner af compileren. Vektorisering aktiveres for de matematiske funktioner 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 og tanf.
- Biblioteket libcrypt og den relaterede header-fil "" er blevet fjernet fra sammensætningen. Programudviklere anbefales at overgå til brug af alternative biblioteker, såsom libxcrypt.
- I ldconfig-nyttigheden springes filer over, der har et ';'-tegn i filnavnet eller ender med ".dpkg.tmp" og ".dpkg.new", hvilket gør, at der ikke behandles midlertidige filer fra pakkehåndtererne rpm og dpkg.
- Støtten til arkitekturen ia64 (ia64*-*-linux-gnu), der anvendes i Intel Itanium-processorer, er blevet afsluttet.
- Sårbarheder udbedret:
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 — kritiske sårbarheder i funktionen __vsyslog_internal(), der muliggør udførelse af brugerdefineret kode med forhøjet privilegium gennem manipulation af kørsel af SUID-applikationer.
- CVE-2023-4911 — en sårbarhed i Glibc ld.so, der muliggør opnåelse af root-rettigheder i systemet. Sårbarheden skyldes en fejl i koden til parsing af strengen angivet i miljøvariablen GLIBC_TUNABLES og kan føre til, at det parsed værdi skrives uden for den tildelte buffer. Der findes fungerende exploits.
- CVE-2023-4806 — en sårbarhed i funktionen getaddrinfo, forårsaget af adgang til hukommelse efter dens frigivelse (use-after-free). Problemet opstår, når NSS-pluginet kun implementerer callback-kald "_gethostbyname2_r" og "_getcanonname_r", men ikke understøtter kaldet "_gethostbyname3_r". For at udnytte sårbarheden skal DNS-serveren returnere mange adresser IPv6 og IPv4 for den anmodede vært, hvilket vil føre til, at processen, der kalder funktionen getaddrinfo for AF_INET6-familien med flagene AI_CANONNAME, AI_ALL og AI_V4MAPPED, crasher.
- CVE-2023-4527 — en sårbarhed i funktionen getaddrinfo, der muliggør læsning af data fra uden for buffergrænsen, når der behandles et DNS-svar modtaget via TCP, større end 2048 byte. Sårbarheden viser sig, når der bruges indstillingen "no-aaaa" i /etc/resolv.conf.
Derudover kan vi nævne udgivelsen af GNU Binutils 2.42-systemværktøjssættet, som inkluderer programmer som GNU linker, GNU assembler, nm, objdump, strings, strip.
I den nye version af Binutils:
- I assembleren (gas) for x86-64-systemer er der tilføjet en eksperimentel indstilling "—scfi=experimental" for at syntetisere CFI (Control Flow Integrity)-konstruktioner for manuelt skrevet assemblerkode, der er i overensstemmelse med System V AMD64 ABI.
- Programmet readelf har fået tilføjet indstillingen "—extra-sym-info" for at vise udvidet information om symboler ("—symbols"), såsom navnet på den sektion, som indekset st_shndx henviser til.
- I værktøjet objcopy er det muligt at bruge værdien "large" i indstillingen "—set-section-flags" for at angive sektionen som SHF_X86_64_LARGE for ELF-objekter på x86-64-systemer. I indstillingen "—visualize-jumps" er der implementeret support for arkitekturen s390.
- Ved disassembly af s390-instruktioner er der mulighed for at vise kommentarer i instruktionsbeskrivelserne. For at inkludere beskrivelser i objdump kan man angive parameteren "-M insndesc", og i gdb konfigurationen "set disassembler-options insndesc".
- Linkeren har fået tilføjet indstillingerne "-z mark-plt" og "-z nomark-plt" til at markere poster i PLT-tabellen ved hjælp af tags DT_X86_64_PLT, DT_X86_64_PLTSZ og DT_X86_64_PLTENT.
- Linkeren har fået tilføjet support til sortering i omvendt rækkefølge.
- Tilføjet mulighederne «—warn-execstack-objects», «—error-execstack» og «—error-rxw-segments» for at vise advarsler eller fejl ved brug i objekter i det eksekverbare stak.
- Implementeret understøttelse af ABI 2.30 for LoongArch-arkitekturen samt understøttelse af nye instruktioner defineret i LoongArch-specifikationen 1.10.
- Tilføjet understøttelse af KVX-instruktionssættet, der bruges i processorer fra Kalray (for eksempel anvendt i SoC Coolidge).
- For systemer baseret på Intel-arkitekturen tilføjet understøttelse af udvidelser:
- Intel APX: 32 GPRs, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- I porten for RISC-V-arkitekturen tilføjet understøttelse af udvidelser:
- T-Head (XTheadVector, XTheadZvlsseg og XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- I porten for AArch64-arkitekturen tilføjet understøttelse af udvidelser:
- SVE2.1 (Scalable Vector Extension 2.1).
- SME2.1 (Scalable Matrix Extension 2.1).
- B16B16 (BFloat16 og BFloat16 for SVE2 og SME2).
- RASv2 (Reliability, Availability and Serviceability v2).
- LSE128 (128-bit Atomare).
- GCS (Guarded Control Stac).
- CHK (Check Feature Status).
- SPECRES2 (Forbedret spekulation restriktion).
- LRCPC3 (Load-Acquire RCpc).
- THE (Oversættelses-forstærkning).
- ITE (Instruktionsspor).
- D128 (128-bit side descriptorer for hukommelsestabeller).
- XS (mindst XS hukommelsesattribut).
- Tilføjet understøttelse af AArch64-processorerne Cortex-A520, Cortex-A720, Cortex-X3 og Cortex-X4.
- I BPF-assembleren, for at sikre kompatibilitet med clang/LLVM-assembleren, tilføjet understøttelse af at adskille kommentarer med symbolerne «#» og «//», samt brugen af symbolet «;» til at adskille udtryk i linjen («;» kan ikke længere bruges til kommentarer).
Kilde: opennet.ru
