Después de seis meses de desarrollo, se ha publicado la versión de la biblioteca del sistema GNU C Library (glibc) 2.39, que cumple completamente con los estándares ISO C11 y POSIX.1-2017. La nueva versión incluye correcciones de 67 desarrolladores.
Entre las mejoras implementadas en Glibc 2.39, se pueden destacar:
- Se ha añadido soporte para el stack sombra (shadow stack), introducido en el núcleo de Linux 6.6, que permite bloquear el funcionamiento de muchos exploits utilizando las capacidades de hardware de los procesadores Intel para protegerse contra la sobrescritura de la dirección de retorno de la función en caso de desbordamiento de búfer en la pila. La esencia de la protección es que, después de ceder el control a una función, las direcciones de retorno se almacenan en el procesador no solo en la pila normal, sino también en una ‘pila sombra’ separada, que no puede ser modificada directamente. Antes de salir de la función, la dirección de retorno se extrae de la pila sombra y se compara con la dirección de retorno de la pila principal. La discrepancia de direcciones provoca la generación de una excepción, bloqueando situaciones en las que un exploit podría haber sobrescrito la dirección en la pila principal. Se ha añadido la opción de construcción ‘—enable-cet’ para habilitarlo.
- Se ha añadido un nuevo archivo de encabezado , definido en el borrador del estándar ISO C2X e incluye las funciones 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 y stdc_bit_ceil en versiones con los tipos ‘unsigned char’, ‘unsigned short’, ‘unsigned int’, ‘unsigned long int’ y ‘unsigned long long int’.
- Para la plataforma Linux, se han implementado las funciones posix_spawnattr_getcgroup_np y posix_spawnattr_setcgroup_np, así como la bandera POSIX_SPAWN_SETCGROUP, que permiten configurar cgroupv2 en un nuevo proceso mediante las funciones posix_spawn y posix_spawnp, evitando así la aparición de condiciones de carrera. Estas funciones son extensiones de GNU y requieren un núcleo de Linux que soporte la llamada al sistema clone3.
- Para la plataforma Linux, se han implementado las funciones pidfd_spawn y pidfd_spawn, que son semánticamente similares a la función posix_spawn, pero devuelven un descriptor de archivo para su uso en funciones que admiten el mecanismo PIDFD, como pidfd_send_signal, poll y waitid (PIDFD se vincula a un proceso específico y no cambia, mientras que el PID puede ser vinculado a otro proceso después de que finalice el proceso actual asociado con ese PID).
- Para la plataforma Linux, se ha añadido la función pidfd_getpid para determinar el identificador de proceso (PID) basado en el descriptor de archivo del proceso (PIDFD) que devuelven las funciones pid_spawn, fork_np y pidfd_open.
- Se ha añadido un modificador de tamaño «wN» en la familia de funciones scanf, aplicable a argumentos con tipos intN_t, int_leastN_t, uintN_t y uint_leastN_t. Por ejemplo, para leer valores decimales con tipos int32_t y int_least32_t se puede especificar «%w32d», mientras que para hexadecimal se puede usar «%w32x». De manera similar, se ha añadido el modificador «wfN» para los tipos int_fastN_t y uint_fastN_t, presentados en el borrador de la norma ISO C2X.
- Se ha añadido la opción «glibc.cpu.plt_rewrite», que incluye la reescritura de la PLT (Procedure Linkage Table) en sistemas x86-64, donde el enlazador reemplazará las ramas indirectas en la PLT por ramas directas.
- Se ha añadido la opción «glibc.mem.decorate_maps» para agregar información adicional sobre la asignación de memoria (por ejemplo, la pila de hilos creada por la función pthread_create o la memoria asignada a través de malloc).
- En la estructura «statvfs», se garantiza el llenado del campo «f_type» con información sobre el tipo de sistema de archivos, equivalente al contenido del campo en la estructura «statfs». Anteriormente, en Linux, el campo «f_type» siempre contenía 0.
- Para la plataforma AArch64, se han añadido anotaciones en libmvec y math.h que permiten utilizar la vectorización de llamadas al compilar con la opción «-ffast-math» en GCC 9 y versiones posteriores. La vectorización se activa para funciones matemáticas como 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 y tanf.
- Se ha eliminado la biblioteca libcrypt y el archivo de cabecera asociado «». Se recomienda a los desarrolladores de aplicaciones que pasen a utilizar bibliotecas alternativas, como libxcrypt.
- En la utilidad ldconfig, ahora se omiten los archivos que contienen el símbolo ‘;’ en el nombre del archivo o que terminan en «.dpkg.tmp» y «.dpkg.new», lo que permite no procesar archivos temporales de los gestores de paquetes rpm y dpkg.
- Se ha descontinuado el soporte para la arquitectura ia64 (ia64*-*-linux-gnu), utilizada en los procesadores Intel Itanium.
- Se han corregido vulnerabilidades:
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 — vulnerabilidades críticas en la función __vsyslog_internal(), que permiten, a través de manipulaciones en el inicio de aplicaciones SUID, ejecutar código con privilegios elevados.
- CVE-2023-4911 — vulnerabilidad en Glibc ld.so, que permite obtener privilegios de root en el sistema. La vulnerabilidad se debe a un error en el código de análisis de la cadena especificada en la variable de entorno GLIBC_TUNABLES, y puede llevar a la escritura del valor analizado fuera del búfer asignado. Existen exploits funcionales.
- CVE-2023-4806 — vulnerabilidad en la función getaddrinfo, causada por un acceso a memoria después de haberla liberado (use-after-free). El problema se manifiesta cuando el plugin NSS implementa solo llamadas de retroceso «_gethostbyname2_r» y «_getcanonname_r», pero no soporta la llamada «_gethostbyname3_r». Para explotar esta vulnerabilidad, el servidor DNS debe devolver un gran número de direcciones IPv6 e IPv4 para el host solicitado, lo que llevará a la caída del proceso que invocó la función getaddrinfo para la familia AF_INET6 con las banderas AI_CANONNAME, AI_ALL y AI_V4MAPPED.
- CVE-2023-4527 — vulnerabilidad en la función getaddrinfo, que permite leer datos de fuera de los límites del búfer al procesar una respuesta DNS recibida por TCP con un tamaño mayor a 2048 bytes. La vulnerabilidad se manifiesta al utilizar la opción «no-aaaa» en /etc/resolv.conf.
Adicionalmente, se puede destacar el lanzamiento del conjunto de utilidades del sistema GNU Binutils 2.42, que incluye programas como GNU linker, GNU assembler, nm, objdump, strings, strip.
En la nueva versión de Binutils:
- En el ensamblador (gas) para sistemas x86-64 se ha añadido una opción experimental «—scfi=experimental» para la síntesis de constructos CFI (Control Flow Integrity) para código ensamblador escrito a mano que cumple con el System V AMD64 ABI.
- En el programa readelf se ha añadido la opción «—extra-sym-info» para mostrar información ampliada sobre símbolos («—symbols»), como el nombre de la sección a la que se refiere el índice st_shndx.
- En la utilidad objcopy se ha añadido la posibilidad de usar en la opción «—set-section-flags» el valor «large» para establecer la bandera de sección SHF_X86_64_LARGE para objetos ELF en sistemas x86-64. En la opción «—visualize-jumps» se ha implementado soporte para la arquitectura s390.
- Al desensamblar instrucciones s390, se ha implementado la posibilidad de mostrar comentarios en la descripción de las instrucciones. Para incluir descripciones en objdump, se puede especificar el parámetro "-M insndesc", y en gdb, la configuración "set disassembler-options insndesc".
- Se han añadido al enlazador las opciones "-z mark-plt" y "-z nomark-plt" para marcar entradas en la tabla PLT utilizando las etiquetas DT_X86_64_PLT, DT_X86_64_PLTSZ y DT_X86_64_PLTENT.
- El enlazador ahora admite la ordenación en orden inverso.
- Se han agregado las opciones "—warn-execstack-objects", "—error-execstack" y "—error-rxw-segments" para mostrar advertencias o errores al usar objetos de pila ejecutable.
- Se ha implementado soporte para ABI 2.30 de la arquitectura LoongArch, así como el soporte para nuevas instrucciones definidas en la especificación LoongArch 1.10.
- Se ha añadido soporte para el conjunto de instrucciones KVX, utilizado en los procesadores Kalray (por ejemplo, se utilizan en SoC Coolidge).
- Para sistemas basados en arquitectura Intel, se ha agregado soporte para las siguientes extensiones:
- Intel APX: 32 GPRs, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- En el puerto de arquitectura RISC-V se ha añadido soporte para las extensiones:
- T-Head (XTheadVector, XTheadZvlsseg y XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- En el puerto de arquitectura AArch64 se ha añadido soporte para las extensiones:
- SVE2.1 (Extensión Vectorial Escalable 2.1).
- SME2.1 (Extensión de Matriz Escalable 2.1).
- B16B16 (BFloat16 y BFloat16 para SVE2 y SME2).
- RASv2 (Confiabilidad, Disponibilidad y Mantenibilidad v2).
- LSE128 (Atómico de 128 bits).
- GCS (Pila de Control Protegida).
- CHK (Verificar Estado de Características).
- SPECRES2 (Restricción Mejorada de Especulación).
- LRCPC3 (Carga-Adquirir RCpc).
- THE (Endurecimiento de Traducción).
- ITE (Registro de Instrucciones).
- D128 (descriptores de tabla de páginas de memoria de 128 bits).
- XS (atributo de memoria XS).
- Se ha añadido soporte para procesadores AArch64 Cortex-A520, Cortex-A720, Cortex-X3 y Cortex-X4.
- En el ensamblador BPF, se ha añadido soporte para separar comentarios con los símbolos "#" y "//" para compatibilidad con el ensamblador clang/LLVM, así como el uso del símbolo ";" para separar expresiones en la línea (";" ya no se puede usar para comentarios).
Fuente: opennet.ru
