Carregador dinâmico , incluído no OpenBSD, pode, sob certas condições, - os aplicativos deixam a variável de ambiente LD_LIBRARY_PATH e assim permitem que código de terceiros seja carregado no contexto de um processo executado com privilégios elevados. Patches que corrigem a vulnerabilidade estão disponíveis para lançamentos и . Patches binários () para plataformas amd64, i386 e arm64 já estão em produção e deverão estar disponíveis para download no momento da publicação desta notícia.
A essência do problema: durante a operação, ld.so primeiro extrai o valor da variável LD_LIBRARY_PATH do ambiente e, usando a função _dl_split_path(), o transforma em um array de strings - caminhos para diretórios. Se posteriormente for descoberto que o processo atual foi iniciado por um aplicativo SUID/SGID, o array criado e, de fato, a variável LD_LIBRARY_PATH serão limpos. Ao mesmo tempo, se _dl_split_path() ficar sem memória (o que é difícil devido ao limite explícito de 256 kB no tamanho das variáveis de ambiente, mas teoricamente possível), então a variável _dl_libpath receberá o valor NULL, e a verificação subsequente de o valor desta variável forçará a ignorar a chamada para _dl_unsetenv("LD_LIBRARY_PATH").
Vulnerabilidade encontrada por especialistas , assim como problemas. Os pesquisadores de segurança que identificaram a vulnerabilidade notaram a rapidez com que o problema foi resolvido: um patch foi preparado e as atualizações foram lançadas três horas após o projeto OpenBSD receber a notificação.
Adição: O problema recebeu um número . Feito na lista de discussão oss-security , incluindo um protótipo de exploração rodando nas arquiteturas OpenBSD 6.6, 6.5, 6.2 e 6.1
amd64 e i386 (o exploit pode ser adaptado para outras arquiteturas).
O problema pode ser explorado na instalação padrão e permite que um usuário local sem privilégios execute código como root por meio de substituição de biblioteca ao executar os utilitários chpass ou passwd suid. Para criar as condições de pouca memória necessárias para a operação, defina o limite RLIMIT_DATA por meio de setrlimit.
Fonte: opennet.ru
