Após seis meses de desenvolvimento, foi lançada a versão da biblioteca de sistema GNU C Library (glibc) 2.34, que atende completamente aos requisitos dos padrões ISO C11 e POSIX.1-2017. A nova versão inclui correções de 66 desenvolvedores.
Entre as melhorias implementadas no Glibc 2.34, podemos destacar:
- As bibliotecas libpthread, libdl, libutil e libanl foram integradas ao núcleo da libc, permitindo que sua funcionalidade em aplicações não exija mais vinculação com as flags -lpthread, -ldl, -lutil e -lanl. A preparação para a integração do libresolv na libc foi realizada. Essa integração permitirá um processo de atualização mais coeso do glibc e simplificará a implementação do runtime. Para garantir a compatibilidade retroativa com aplicações compiladas nas versões antigas do glibc, foram disponibilizadas bibliotecas stub. Devido à ampliação do número de estruturas e funções disponíveis no glibc, é possível que ocorram problemas em aplicações onde há colisões de nomes com bibliotecas anteriormente não utilizadas, como libpthread, libdl, libutil, libresolv e libanl.
- Possibilitou-se o uso do tipo de 64 bits time_t em configurações onde tradicionalmente era utilizado o tipo de 32 bits time_t. Em tais configurações, por exemplo, em sistemas x86, o time_t de 32 bits ainda permanece como padrão, mas este comportamento agora pode ser alterado com o uso da macro "_TIME_BITS". Essa possibilidade está disponível apenas em sistemas com o kernel do Linux na versão 5.1 ou superior.
- Adicionada a função _Fork, uma substituição da função fork, que atende aos requisitos de "async-signal-safe", ou seja, permite chamadas seguras de manipuladores de sinais. Durante a execução do _Fork, um ambiente mínimo é criado, suficiente para chamar funções em manipuladores de sinais, como raise e execve, sem utilizar recursos que possam alterar bloqueios ou o estado interno. A chamada do _Fork será definida em uma versão futura do padrão POSIX, mas por enquanto está incluída entre as extensões do GNU.
- Foi implementada a função execveat para a plataforma Linux, que permite executar um arquivo executável a partir de um descritor de arquivo aberto. A nova função também é utilizada na implementação da chamada fexecve, que não requer que o sistema tenha o pseudo-sistema de arquivos /proc montado durante a execução.
- Foi adicionada a função timespec_getres, definida no rascunho do padrão ISO C2X, que complementa a função timespec_get com funcionalidades semelhantes à função POSIX clock_getres.
- Adicionada a função close_range(), que permite que um processo feche todo um intervalo de descritores de arquivo abertos de uma só vez. A função está disponível em sistemas com kernel Linux, versão 5.9 ou superior.
- Foram adicionadas as funções closefrom e posix_spawn_file_actions_addclosefrom_np, que permitem fechar todos os descritores de arquivo cujo número seja maior ou igual ao valor especificado de uma só vez.
- Nos modos ‘_DYNAMIC_STACK_SIZE_SOURCE’ e ‘_GNU_SOURCE’, os valores PTHREAD_STACK_MIN, MINSIGSTKSZ e SIGSTKSZ não são mais constantes, o que permite suporte a conjuntos de registradores de tamanho dinâmico, como os fornecidos pela extensão ARM SVE.
- No vinculador, foi implementada a opção ‘—list-diagnostics’ para exibir informações relacionadas às operações de determinação IFUNC (função indireta) e escolha do subdiretório glibc-hwcaps.
- Foi implementado o macro __STDC_WANT_IEC_60559_EXT__, que serve para verificar a presença de funções definidas na aplicação ‘F’ da especificação ISO C2X.
- Para sistemas powerpc64*, foi implementada a opção ‘—disable-scv’, permitindo compilar o glibc sem suporte à instrução scv.
- No arquivo gconv-modules, foi mantido apenas o conjunto mínimo de módulos gconv essenciais, enquanto os demais foram movidos para um arquivo adicional gconv-modules-extra.conf, localizado no diretório gconv-modules.d.
- Para a plataforma Linux, foi implementado o parâmetro glibc.pthread.stack_cache_size, que pode ser usado para configurar o tamanho do cache de pilha pthread.
- A função inet_neta do arquivo de cabeçalho foi declarada obsoleta, assim como várias funções raramente utilizadas de (dn_count_labels, fp_nquery, fp_query, fp_resstat, hostalias, loc_aton, loc_ntoa, p_cdname, p_cdnname, p_class, p_fqname, p_fqnname, p_option, p_query, p_rcode, p_time, p_type, putlong, putshort, res_hostalias, res_isourserver, res_nameinquery, res_queriesmatch, res_randomid, sym_ntop, sym_ntos, sym_ston) e (ns_datetosecs, ns_format_ttl, ns_makecanon, ns_parse_ttl, ns_samedomain, ns_samename, ns_sprintrr, ns_sprintrrf, ns_subdomain). Em vez dessas funções, recomenda-se usar bibliotecas separadas para manipulação de DNS.
- As funções pthread_mutex_consistent_np, thread_mutexattr_getrobust_np, pthread_mutexattr_setrobust_np e pthread_yield foram declaradas obsoletas e devem ser substituídas por pthread_mutex_consistent, thread_mutexattr_getrobust, thread_mutexattr_setrobust e sched_yield.
- O uso de links simbólicos para vincular objetos compartilhados instalados à versão do Glibc foi descontinuado. Agora, esses objetos são instalados como estão (por exemplo, libc.so.6 agora é um arquivo, e não um link para libc-2.34.so).
- Por padrão, as capacidades de depuração no malloc estão desativadas, como MALLOC_CHECK_ (glibc.malloc.check), mtrace() e mcheck(), que foram movidas para uma biblioteca separada libc_malloc_debug.so, onde também foram transferidas as funções obsoletas malloc_get_state e malloc_set_state.
- No Linux, para o funcionamento de funções como shm_open e sem_open, agora é necessário ter o dispositivo /dev/shm.
- Vulnerabilidades corrigidas:
- CVE-2021-27645: queda do processo nscd (daemon de cache de servidor de nomes) devido a uma chamada dupla à função free ao processar solicitações netgroup formatadas de forma específica.
- CVE-2021-33574: acesso a uma área de memória já liberada (use-after-free) na função mq_notify ao usar o tipo de notificação SIGEV_THREAD com um atributo de thread que possui uma máscara alternativa de vinculação à CPU. O problema pode levar a uma queda, mas outras formas de ataque não estão excluídas.
- CVE-2021-35942: o estouro do tamanho do parâmetro na função wordexp pode levar à queda do aplicativo.
Fonte: opennet.ru
