Hacer un proceso imposible de matar en Linux

14

Estoy trabajando en una aplicación de administrador de contraseñas y, por razones de seguridad, quiero iniciar un proceso imposible de matar.

Y además, no quiero que este programa sea un demonio ya que necesito leer de entrada estándar y escribir en él.

¿Hay alguna forma de hacer esto?

Mohammad Razeghi
fuente
11
"Por razones de seguridad, quiero lanzar un proceso imposible de matar". Solo una nota: si esto se permitiera, las personas podrían explotarlo fácilmente por razones nefastas, por ejemplo, lanzar una bomba tenedor imparable.
VLAZ
32
Esto suena como un problema XY . Sospecho que, sea lo que sea lo que realmente estés tratando de lograr, un proceso imposible de matar no es la forma de hacerlo. "Por razones de seguridad" es muy vago. ¿Qué es exactamente lo que quieres evitar que haga el usuario? ¿Qué acceso tienen?
Nate Eldredge
44
Cualquier proceso que no se pueda matar para todos los efectos es un virus.
Naftuli Kay
3
@NateEldredge: Más bien, haga que el programa ignore las señales. Esa es la forma típica de hacerlo; de lo contrario, alguien podría enviar un SIGINT o SIGTSTP directamente al proceso, sin pasar por el terminal.
Noah Spurrier
2
@NoahSpurrier: Estoy imaginando una situación en la que tienes un usuario que puede escribir cosas en la consola, pero que de otro modo no puede ejecutar código en la computadora (como un quiosco). Lo configura para que ninguna tecla que puedan escribir tenga un efecto inesperado. Si pueden ejecutar otro código, ignorar SIGINT y SIGTSTP y SIGQUIT no ayuda; cualquiera que pueda enviar esas señales directamente al proceso también puede enviar SIGKILL o SIGSTOP que no puede ignorar.
Nate Eldredge

Respuestas:

41

Hacer que el administrador de contraseñas de ejecución en virtud de un usuario y una manija separada / ignore / señales generadas con bloque de terminales ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTIN, y SIGTTOU).

No puede enviar señales a procesos (= kill) ejecutados bajo un usuario diferente (usuario cuyo uid real y uid de conjunto guardado es diferente de su uid efectivo) a menos que su id efectivo sea 0 (root).

Todos los procesos seguirán siendo eliminados por root.

Para detalles más detallados, vea kill (2) .

PSkocik
fuente
15

La única forma de hacer que un proceso no se pueda matar es implementarlo como un hilo del núcleo , lo cual no es algo trivial.

Todavía puede matarlo, pero eso sería un daño colateral de apagado del sistema operativo.

También puede desarrollar un módulo de kernel personalizado que establezca el SIGNAL_UNKILLABLEindicador en su proceso. Este indicador está diseñado para establecerse solo init(o systemd, sea cual sea el proceso inicial que se inicie el kernel), que son los únicos procesos de usuario y tierra protegidos contra una eliminación incondicional, pero nada parece prohibir que ese indicador esté presente en un proceso normal.

jlliagre
fuente
1
podría ser el proceso de inicio
muhmuhten
@muhmuhten Tienes razón, init es un proceso de usuario que está protegido contra una muerte incondicional. Sin embargo, no está diseñado para personalizarse, mientras que definitivamente hay una API para módulos y subprocesos del núcleo.
jlliagre
Para dar más detalles sobre mi propia respuesta, supongo que no tiene acceso a una cuenta raíz (que, por cierto, insinúa que este es un ejemplo de juguete, un proyecto de curso o malware). Esto excluye la idea de que podría conectar un módulo de kernel para ese propósito. También tenga en cuenta que el indicador SIGNAL_UNKILLABLE no está disponible para procesos normales y excluye algunas operaciones normales importantes (como vforking) y, por lo tanto, lo consideraría un caso de borde normalmente poco práctico.
GregD
@jlliagre de hecho, no lo es.
Muhmuhten
@dudek Un proceso imposible de matar ya es un caso marginal normalmente poco práctico.
jlliagre
11

Técnicamente, no hay forma de hacer que un proceso sea imposible de matar.

Por supuesto, para los usuarios no root solo pueden eliminar procesos que tienen la misma ID de usuario que ellos, por lo que si puede crear cuentas diferentes, puede usar una ID de usuario "única" para el proceso y luego solo root podría eliminarlo.

Una solución simple, pero menos robusta, es hacer que su proceso capte tantas señales como sea posible (quizás ignorándolas). Esto solo es adecuado para ejemplos de juguetes o entornos no adversos, ya que no hay forma de captar la señal KILL (señal 9), pero de lo contrario, puede evitar ser asesinado por ellos.

Finalmente, puede hacer arreglos para que su proceso reaparezca si es asesinado. Esto también es frágil (muy frágil), pero hará que sea un poco más difícil de eliminar. Esto se puede lograr usando un proceso de monitor propio o usando inittab. Para un adversario que sabe lo que está haciendo, esto puede evitarse fácilmente eliminando múltiples procesos a la vez.

GregD
fuente
1
Pero (aparte de inittab) es posible que el proceso del monitor también pueda ser eliminado, ¿no?
roaima
No, los controladores de dispositivo (módulos del núcleo) pueden crear procesos que la raíz no puede eliminar.
Noah Spurrier