¿Cómo audito un ejecutable para asegurarme de que no sea malicioso?

10

Me preguntaba si hay una herramienta o una técnica para ejecutar un ejecutable en un entorno aislado, tal vez en una máquina virtual. Mientras se ejecuta el programa, quiero poder auditar la aplicación, es decir, ver todo lo que está haciendo el ejecutable (acceso a archivos y red).

Al hacerlo, quiero poder verificar si el ejecutable es malicioso, es decir, realiza operaciones que no debería (leer / escribir en archivos, escuchar / conectarse a puertos de red, ...).

No me importaría algo con una interfaz gráfica.

Ouss
fuente
2
@EliahKagan: Si entiendo bien la pregunta, el OP pide "una (herramienta) donde pueda ver todo lo que está haciendo el ejecutable". Imagine si puede ejecutar sandbox somebinaryy el sandboxprograma imaginario registraría todos los archivos somebinaryleídos o escritos, todo IP / puertos conectados, datos transferidos, etc. Sería algo útil, también me gustaría saber si existe algo como esto (y, en realidad, sin esa herramienta, observar un programa que se ejecuta en una VM no tendría sentido No puedo decir lo que hace allí de todos modos). Buena pregunta.
Sergey
2
Pregunta relevante sobre UL.SE que pregunté antes: ¿Cómo monitorizo ​​los archivos abiertos de un proceso en tiempo real? (no solo acerca de los archivos, también de la red) Recuerde que una vez que vea que sucede, el daño ya tuvo lugar.
gertvdijk
2
Hice una pregunta sobre meta con respecto al cierre de esta pregunta: meta.askubuntu.com/questions/5871/… - No creo que debería haberse cerrado.
Sergey

Respuestas:

10

es una herramienta o tal vez una máquina virtual para ejecutar un ejecutable dentro de ella

Sí, esto se llama virtualización de aplicaciones .

LXC (Contenedores de Linux) es una herramienta de uso común para configurar esto. Le permite configurar una red completamente separada para esta aplicación y la "convierte" en una especie de máquina virtual, muy parecida a un chroot. Esto es principalmente para fines de seguridad (una "cárcel"), no realmente para auditoría.

Creo que está un poco fuera del alcance de la pregunta explicar los contenedores LXC completos y cómo auditarlos exactamente. Sin embargo, a continuación se muestra un poco sobre cómo comenzar.

Mientras se ejecuta el programa, quiero poder ver todo lo que está haciendo el ejecutable (acceso a archivos y red).

Esto se puede lograr usando stracey he hecho la misma pregunta en Unix y Linux:

Como se respondió allí, todo se reduce básicamente a

strace -t -e trace=open,close,read,getdents,write,connect,accept command-here

Importante: una vez que veas que sucede, el daño ya tuvo lugar.


Contenedor de aplicaciones LXC

De este artículo . Todo se reduce a:

  1. lxc-macvlan.conf archivo de configuración:

    # example as found on /usr/share/doc/lxc/examples/lxc-macvlan.conf
    # Container with network virtualized using the macvlan device driver
    lxc.utsname = alpha
    lxc.network.type = macvlan
    lxc.network.flags = up
    lxc.network.link = eth0 # or eth2 or any of your NICs
    lxc.network.hwaddr = 4a:49:43:49:79:bd
    lxc.network.ipv4 = 0.0.0.0/24
    
  2. Comience usando lxc-execute:

    sudo lxc-execute -n bash-test2 -f lxc-macvlan.conf /bin/bash
    

Tenga en cuenta que LXC ofrece sistemas y tipos de contenedores de aplicaciones. Estás buscando contenedores de aplicaciones aquí.

gertvdijk
fuente
1
LXC aún no está listo y actualmente no es seguro. Por ejemplo, /sysno está virtualizado y los cambios realizados /sysdesde el contenedor se realizan desde /sysel host. Haciendo una búsqueda rápida en la Web, hay algunos artículos que documentan cómo "escapar" de un contenedor. LXC será una buena solución al problema, pero actualmente no lo es, y no debe usarse como herramienta de seguridad.
Andrea Corbellini
1
Por cierto, la configuración de ejemplo publicada no hace uso de lxc.mountopciones. Esto significa que el sistema ejecutable puede acceder a todo el sistema de archivos del usuario.
Andrea Corbellini
10

