Como é que nenhum dump de núcleo é criado quando um aplicativo tem o SUID definido?

16

Eu configurei meu ambiente para criar um core dump de tudo o que falha, no entanto, quando executo um programa com o SUID definido em um usuário diferente do usuário em execução, ele não cria um core dump. Alguma ideia de por que isso pode ser? Não consegui encontrá-lo em nenhum lugar da Web, acho que é algum tipo de recurso de segurança, mas gostaria de desativá-lo ...

Problema:

$ cd /tmp
$ cat /etc/security/limits.conf | grep core
*     -     core     unlimited
root  -     core     unlimited

$ ls -l ohai
-rwsr-sr-x 1 root root 578988 2011-06-23 23:29 ohai

$ ./ohai
...
Floating point exception

$ sudo -i
# ./ohai
...
Floating point exception (core dumped)
# chmod -s ohai
# exit
$ ./ohai
...
Floating point exception (core dumped)

Editar: Para torná-lo o mais seguro possível, agora tenho o seguinte script para configurar o ambiente:

mkdir -p /var/coredumps/
chown root:adm /var/coredumps/
chmod 772 /var/coredumps/

echo "kernel.core_pattern = /var/coredumps/core.%u.%e.%p" >> /etc/sysctrl.conf
echo "fs.suid_dumpable = 2" >> /etc/sysctl.conf

echo -e "*\t-\tcore\tunlimited" >> /etc/security/limits.conf
echo -e "root\t-\tcore\tunlimited" >> /etc/security/limits.conf

Agora, tudo o que resta a fazer é adicionar a ACL a / var / coredumps, para que os usuários possam adicionar apenas arquivos e não modificá-los nem lê-los novamente. O único tamanho reduzido é que eu ainda teria um problema com aplicativos chrootados que precisaria de bind mountalgo assim.

DipSwitch
fonte

Respostas:

21

A memória de um programa setuid pode (provavelmente, até) conter dados confidenciais. Portanto, o dump principal deve ser legível apenas pela raiz.

Se o dump principal é de propriedade do root, não vejo uma falha de segurança óbvia, embora o kernel precise ter cuidado para não sobrescrever um arquivo existente.

O Linux desativa os dumps principais para programas setxid. Para habilitá-los, você precisa fazer pelo menos o seguinte (não verifiquei se isso é suficiente):

  • Ative dumps do núcleo setuid em geral, definindo o fs.suid_dumpablesysctl como 2, por exemplo, com echo 2 >/proc/sys/fs/suid_dumpable. (Nota: 2, não 1; 1 significa "Estou depurando o sistema como um todo e quero remover toda a segurança".)
  • Ligue prctl(PR_SET_DUMPABLE, 1)do programa.
Gilles 'SO- parar de ser mau'
fonte
Senhor, agora você é meu herói pessoal!
Dipswitch
@ DipSwitch Strange, não é para isso que fs.suid_dumpablediz a documentação . Você pode tentar configurar fs.suid_dumpablesem chamar pctrlo programa? Talvez eu esteja entendendo mal a documentação e você tenha um núcleo, mas de propriedade da raiz nesse caso.
Gilles 'SO- stop be evil'
Ah, que pena ... o arquivo pertence à raiz, mas o% u (uid) no core_pattern estava me enganando à primeira vista.
Dipswitch
Esta solução também parece se aplicar a programas executados em "sudo -s", pelo menos no kernel 2.6.27.
Seth Noble
7

O dump principal contém uma cópia de tudo o que estava na memória no momento da falha. Se o programa estiver executando o suid, isso significa que ele precisa acessar algo que você, como usuário, não tem acesso. Se o programa obtiver essas informações e despejar o núcleo, você poderá ler essas informações privilegiadas.

No seu exemplo acima, parece que você pode obter um dump principal ao executar como root ou remover a escalação de privilégios.

Embora possa ser útil (apenas para desenvolvedores) ter acesso fácil a um coredump a partir de um programa setuid, é uma falha de segurança e deve ser mantida no lugar.

antitônico
fonte
11
Eu tinha medo que você onde vai dizer algo como isso :(
Dipswitch
0

Decidi também compartilhar meu caso de uso, até que eu o esquecesse. Pode ser útil também para o meu futuro, já que eu estava resolvendo o mesmo problema há alguns meses e demorei muito tempo para descobrir mais uma vez. Está bem. na verdade, não é core-dump, mas o rastreamento de pilha que também é útil.

Problema: Não faço ideia do que está acontecendo lá:

sudo id
Segmentation fault

Solução: Mover suid bit de sudopara valgrindfunciona bem:

chmod +s /usr/bin/valgrind
chmod -s /usr/bin/sudo
valgrind /usr/bin/sudo id

Se o debuginfo estiver instalado, um bom backtrace será gravado.

Jakuje
fonte
Enquanto isso, até que você lembre de redefinir as persuasões, todos e tia Tillie podem valgrindo que quiserem. Não faça isso , é um enorme risco de segurança.
vonbrand 29/01
somente na máquina de teste e para fins de teste, é claro.
Jakuje 29/01
me dá vontade, independentemente.
vonbrand 29/01