Carregador dinâmico
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
Adição: O problema recebeu um número
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