Lo que está buscando es una herramienta que muestre cómo un programa interactúa con el sistema (más específicamente, con el núcleo). Los programas interactúan con el sistema usando syscalls. Ejemplos de syscalls son:

  • open - Se utiliza para abrir un archivo;
  • ready write- se usa para leer / escribir desde / a un descriptor de archivo;
  • connect - Se utiliza para conectar un zócalo a un par;
  • muchos, muchos otros (ver man syscalls).

El punto es: las llamadas al sistema se pueden rastrear usando ptrace(2). Entonces, básicamente, estás buscando herramientas construidas alrededor ptrace. Una de esas herramientas es strace(1), que es una aplicación de terminal que toma un comando como argumento y genera:

  • el sistema llama al programa está llamando;
  • los argumentos utilizados para hacer las llamadas al sistema;
  • El resultado de las llamadas al sistema.

La salida está en forma de C. Aquí hay un ejemplo:

$ strace cat test
execve("/bin/cat", ["cat", "test"], [/* 55 vars */]) = 0
/* ... */
open("test", O_RDONLY)                 = 3
/* ... */
read(3, "hello\n", 32768)               = 6
write(1, "hello\n", 6)                  = 6
read(3, "", 32768)                      = 0
/* ... */

Allí verá que cat testestá abriendo un archivo llamado test, leyendo su contenido ( hello) y colocándolo en la salida estándar.

stracepuede producir mucha salida, así que asegúrese de leer su página de manual ( man strace), especialmente la documentación de la -esalida que le permitirá ver solo las llamadas al sistema que le interesan.

Desafortunadamente, no conozco alternativas gráficas o fáciles de usar. Si desea buscarlos, ptracedebe ser una de sus palabras clave de búsqueda.


Sobre el aislamiento, hay muchas tecnologías por ahí. Chroots, contenedores de Linux (que están actualmente en desarrollo e incompletos), la virtualización de software y la paravirtualización son los más utilizados. Sin embargo, este es un tema demasiado grande para discutirlo. Sugeriría abrir una nueva pregunta si desea obtener más detalles.

Andrea Corbellini
fuente
5

Echa un vistazo a AppArmor . Puede agregar un perfil limitado para un ejecutable y ponerlo en modo de "queja", donde se permitirán acciones pero se registrarán, lo que creo que cumple con sus requisitos.

Pero tenga en cuenta que esto no es realmente suficiente. Un binario malicioso inteligente puede detectar que está bajo observación y no realizar acciones maliciosas, excepto cuando no se está observando.

AppArmor va más allá de esto y permite que una aplicación se restrinja para siempre solo a operaciones aprobadas. Las aplicaciones que terminan en el Centro de software de Ubuntu se entregan con los perfiles de AppArmor.

Robie Basak
fuente
5

Como ha identificado, una máquina virtual sería mejor para proporcionar aislamiento, particularmente si tiene razones para creer que un ejecutable es malicioso en primer lugar. Pero incluso esto no es perfecto, ya que las vulnerabilidades en la plataforma de virtualización (tanto de hardware como de software) pueden ser explotadas por código malicioso con el fin de salir. Aquí hay un ejemplo de una vulnerabilidad de virtualización del mundo real: http://www.kb.cert.org/vuls/id/649219

Robie Basak
fuente
1

Podrías crear un complemento .

Los snaps están "confinados del sistema operativo y otras aplicaciones a través de mecanismos de seguridad, pero pueden intercambiar contenido y funciones con otros snaps de acuerdo con políticas específicas controladas por el usuario y los valores predeterminados del sistema operativo". (de http://snapcraft.io/docs/snaps/intro )

Estos proporcionan un mayor aislamiento además de AppArmor, por ejemplo, también con seccomp .

Además, un complemento puede ser autónomo para una fácil distribución y actualizaciones atómicas en su sistema.

Robie Basak
fuente