Solo la raíz puede adjuntarse a un proceso con privilegios elevados. En un poco más de detalle, adjuntar a un proceso en ejecución con la llamada al sistema ptrace (que es lo que los depuradores usan bajo el capó) Requiere varias condiciones. Una condición necesaria, la condición clásica de Unix, es que si el proceso de destino se está ejecutando sin privilegios elevados (sin setuid, no setgid, y ningún otro mecanismo de elevación de privilegios como setcap), entonces el proceso que llama a ptrace
debe ejecutarse como mismo ID de usuario. Un proceso que se ejecuta como root (ID de usuario efectivo igual a 0) siempre puede adjuntarse, por lo que root puede depurar cualquier proceso.
(Linux tiene restricciones adicionales dependiendo de su estado de fortalecimiento; la mayoría de las distribuciones establecen kernel.yama.ptrace_scope
en 1, lo que evita que cualquier proceso no root se ejecute ptrace
, excepto para rastrear sus procesos secundarios. Esto significa que puede ejecutar un programa en un depurador pero no adjuntar un depurador a un proceso que ya está en ejecución.)
Además, si se está rastreando un proceso (es decir, se está depurando), no puede elevar sus privilegios. La elevación de privilegios se realiza mediante la llamada al sistema execve
, en función de los indicadores de permiso en el archivo ejecutado. Si un proceso llama a execve
mientras se está rastreando, los indicadores de elevación de privilegios se ignoran, y la nueva imagen de proceso tiene los mismos privilegios que tenía antes de la llamada execve
.
De esta manera, la elevación de privilegios es incompatible con cualquier cosa que pueda cambiar las implicaciones de seguridad. No hay forma de organizar la ejecución de un depurador en un proceso con privilegios adicionales, a menos que ejecute el depurador como root (si puede hacerlo, no obtendrá ningún privilegio que no tuviera).
Si desea depurar un programa que se ejecuta con privilegios elevados, hay dos formas, ambas requieren que el depurador se ejecute como root. Puede iniciar el depurador y hacer que ejecute todo el código de preparación que configura los privilegios con los que se ejecutará el proceso. O bien, puede dejar que el programa se inicie en sus condiciones normales y adjuntar el depurador en cualquier momento.
Por supuesto, si un programa se inicia como setuid y luego elimina los privilegios (es decir, termina con las identificaciones de usuario reales, reales y guardadas, y también para las identificaciones de grupo y otros privilegios), entonces puede adjuntar un depurador que se ejecuta bajo la mismo usuario después de que el proceso haya perdido sus privilegios.