Explicación de Sandbox2

El diseño de la Zona de Pruebas 2 se basa en tecnologías reconocidas y establecidas, un marco de políticas y dos procesos: el Ejecutor de la Zona de Pruebas y la Zona de Pruebas.

Tecnologías involucradas

En las siguientes secciones, se abordan las tecnologías que crean la capa base para Sandbox2.

Espacios de nombres de Linux

Los espacios de nombres de Linux son un intento de proporcionar virtualización al nivel del sistema operativo. Si bien varios espacios de usuario se ejecutan aparentemente de manera independiente, comparten una sola instancia de kernel. Sandbox2 usa los siguientes tipos de espacios de nombres:

  • IPC
  • Red (a menos que se inhabilite explícitamente mediante una llamada a PolicyBuilder::AllowUnrestrictedNetworking())
  • Activar (con una vista personalizada del árbol del sistema de archivos)
  • PID
  • Usuario (a menos que se inhabilite explícitamente mediante una llamada a PolicyBuilder::AllowUnsafeKeepCapabilities())
  • UTS

Obtén más información sobre los espacios de nombres de Linux en Wikipedia o en la página man relacionada.

IPC

Sandbox2 permite intercambiar datos arbitrarios entre el ejecutor de la zona de pruebas y la zona de pruebas que no es de confianza. Admite mensajes de tipo, longitud y valor (TLV), la transferencia de descriptores de archivo y el intercambio de credenciales a través de tokens y controladores.

Seccomp-BPF

Sandbox2 se basa en seccomp-bpf, que es una extensión del Modo de procesamiento seguro (seccomp) que permite usar las reglas del filtro de paquetes de Berkeley (BPF) para filtrar llamadas del sistema.

seccomp es una instalación de kernel de Linux que restringe las llamadas al sistema de un proceso para permitir solo exit, sigreturn, read y write. Si un proceso intenta ejecutar otra llamada de sistema, se finalizará. La extensión seccomp-bpf ofrece una mayor flexibilidad que seccomp. En lugar de permitir un conjunto fijo de llamadas de sistema, seccomp-bpf ejecuta un programa de BPF en los datos de llamadas de sistema y, según el valor de retorno del programa, puede ejecutar la llamada de sistema, omitirla y mostrar un valor ficticio, finalizar el proceso, generar una señal o notificar al rastreador.

Ptrace

La llamada de sistema ptrace (seguimiento del proceso) proporciona una funcionalidad que permite que el proceso de seguimiento observe y controle la ejecución del proceso de seguimiento. Una vez adjuntado, el proceso del rastreador tiene control total sobre el seguimiento. Obtén más información sobre ptrace en Wikipedia o en la página man relacionada.

Política de zona de pruebas

La política de la zona de pruebas es la parte más importante de una zona de pruebas, ya que especifica las acciones que la zona de pruebas puede y no puede ejecutar. La política de zona de pruebas consta de 2 partes:

  • Política de Syscall
  • Configuración del espacio de nombres

Política de Syscall predeterminada

La política predeterminada bloquea las llamadas del sistema que siempre son peligrosas y tiene prioridad sobre la política extendida que proporciona el usuario.

Política extendida de Syscall

La política de syscall extendida se puede crear con nuestra clase PolicyBuilder. Esta clase define una serie de reglas de conveniencia (p.ej., AllowStaticStartup, AllowDynamicStartup, AllowOpen) que se pueden usar para mejorar la legibilidad de tu política.

Si deseas restringir aún más las llamadas del sistema o necesitas reglas más complejas, puedes especificar macros de BPF sin procesar con AddPolicyOnSyscall y AddPolicyOnSyscalls. En el ejemplo de crc4, se usa este mecanismo para restringir los argumentos para las llamadas de sistema read, write y close.

En general, cuanto más estricta sea la política de zona de pruebas, mejor será porque la política limitará la explotación de cualquier vulnerabilidad presente en el código. Si puedes especificar con exactitud qué llamadas de sistema y argumentos se requieren para el funcionamiento normal del programa, cualquier atacante que se aproveche de una vulnerabilidad de ejecución de código también tendrá los mismos límites.

Una política de zona de pruebas realmente estricta podría rechazar todas las llamadas del sistema, excepto las operaciones de lectura y escritura en descriptores de archivos de entrada y salida estándar. Dentro de esta zona de pruebas, un programa puede tomar entradas, procesarlas y devolver el resultado. Sin embargo, si el proceso intenta realizar cualquier otra llamada de sistema, se finalizará debido a un incumplimiento de política. Por lo tanto, si el proceso se ve comprometido (ejecución del código por parte de un usuario malicioso), no puede hacer nada más infame que producir resultados incorrectos (que el ejecutor y otros deben manejar correctamente).

Configuración del espacio de nombres

El objeto PolicyBuilder también se usa para configurar la vista individual de Sandboxee del sistema de archivos. Al entorno de Sandboxee, se pueden asignar archivos individuales (AddFile / AddFileAt), directorios completos (AddDirectory / AddDirectoryAt) y almacenamiento temporal (AddTmpfs). Además, se puede usar AddLibrariesForBinary para asignar automáticamente todas las bibliotecas que necesita el ejecutable especificado de forma dinámica.

Marcas de línea de comandos

Se puede inhabilitar cualquier política de Sandbox2 especificando una de las siguientes marcas de línea de comandos. Estas marcas están diseñadas para realizar pruebas (p.ej., al definir mejor la Política de Syscall Extendida).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Ejecutor de la zona de pruebas

El ejecutor de zona de pruebas es un proceso que no es una zona de pruebas en sí. Es el proceso de seguimiento de ptrace que se vincula a Sandboxee (proceso de seguimiento de ptrace). El ejecutor de la zona de pruebas también configura y ejecuta una instancia de Supervisión que realiza un seguimiento de Sandboxee y proporciona información de estado.

Sandbox2 permite tres modos de ejecución: Independiente, Forkserver de Sandbox2 y Forkserver personalizado. Si usas un forkserver, la zona de pruebas se crea como un proceso secundario del ejecutor de la zona de pruebas. Estos modos se explican en detalle aquí.

Zona de pruebas

La zona de pruebas es el proceso que se ejecuta en el entorno restringido de zona de pruebas definido por la política de la zona de pruebas. El ejecutor de la zona de pruebas envía la política a la instancia de Sandboxee a través de IPC. Luego, Sandboxee aplica la política. Cualquier incumplimiento de la política dará lugar a la finalización del proceso, a menos que se configure de otra manera (consulta la Política de la zona de pruebas).