El diseño de Sandbox2 se basa en tecnologías conocidas y establecidas, un marco de políticas y dos procesos: el ejecutor de zona de pruebas y el Sandboxee.
Tecnologías involucradas
En las siguientes secciones, se describen las tecnologías que conforman la capa de base de Sandbox2.
Espacios de nombres de Linux
Los espacios de nombres de Linux son un intento de proporcionar virtualización a nivel del sistema operativo. Si bien varios espacios de usuario se ejecutan de forma aparentemente independiente entre sí, comparten una sola instancia del kernel. Sandbox2 usa los siguientes tipos de espacios de nombres:
- IPC
- Red (a menos que se inhabilite de forma explícita llamando a
PolicyBuilder::AllowUnrestrictedNetworking()
) - Activación (con una vista personalizada del árbol del sistema de archivos)
- PID
- Usuario
- UTS
Obtén más información sobre los espacios de nombres de Linux en Wikipedia o en la página de manual relacionada.
IPC
Sandbox2 permite intercambiar datos arbitrarios entre el ejecutor de zona de pruebas y el Sandboxee no confiable. Admite mensajes de tipo longitud-valor (TLV), el paso de descriptores de archivos y el intercambio de credenciales a través de tokens y identificadores.
Seccomp-BPF
Sandbox2 se basa en seccomp-bpf, que es una extensión del modo de computación segura (seccomp) que permite usar reglas del filtro de paquetes de Berkeley (BPF) para filtrar llamadas al sistema.
seccomp es una función del 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 al sistema, se finalizará. La extensión seccomp-bpf permite una mayor flexibilidad que seccomp. En lugar de permitir un conjunto fijo de llamadas al sistema, seccomp-bpf ejecuta un programa BPF en los datos de la llamada al sistema y, según el valor de devolución del programa, puede ejecutar la llamada al sistema, omitirla y devolver un valor ficticio, finalizar el proceso, generar un indicador o notificar al tracer.
Ptrace
La llamada al sistema ptrace (seguimiento de procesos) proporciona una funcionalidad que permite que el proceso de seguimiento observe y controle la ejecución del proceso de seguimiento. El proceso del registrador tiene control total sobre el proceso registrado una vez que se adjunta. 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 zona de pruebas es la parte más importante de una zona de pruebas, ya que especifica las acciones que el Sandboxee puede y no puede ejecutar. Una política de zona de pruebas tiene 2 partes:
- Política de llamadas al sistema
- Configuración del espacio de nombres
Política de llamadas al sistema predeterminada
La política predeterminada bloquea las llamadas al sistema que siempre son peligrosas y tiene prioridad sobre la política extendida proporcionada por el usuario.
Política de llamadas al sistema extendida
La política de syscall extendida se puede crear con nuestra clase PolicyBuilder. Esta clase define varias reglas convenientes (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 al sistema o necesitas reglas más complejas, puedes especificar macros de BPF sin procesar con AddPolicyOnSyscall
y AddPolicyOnSyscalls
. El ejemplo de crc4 usa este mecanismo para restringir los argumentos de las llamadas al sistema read
, write
y close
.
En general, cuanto más estricta sea la Política de zona de pruebas, mejor, ya que la política limitará la explotación de cualquier vulnerabilidad presente en el código. Si puedes especificar exactamente qué llamadas al sistema y argumentos se requieren para el funcionamiento normal del programa, cualquier atacante que explote una vulnerabilidad de ejecución de código también estará restringido a los mismos límites.
Una política de zona de pruebas muy estricta podría rechazar todas las llamadas al sistema, excepto las lecturas y escrituras en descriptores de archivos de entrada y salida estándar. Dentro de este entorno de pruebas, un programa podría tomar una entrada, procesarla y devolver el resultado. Sin embargo, si el proceso intentara realizar cualquier otra llamada al sistema, se finalizaría debido a un incumplimiento de política. Por lo tanto, si el proceso se ve comprometido (ejecución de código por parte de un usuario malicioso), no puede hacer nada más nefasto que producir un resultado incorrecto (que el ejecutor y otros aún deben controlar correctamente).
Configuración del espacio de nombres
El objeto PolicyBuilder también se usa para configurar la vista individual del sistema de archivos de un Sandboxee. Se pueden asignar archivos individuales (AddFile
/ AddFileAt
), directorios completos (AddDirectory
/ AddDirectoryAt
) y almacenamiento temporal (AddTmpfs
) al entorno de Sandboxee. Además, AddLibrariesForBinary
se puede usar para asignar automáticamente todas las bibliotecas que necesita el ejecutable vinculado de forma dinámica especificado.
Marcas de línea de comandos
Cualquier política de Sandbox2 se puede inhabilitar especificando una de las siguientes marcas de línea de comandos. Estas marcas están diseñadas para realizar pruebas (p.ej., mientras se refina la política de llamadas al sistema extendidas).
--sandbox2_danger_danger_permit_all
--sandbox2_danger_danger_permit_all_and_log
Ejecutor de zona de pruebas
El ejecutor de zona de pruebas es un proceso que no está aislado. Es el proceso de seguimiento de ptrace que se adjunta a Sandboxee (proceso de seguimiento de ptrace). El ejecutor de zona de pruebas también configura y ejecuta una instancia de Monitor que hace un seguimiento del Sandboxee y proporciona información de estado.
Sandbox2 permite tres modos de ejecución: independiente, servidor de bifurcación de Sandbox2 y servidor de bifurcación personalizado. Si usas un forkserver, el Sandboxee se crea como un proceso secundario del Sandbox Executor. Estos modos se explican en detalle aquí.
Sandboxee
El Sandboxee es el proceso que se ejecuta en el entorno restringido de zona de pruebas que definió la política de zona de pruebas. El ejecutor de zona de pruebas envía la política al Sandboxee a través de IPC. Luego, Sandboxee aplica la política. Cualquier incumplimiento de la política provocará la finalización del proceso, a menos que se configure lo contrario (consulta la Política de zona de pruebas).