¿Cómo pueden ser seguras las utilidades con setuid set a root si son debuggable?

7

Hoy escuché en la Uni algo que rompió mi modelo mental sobre la separación de los derechos de los usuarios. A saber, escuché que:

  

Puedo depurar libremente todos los programas que tengo permiso para ejecutar, incluso los que tienen configurados como root.

Eso significa que puedo, por ejemplo, ejecutar su en el depurador. Lo probé y funcionó:

gdb su

Esto es alucinante para mí. ¿Puedo presentarle mi antiguo modelo mental sobre la gestión de derechos de los usuarios para que pueda corregir mi error y explicarme cómo son las cosas realmente?

Hasta hoy, solía creer que:

  • Todo lo que se ejecuta en mi cuenta de usuario es, por definición, "mío". Es decir, puedo hacer libremente lo que quiera con un programa así, en particular puedo depurarlo, lo que implica que puedo leer y modificar todos los datos que dicho programa almacena en su memoria, o incluso parchearlos mientras se está ejecutando.
  • Programas con setuid configurado para otro usuario (supongamos que es root, por simplicidad) ejecutados con derechos que exceden los derechos de mi cuenta de usuario, pero a cambio, se supone que deben hacer solo lo que fueron diseñados para hacer : nada más y es una brecha de seguridad. Por lo tanto, estos programas, aunque pueden ser ejecutados por mi cuenta, sin embargo, ejecutan bajo la cuenta que los posee, por lo que desde el punto de vista de la gestión de derechos, se ejecutan como si fueron dirigidas por su propietario, por lo que no puedo leer su memoria ni interrumpir su ejecución, por lo que no puedo hacerlas a mi voluntad, por lo que en particular no puedo depurarlas.

El segundo punto es manifiestamente falso. Pero, de acuerdo con mi modelo mental (claramente incorrecto), esto implica que, si, por ejemplo, ejecuto su en gdb , puedo atrapar el momento en que su decide si la contraseña es correcta, modifique este fragmento de la memoria de su para obligarlo a creer que la respuesta a esta pregunta fundamental es positiva, luego reanudar su ejecución y listo, ahora tengo derechos de raíz. Bueno, los autores binarios podrían intentar ofuscar su código para hacer esto difícil, pero una persona hábil y persistente siempre puede superar esto y esto no se aplica a su de todos modos ya que es de código abierto.

¿Dónde está mal mi modelo mental? ¿Dónde está en desacuerdo con la realidad?

    
pregunta gaazkam 29.10.2018 - 17:19
fuente

1 respuesta

14

Normalmente, cuando se ejecuta su, se ejecuta setuid (como root). Cuando lo inicia con gdb, el bit setuid no tiene efecto (porque se está procesando), por lo que incluso si lo convence de que ingresó la contraseña correcta, no tendrá permiso para darle un nuevo UID. La razón de esto es mitigar el ataque exacto que describe.

    
respondido por el Joseph Sible 30.10.2018 - 01:38
fuente

Lea otras preguntas en las etiquetas