Após seis meses de desenvolvimento, foi lançado o release da biblioteca de sistema GNU C Library (glibc) 2.39, que atende completamente aos requisitos dos padrões ISO C11 e POSIX.1-2017. A nova versão inclui correções de 67 desenvolvedores.
Dentre as melhorias implementadas no Glibc 2.39, podemos destacar:
- Foi adicionada a suportação para shadow stack, introduzido no kernel Linux 6.6, permitindo bloquear a execução de muitos exploits, utilizando os recursos de hardware dos processadores Intel para proteger contra a sobrescrita do endereço de retorno de funções em caso de estouro de buffer na pilha. O princípio da proteção é que, após o controle ser passado para a função, os endereços de retorno são armazenados pelo processador não apenas na pilha normal, mas também em uma pilha "sombreamento" separada, que não pode ser modificada diretamente. Antes de sair da função, o endereço de retorno é retirado da pilha sombreada e verificado contra o endereço de retorno da pilha principal. Uma discordância entre os endereços gera uma exceção, bloqueando situações em que um exploit conseguiu sobrescrever o endereço na pilha principal. Uma opção de montagem "—enable-cet" foi adicionada para habilitar essa funcionalidade.
- Foi adicionado um novo cabeçalho <stdbit.h>, definido em um rascunho do padrão ISO C2X, que inclui funções 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 em variantes com os tipos "unsigned char", "unsigned short", "unsigned int", "unsigned long int" e "unsigned long long int".
- Para a plataforma Linux, foram implementadas as funções posix_spawnattr_getcgroup_np e posix_spawnattr_setcgroup_np, assim como a flag POSIX_SPAWN_SETCGROUP, que permitem configurar cgroupv2 em um novo processo usando as funções posix_spawn e posix_spawnp, eliminando a ocorrência de condições de corrida. As funções são extensões do GNU e requerem um kernel Linux com suporte à chamada de sistema clone3.
- Para a plataforma Linux, foram implementadas as funções pidfd_spawn e pidfd_spawp, que são semanticamente próximas à função posix_spawn, mas retornam não o identificador de processo (PID), mas um descritor de arquivo para uso em funções que suportam o mecanismo PIDFD, como pidfd_send_signal, poll e waitid (PIDFD está vinculado a um processo específico e não muda, enquanto o PID pode ser vinculado a outro processo após a finalização do processo atual associado a esse PID).
- Para a plataforma Linux, foi adicionada a função pidfd_getpid para determinar o identificador do processo (PID) com base no descritor de arquivo do processo (PIDFD), retornado pelas funções pid_spawn, fork_np e pidfd_open.
- Na função da família scanf, foi adicionado o modificador de tamanho "wN", aplicável a argumentos com os tipos intN_t, int_leastN_t, uintN_t e uint_leastN_t. Por exemplo, para ler valores decimais com os tipos int32_t e int_least32_t, pode-se especificar "%w32d", e para hexadecimais – "%w32x". Da mesma forma, foi adicionado o modificador "wfN" para os tipos int_fastN_t e uint_fastN_t, apresentados no rascunho da norma ISO C2X.
- Foi adicionada a configuração "glibc.cpu.plt_rewrite", que inclui a reescrita da PLT (Procedure Linkage Table) em sistemas x86-64, onde o vinculador substitui os saltos indiretos na PLT por diretos.
- Foi adicionada a configuração "glibc.mem.decorate_maps" para adicionar informações adicionais sobre a alocação de memória (por exemplo, sobre a pilha de threads criada pela função pthread_create, ou memória alocada através de malloc).
- Na estrutura "statvfs", foi garantido o preenchimento do campo "f_type" com informações sobre o tipo de FS, equivalente ao conteúdo do campo na estrutura "statfs". Anteriormente, no Linux, o campo "f_type" sempre registrava 0.
- Para a plataforma AArch64, no libmvec e math.h, foram adicionadas anotações que permitem a vetorização de chamadas ao especificar a opção de compilação "-ffast-math" na construção no GCC 9 e versões mais recentes do compilador. A vetorização é habilitada para funções 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 e tanf.
- A biblioteca libcrypt e o arquivo de cabeçalho associado "" foram removidos. Os desenvolvedores de aplicativos são recomendados a migrar para o uso de bibliotecas alternativas, como libxcrypt.
- No utilitário ldconfig, agora são ignorados arquivos com o símbolo ‘;’ no nome do arquivo ou que terminam em ".dpkg.tmp" e ".dpkg.new", o que evita o processamento de arquivos temporários dos gerenciadores de pacotes rpm e dpkg.
- O suporte à arquitetura ia64 (ia64*-*-linux-gnu), usada em processadores Intel Itanium, foi descontinuado.
- Vulnerabilidades corrigidas:
- CVE-2023-6246, CVE-2023-6779, CVE-2023-6780 – vulnerabilidades críticas na função __vsyslog_internal(), permitindo, por meio de manipulações no lançamento de aplicativos SUID, a execução de código com privilégios elevados.
- CVE-2023-4911 — uma vulnerabilidade no Glibc ld.so, que permite obter privilégios de root no sistema. A vulnerabilidade é causada por um erro no código de análise da string especificada na variável de ambiente GLIBC_TUNABLES e pode levar à gravação do valor analisado além do buffer alocado. Existem exploits funcionais.
- CVE-2023-4806 — uma vulnerabilidade na função getaddrinfo, causada pelo acesso à memória após sua liberação (use-after-free). O problema se manifesta quando o plugin NSS implementa apenas as chamadas de retorno «_gethostbyname2_r» e «_getcanonname_r», mas não suporta a chamada «_gethostbyname3_r». Para explorar a vulnerabilidade, o servidor DNS deve retornar um grande número de endereços IPv6 e IPv4 para o host solicitado, levando à falha do processo que chamou a função getaddrinfo para a família AF_INET6 ao definir as flags AI_CANONNAME, AI_ALL e AI_V4MAPPED.
- CVE-2023-4527 — uma vulnerabilidade na função getaddrinfo que permite ler dados fora do limite do buffer ao processar uma resposta DNS recebida por TCP, com um tamanho maior que 2048 bytes. A vulnerabilidade se manifesta ao usar a opção «no-aaaa» em /etc/resolv.conf.
Além disso, vale mencionar o lançamento do conjunto de utilitários de sistema GNU Binutils 2.42, que inclui programas como o linker GNU, assembler GNU, nm, objdump, strings, strip.
Na nova versão do Binutils:
- No assembler (gas) para sistemas x86-64, foi adicionada uma opção experimental «—scfi=experimental» para a síntese de construções CFI (Control Flow Integrity) para código assembler escrito manualmente, de acordo com o System V AMD64 ABI.
- A ferramenta readelf ganhou a opção «—extra-sym-info» para exibir informações adicionais sobre os símbolos («—symbols»), como o nome da seção referenciada pelo índice st_shndx.
- No utilitário objcopy, foi possibilitada a utilização do valor «large» na opção «—set-section-flags» para marcar a seção com o flag SHF_X86_64_LARGE para objetos ELF em sistemas x86-64. Na opção «—visualize-jumps», foi implementado o suporte para a arquitetura s390.
- Ao desassemblar instruções s390, foi implementada a possibilidade de exibir comentários na descrição das instruções. Para incluir descrições no objdump, pode-se especificar o parâmetro «-M insndesc», e no gdb — a configuração «set disassembler-options insndesc».
- No linkador, foram adicionadas as opções «-z mark-plt» e «-z nomark-plt» para marcar entradas na tabela PLT, utilizando as tags DT_X86_64_PLT, DT_X86_64_PLTSZ e DT_X86_64_PLTENT.
- No linkador, foi adicionada a suporte para ordenação em ordem inversa.
- Adicionadas as opções «—warn-execstack-objects», «—error-execstack» e «—error-rxw-segments» para exibir avisos ou erros ao usar em objetos de pilha executável.
- Implementado suporte para a ABI 2.30 da arquitetura LoongArch, bem como suporte para novas instruções definidas na especificação LoongArch 1.10.
- Adicionado suporte ao conjunto de instruções KVX, usadas em processadores Kalray (por exemplo, aplicadas no SoC Coolidge).
- Para sistemas baseados na arquitetura Intel, adicionado suporte às extensões:
- Intel APX: 32 GPRs, NDD, PUSH2/POP2, PUSHP/POPP.
- USER_MSR.
- AVX10.1.
- PBNDKB.
- SM4.
- SM3.
- SHA512.
- AVX-VNNI-INT16.
- No port para a arquitetura RISC-V, adicionado suporte às extensões:
- T-Head (XTheadVector, XTheadZvlsseg e XTheadZvamo).
- CORE-V (XCVmac, XCValu).
- SiFive VCIX (XSfVcp).
- No port para a arquitetura AArch64, adicionado suporte às extensões:
- SVE2.1 (Extensão Vetorial Escalável 2.1).
- SME2.1 (Extensão Matricial Escalável 2.1).
- B16B16 (BFloat16 e BFloat16 para SVE2 e SME2).
- RASv2 (Confiabilidade, Disponibilidade e Manutenibilidade v2).
- LSE128 (Atômico de 128 bits).
- GCS (Pilha de Controle Protegida).
- CHK (Verificar o Status do Recurso).
- SPECRES2 (Restrições de Especificação Aprimoradas).
- LRCPC3 (Carga-Aquisição RCpc).
- THE (Dureza de Tradução).
- ITE (Rastreamento de Instruções).
- D128 (Descritores de Tabela de Páginas de Memória de 128 bits).
- XS (atributo de memória XS).
- Adicionado suporte a processadores AArch64 Cortex-A520, Cortex-A720, Cortex-X3 e Cortex-X4.
- No assembler BPF, para compatibilidade com o assembler clang/LLVM, adicionado suporte para separação de comentários com os símbolos «#» e «//», assim como o uso do símbolo «;» para separar expressões na linha («;» não pode mais ser usado para comentários).
Fonte: opennet.ru
