Quiero crear un programa que será difícil de detener (incluso para el administrador) una vez que se inicie (con privilegios de root). Una vez iniciado, el proceso debe continuar iniciando en el inicio hasta que se le solicite que se detenga. El proceso de detención debería llevar algún tiempo (es decir, debería ser costoso).
Sé que esto puede sonar como un software malicioso, pero lo quiero por una razón genuina. Quiero ejecutar bloqueadores de sitios en mi computadora portátil (en la que soy administrador). Y quiero que sea difícil para mí detenerlos.
La solución que pensé es la siguiente:
El proceso debe ejecutarse con un nombre diferente cada vez que se ejecuta, para que no pueda predecir el nombre del proceso y eliminarlo.
El proceso se guardará en /etc/rc5.d al cerrar
El proceso cifrará su nombre usando un cifrado en alguna ubicación conocida. El proceso de detención tendrá que usar fuerza bruta para recuperar el nombre del programa y matarlo.
Me gustaría encontrar una buena solución para esta tarea.
Respuestas:
Un enfoque podría ser usar espacios de nombres PID:
Arranque su sistema con un
init=/some/cmd
parámetro como kernel, donde/some/cmd
bifurca un proceso en un nuevo espacio de nombres (CLONE_NEWPID
) y se ejecuta/sbin/init
en él (tendrá PID 1 en ese nuevo espacio de nombres y pid 2 en el espacio de nombres raíz), luego en el padre, ejecute su " programa".Probablemente desee una forma de controlar su programa de una forma u otra (TCP o ABSTRACT Unix socket, por ejemplo).
Probablemente querrás bloquear tu programa en la memoria y cerrar la mayoría de las referencias al sistema de archivos para que no dependa de nada.
Ese proceso no se verá desde el resto del sistema. El resto del sistema se ejecutará como en un contenedor.
Si ese proceso muere, el núcleo entrará en pánico, lo que le brinda una garantía adicional.
Sin embargo, un efecto secundario inconveniente es que no veremos los hilos del núcleo en la salida de
ps
.Como prueba de concepto (usando este truco para iniciar una copia de su sistema en una máquina virtual qemu):
Crea un me
/tmp/init
gusta:(necesita
unshare
de una versión reciente de util-linux (2.14)). Arriba estamos usandosocat
como el "programa" que solo responde en conexiones TCP en el puerto 1234 con la salida deps -efH
.Luego, inicie su VM como:
Entonces, vemos:
fuente
No estoy seguro si es la solución final o si es la mejor manera de hacerlo. Mis opiniones:
Modifique
init
ya que es el primer proceso si muere, todos los demás también mueren. Por lo tanto, su máquina solo podrá utilizarse con ella.Cree un módulo de núcleo y cargue módulos críticos dependiendo de él (si se mata, provocará una reacción en cadena como en el
init
ejemplo).Modifique el núcleo para ignorar las solicitudes de eliminación de un determinado proceso.
Tenga en cuenta que los dos últimos se ejecutarán en modo kernel (que es muy limitado en términos de libs, etc.). La modificación
init
se ejecutará en el espacio de usuario, lo que le permite utilizar muchas funciones.fuente