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?
Respuestas:
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
, ySIGTTOU
).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) .
fuente
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_UNKILLABLE
indicador en su proceso. Este indicador está diseñado para establecerse soloinit
(osystemd
, 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.fuente
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.
fuente
inittab
) es posible que el proceso del monitor también pueda ser eliminado, ¿no?