Cómo montar un entorno aislado usando SELinux Sandbox


En algunas ocasiones (investigaciones de informática forense por ejemplo) necesitarás tener a la mano un entorno sandbox aislado para poder ver cómo se comportan ciertas aplicaciones/scripts y/o procesos sospechosos. Una máquina virtual y/o linux container pueden parecer útiles en estos casos (y muchas veces lo son) pero... ¿No sería mejor si pudiéramos tener un asistente que nos mostrara los comportamientos inesperados de las aplicaciones aisladas según se presenten? Si bien existen alternativas para tener un entorno sandbox funcional en Linux (como Glimpse según nos comentan los chicos de +Usemos Linux) Esto del sandboxing se puede lograr mediante SELinux también en sistemas que lo tengan disponible (Fedora, CentOS, RHEL y/o derivadas); sin necesidad de instalar ningún software adicional (más que paquetes propios de SELinux) en nuestros sistemas.

Relevante:
TUTORIAL: ¿Cómo c*rajo se usa SELinux?


NOTA: En este tutorial me basaré en Fedora Linux como distro de referencia, cambiar los comandos de instalación por los pertinentes según sea el caso.

Nos aseguramos de que SELinux esté activado en nuestro sistema con el comando getenforce (que nos debería regresar Enforcing); y después proseguimos...

1) Instalando utilidades

# dnf -y install selinux-policy-sandbox policycoreutils-sandbox xterm firefox

2) Creando árbol de directorios

Luego crearemos la estructura de directorios necesaria para nuestro sandbox con el siguiente comando:

$ mkdir -p ~/sandbox/home && mkdir -p ~/sandbox/tmp

3) Inicializando el sandbox


Limpiamos todas las alertas en el Asistente de alertas de SELinux (como se ve en la imagen de arriba) y después corremos:

$ cd ~/sandbox
$ sandbox -X -W gnome-session-classic -w 1024x768 -H home -T tmp -t sandbox_web_t xterm

Las cosas como siguen:

  • -X: Especifica que queremos un sandbox con capacidades de display gráfico.
  • -W: Establece el gestor de ventanas a usar
  • -w: Establece el tamaño de la ventana del sandbox 
  • -H: Establece el directorio home a usar para el sandbox
  • -T: Establece el directorio tmp a usar para el sandbox
  • -t: Establece el tipo de sandbox a usar
  • xterm: es el comando a lanzar

Para conocer más acerca del uso del comando sandbox, usa el comando:

$ man sandbox

3.1) Explicación

La razón por la que inicializo mi sandbox así es por que por medio de xterm puedo lanzar otros programas, y gracias a la sesión clásica de gnome (usa mutter en el backend me parece) puedo manipular las ventanas hasta cierto punto. Uso el tipo de sandbox sandbox_web_t para poder usar firefox y otros programas que naveguen la web, pero hasta ahí. El resto de acceso a Internet está prohibido.

Según sea el caso puedo inicializar el sandbox de un modo u otro, pero este es mi favorito porque me permite tener lo más cercano a una máquina virtual dentro de un contexto aislado que está siendo constantemente monitoreado por SELinux. De esta manera puedo revisar código malicioso, ejecutarlo e investigar en internet sobre él sin problemas.

4) Configurar Sandbox


Tras inicializar tu sandbox de esta manera no pasará nada, pero empezarán a saltar alertas en el asistente de alertas de SELinux, mismo que deberás monitorear para saber qué debes permitir de manera que puedas lanzar un sandbox lo más limitado (pero útil) posible, tal y como veremos a continuación:


En este caso la primera alerta se refiere al display gráfico que usan los sandboxes (Xephyr), así que tenemos que permitirle realizar su trabajo con:

# grep Xephyr /var/log/audit/audit.log | audit2allow -M xephyr
# semodule -i xephyr.pp

Nótese cómo hice exactamente lo mismo que el asistente de alertas me recomendó, sólo cambié el nombre de la póliza para diferenciarla de otras que vamos a habilitar más adelante.

Si volvemos a tratar de inicializar nuestro sandbox con el comando:

$ sandbox -X -W gnome-session-classic -w 1024x768 -H home -T tmp -t sandbox_web_t xterm

veremos que esta vez sí arranca:


Aquí yo tengo ZSH configurado so xterm me está pidiendo un curso de acción para la nueva inicialización, elijo 0 y tengo un entorno de terminal funcional desde donde puedo ahora correr el comando:

$ nohup firefox >/dev/null 2>&1&

Lo que me lanzará una ventana de firefox, en la que (sin importar los errores de conexión), debo abrir 2 páginas, una http y una https respectivamente, por ejemplo:



Esto hará saltar alertas de SELinux porque firefox intentó conectarse a la web por medio de HTTP y HTTPS respectivamente y ahora tenemos la información necesaria para permitirle dicho comportamiento dentro de un sandbox  (si no, ¿qué utilidad tiene?):


Ese número que ven ahí es el "nombre" de firefox para SELinux, no me pregunten porqué... Tengo 1 alerta para el puerto 80 (HTTP) y una para el 443 (HTTPS); so ahora puedo hacer:

# grep 536F636B657420546872656164 /var/log/audit/audit.log | audit2allow -M firefox
# semodule -i firefox.pp

NOTA: Esta política sólo el permitirá el acceso a la web a firefox y a ningún otro programa en el sandbox.

Y entonces Firefox:


Es muy importante el no añadir excepciones y/o generar políticas para aplicaciones y/o procesos que no son absolutamente necesarios o que no sabemos con certeza porqué lo están pidiendo, de otra manera el sandboxing pierde sentido.

5) Utilizando el Sandbox

Al momento de realizar una investigación, el Asistente de alertas de SELinux será nuestro mejor amigo explicándonos paso a paso las cosas sospechosas que suceden dentro del sandbox diseccionando un@ por un@ cada petición o movimiento que hagan los procesos y/o aplicaciones, impidiendo incluso varios comportamientos por defecto permitidos (como ya vimos en el caso de firefox y el acceso a la web) ya que el entorno está sumamente controlado:


Si quisiera utilizar/analizar archivos sospechosos sin poner en riesgo mi equipo enterándome a cada paso de lo que hacen al ejecutarlos o algo similar, simplemente los copio a la carpeta home de mi sandbox y si lanzo nautilus (por ejemplo) con:

$ nohup nautilus >/dev/null 2>&1&

Los podré ver ahí:


Listo, con esto concluimos el tutorial de SELinux Sandbox. Espero les haya resultado útil y si es así, ahí arriba (Justo debajo del título del post) hay un botón de ChangeTip para que nos envíen una propina Bitcoin ;) Muchas gracias por leernos.