¿Por qué no se crea un volcado de núcleo cuando una aplicación tiene configurado SUID?

16

Configuré mi entorno para crear un volcado de núcleo de todo lo que falla, sin embargo, cuando ejecuto un programa con SUID configurado en un usuario diferente que el usuario ejecutor, no crea un volcado de núcleo. ¿Alguna idea de por qué podría ser esto? No pude encontrarlo en ninguna parte de la web, creo que es algún tipo de característica de seguridad, pero me gustaría deshabilitarlo ...

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 que funcione de la manera más segura posible, ahora tengo el siguiente script para configurar el entorno:

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

Ahora todo lo que queda por hacer es agregar ACL a / var / coredumps para que los usuarios solo puedan agregar archivos y no modificarlos ni leerlos nunca más. La única reducción es que todavía tendría un problema con las aplicaciones chroot que necesitarían bind mountalgo o algo así.

Dip switch
fuente

Respuestas:

21

La memoria de un programa setuid podría (es probable que, incluso) contenga datos confidenciales. Por lo tanto, el volcado del núcleo debería ser legible solo por root.

Si el volcado del núcleo es propiedad de root, no veo un agujero de seguridad obvio, aunque el núcleo debería tener cuidado de no sobrescribir un archivo existente.

Linux deshabilita los volcados de núcleo para los programas setxid. Para habilitarlos, debe hacer al menos lo siguiente (no he comprobado que esto sea suficiente):

  • Habilite los volcados de núcleo setuid en general configurando el fs.suid_dumpablesysctl en 2, por ejemplo, con echo 2 >/proc/sys/fs/suid_dumpable. (Nota: 2, no 1; 1 significa "Estoy depurando el sistema en su conjunto y quiero eliminar toda la seguridad").
  • Llamar prctl(PR_SET_DUMPABLE, 1)desde el programa.
Gilles 'SO- deja de ser malvado'
fuente
Señor, ahora eres mi héroe personal!
DipSwitch
@DipSwitch Strange, eso no es lo que fs.suid_dumpabledice la documentación . ¿Puedes intentar configurar fs.suid_dumpablesin llamar pctrlal programa? Tal vez estoy malinterpretando la documentación y en este caso obtienes un núcleo pero propiedad de root.
Gilles 'SO- deja de ser malvado'
Ah mierda mía ... el archivo es propiedad de root pero el% u (uid) en core_pattern me estaba engañando a primera vista.
DipSwitch
Esta solución también parece aplicarse a los programas que se ejecutan bajo "sudo -s", al menos para el kernel 2.6.27.
Seth Noble
7

El volcado del núcleo contiene una copia de todo lo que estaba en la memoria en el momento de la falla. Si el programa se ejecuta suid, eso significa que necesita acceso a algo a lo que usted, como usuario, no tiene acceso. Si el programa obtiene esa información y luego descarga el núcleo, podrá leer esa información privilegiada.

Según su ejemplo anterior, parece que puede obtener un volcado de núcleo cuando se ejecuta como root o si elimina la escalada de privilegios.

Si bien puede ser útil (solo para los desarrolladores me parece) tener un acceso fácil a un coredump desde un programa setuid, es un agujero de seguridad y debe dejarse en su lugar.

poco pitón
fuente
1
Tenía miedo de que dijeras algo así :(
DipSwitch
0

Decidí que también compartiría mi caso de uso, hasta que lo olvide. También podría ser útil para el futuro, ya que estaba resolviendo el mismo problema hace meses y me llevó demasiado tiempo descubrirlo una vez más. Okay. en realidad no es un volcado del núcleo, sino un seguimiento de la pila que también es útil.

Problema: No tengo idea de lo que está pasando allí:

sudo id
Segmentation fault

Solución: mover el bit suid sudoa valgrindfunciona bien:

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

Si se instala debuginfo, se escribe una buena traza inversa.

Jakuje
fuente
Y mientras tanto, hasta que recuerdes restablecer las transmisiones, todos y la tía Tillie pueden hacer valgrindlo que quieran. No hagas esto , es un gran riesgo de seguridad.
vonbrand
solo en máquinas de prueba y para fines de prueba, por supuesto.
Jakuje
me da los pelos de punta, independientemente.
vonbrand