¿Cómo podría iniciar un proceso y hacerlo invisible para el top
comando? El proceso lo inicia un usuario normal (no root) y no debe ser visible para otros usuarios normales.
¿Cómo podría iniciar un proceso y hacerlo invisible para el top
comando? El proceso lo inicia un usuario normal (no root) y no debe ser visible para otros usuarios normales.
Respuestas:
El kernel de Linux desde 3.3 contiene soporte para ocultar procesos a otros usuarios.
Se realiza mediante hidepid=
y gid=
monta opciones para / proc como se describe en la confirmación correspondiente y Documentation / filesystems / proc.txt .
Debian Wheezy también incluye esta característica.
El top
comando lee los datos de proc, que se proporcionan directamente desde el kernel. Para ocultar los procesos, tendrías que usar el código dentro del núcleo para enmascarar.
Además de usar un marco de seguridad como SELinux y grsecurity (mencionado en las otras respuestas), el código de estilo rootkit es su única opción restante. Digo "estilo" porque un "rootkit" en sí mismo no es malo, es cómo se usa. Existen razones perfectamente legítimas para ocultar los procesos de otros usuarios, por lo que esta capacidad existe en los marcos de seguridad.
La ruta básica que tendría que seguir para que esto funcione es conectar (o secuestrar, dependiendo de cómo lo mire) las funciones en el kernel de Linux que distribuyen los /proc/pid/
datos. Demuestro un método para conectar las funciones del kernel de Linux en un módulo de seguridad que escribí:
https://github.com/cormander/tpe-lkm
El código de "alto nivel" para esto está en el hijack_syscalls()
método security.c
, y la magia del diablo en los detalles está en el hijacks.c
archivo.
Probablemente encontrará las funciones que desea conectar en el fs/proc/
directorio del código fuente del kernel de Linux. Tenga en cuenta que Linux no proporciona un ABI estable, por lo que su código tendrá que cambiar un poco para que funcione en diferentes versiones del kernel de Linux. Además, tenga en cuenta que necesita acceso raíz completo a la máquina para poder insertar este código.
ACTUALIZAR:
Si ajusta el pid_getattr
símbolo del núcleo con algún código adicional, es muy fácil hacerlo. Recientemente agregué algo que oculta los procesos al módulo del kernel anterior:
https://github.com/cormander/tpe-lkm/commit/899bd5d74764af343d5fee1d8058756ddc63bfe3
Puede hacer algo similar haciendo que los procesos de un determinado usuario o grupo no sean visibles para nadie, excepto para el usuario root y ese usuario. Hacerlo por nombre de proceso es un poco más complejo, pero posible. Echa un vistazo a la exe_from_mm()
función. Tenga en cuenta que puede haber implicaciones de rendimiento al usarlo dentro de pid_getattr
.
Parecen las dos opciones principales.
Selinux funciona colocando a diferentes personas en diferentes dominios de seguridad y, en cierto sentido, protegiéndolas para que no puedan ver las cosas de los demás. Esto está cubierto en esta pregunta . Dado que selinux se está convirtiendo rápidamente en el marco de seguridad de facto en el mundo de Linux, esta es probablemente la dirección que debe mirar.
El otro es la seguridad, tal como mencionó Mario y como se hizo en esta pregunta . Algunas distribuciones tienen paquetes de kernel alternativos con parches de seguridad aplicados. Si el suyo tiene esto, puede considerar usarlos.
Si por alguna razón desea hacer esto sin la adición de un marco de seguridad como selinux o grsecurity, explique cómo lo que está haciendo no es escribir un kit raíz.
No es tan simple en Linux Box estándar. Mire la seguridad , pero requiere parchear el núcleo, etc.
podrías anular tu argv [0] con otro nombre ... pero hablando estrictamente, estás buscando algún tipo de rootkit. esto puede ayudarte: http://stupefydeveloper.blogspot.com/2008/10/linux-change-process-name.html
Podría escribir un comando equivalente que funcione igual que top
, pero no muestre procesos que coincidan con un nombre específico. Alternativamente, puede obtener el código fuente del top
comando y modificarlo en consecuencia. Luego puede reemplazar el top
comando en /usr/sbin
(o donde sea que esté) con su versión.
top
comando.
this_is_not_the_process_you_are_looking_for
?