¿Cómo hacer que un proceso sea invisible para otros usuarios?

19

¿Cómo podría iniciar un proceso y hacerlo invisible para el topcomando? El proceso lo inicia un usuario normal (no root) y no debe ser visible para otros usuarios normales.

Depurador
fuente
1
Ese tipo de derrota el propósito de la cima y sería demasiado fácil de abusar. ¿Por qué no simplemente cambiar el nombre del proceso? this_is_not_the_process_you_are_looking_for?
Ya veo, ¿qué hay de ocultar al usuario?
55
Díganos que no está tratando de escribir un kit raíz. ¿Puede explicar su escenario para que tal vez podamos sugerir una mejor arquitectura de seguridad en lugar de una que generalmente se considera un comportamiento "malvado"?
Caleb
2
Puede usar grsecurity o SELinux . Ambos requieren intervención raíz para la configuración inicial.
Gilles 'SO- deja de ser malvado'

Respuestas:

11

El topcomando 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.carchivo.

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_getattrsí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.

Corey Henderson
fuente
4

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.

Caleb
fuente
1

No es tan simple en Linux Box estándar. Mire la seguridad , pero requiere parchear el núcleo, etc.

marioosh
fuente
2
Creo que esto viene de serie con un núcleo selinux.
user606723
0

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 topcomando y modificarlo en consecuencia. Luego puede reemplazar el topcomando en /usr/sbin(o donde sea que esté) con su versión.

LawrenceC
fuente
2
Reemplazar 'top' no impide que un usuario haga lo que hace top.
Tim Post
2
No, pero la pregunta es cómo hacer que los procesos sean invisibles para el topcomando.
LawrenceC