Ejemplos

Descripción general

Preparamos algunos ejemplos para demostrar cómo usar Sandbox2 en diferentes situaciones y cómo escribir políticas.

Puedes encontrarlos en //sandboxed_api/sandbox2/examples. Consulta la siguiente información para obtener explicaciones detalladas.

CRC4

El ejemplo de CRC4 es un cálculo intencionalmente con errores de una suma de verificación CRC4, lo que demuestra cómo hacer una zona de pruebas de otro programa y cómo comunicarse con él.

  • crc4bin.cc: Es el programa que queremos incluir en la zona de pruebas (es decir, el Sandboxee).
  • crc4sandbox.cc: El programa de zona de pruebas que lo ejecutará (es decir, el ejecutor).

Cómo funciona:

  1. El ejecutor inicia la zona de pruebas desde su ruta de acceso al archivo con ::sandbox2::GetDataDependencyFilePath().
  2. El ejecutor envía entradas a Sandboxee a través del canal de comunicación Comms mediante SendBytes().
  3. Sandboxee calcula el CRC4 y envía sus respuestas al ejecutor a través del canal de comunicación Comms que lo recibe con RecvUint32().

Si el programa realiza cualquier llamada del sistema que no sea la de comunicación (read() y write()), se cierra debido a un incumplimiento de política.

static

El ejemplo estático muestra cómo almacenar en zona de pruebas un objeto binario vinculado de forma estática, como un objeto binario de terceros para el cual no tienes la fuente, lo que significa que no está al tanto de que estará en una zona de pruebas.

  • static_bin.cc: Sandboxee es un objeto binario de C estático que convierte texto ASCII de entrada estándar a mayúsculas.
  • static_sandbox.cc: es el ejecutor con su política, sus límites y el uso de un descriptor de archivos para la entrada de Sandboxee.

Cómo funciona:

  1. El ejecutor inicia la zona de pruebas desde su ruta de acceso al archivo con GetDataDependencyFilepath, al igual que para CRC4.
  2. Establece límites, abre un descriptor de archivo en /proc/version y lo marca para que se asigne en la zona de pruebas con MapFd.
  3. La política permite que algunas llamadas de sistema (open) muestren un error (ENOENT) en lugar de cerrarse debido a un incumplimiento de política. Esto puede ser útil cuando se realiza una zona de pruebas de un programa de terceros en el que no podemos modificar las llamadas de sistema que se realizan, por lo que, en su lugar, podemos hacer que fallen correctamente.

herramienta

Este ejemplo es tanto una herramienta para desarrollar tus propias políticas y experimentar con las APIs de Sandbox2 como una demostración de sus funciones.

  • sandbox2tool.cc: El ejecutor que demuestra lo siguiente:
    • cómo ejecutar otro objeto binario de zona de pruebas
    • cómo configurar verificaciones del sistema de archivos
    • Cómo el ejecutor puede ejecutar Sandboxee de forma asíncrona para leer su resultado de manera progresiva.

Pruébalo:

Bazel

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

CMake y Ninja

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (Blaze)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

Marcas:

  • --sandbox2tool_resolve_and_add_libraries para resolver y activar las bibliotecas necesarias para Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS> a fin de que los directorios adicionales estén disponibles para la zona de pruebas
  • --sandbox2tool_keep_env para mantener las variables de entorno actuales
  • --sandbox2tool_redirect_fd1 para recibir la STDOUT_FILENO (1) de Sandboxee y generarla de forma local
  • --sandbox2tool_cpu_timeout para establecer el tiempo de espera de la CPU en segundos
  • --sandbox2tool_walltime_timeout para establecer el tiempo de espera en segundos
  • --sandbox2tool_file_size_creation_limit para establecer el tamaño máximo de los archivos creados
  • --sandbox2tool_cwd para configurar el directorio de trabajo actual de la zona de pruebas

custom_fork

En el ejemplo de custom_fork, se muestra cómo crear una zona de pruebas que inicializará el objeto binario y, luego, esperará a que las solicitudes fork() provengan del ejecutor superior.

Este modo ofrece un rendimiento potencialmente mayor con respecto a otros tipos de zonas de pruebas, ya que, en este caso, crear nuevas instancias de Sandboxees no requiere ejecutar nuevos objetos binarios, sino que solo bifurca los existentes.

  • custom_fork_bin.cc: El servidor de bifurcación personalizado, que recibe solicitudes a fork() (a través de Client::WaitAndFork) para generar nuevos Sandboxees
  • custom_fork_sandbox.cc: Es el ejecutor, que inicia un servidor de bifurcación personalizado. Luego, le envía solicitudes (mediante nuevos ejecutores) para generar (a través de fork()) nuevos Sandboxees.

red

El espacio de nombres de red, que está habilitado de forma predeterminada, evita que el proceso de la zona de pruebas se conecte con el mundo exterior. En este ejemplo, se muestra cómo abordar este problema.

Se inicializa una conexión dentro del ejecutor y el socket resultante se pasa a través de ::sandbox2::Comms::SendFD(). Sandboxee recibe el socket mediante ::sandbox2::Comms::RecvFD() y, luego, puede usar este socket para intercambiar los datos como de costumbre.

  • network_bin.cc: Es el programa que queremos incluir en la zona de pruebas (es decir, el Sandboxee).
  • network_sandbox.cc: Es el programa de zona de pruebas que lo ejecutará (es decir, el ejecutor).

network_proxy

En este ejemplo, se muestra una forma alternativa de tratar un espacio de nombres de red. A nivel interno, funciona exactamente igual que en el ejemplo anterior, pero se expone como una API más conveniente.

Sandboxee puede establecer una conexión de red de 2 maneras diferentes:

  • automático: instala un controlador automático y, luego, emite llamadas de conexión frecuentes.
  • manual: Obtén un NetworkProxyClient y usa NetworkProxyClient::Connect de forma directa.

En este ejemplo, se muestran ambos métodos. El modo automático se usa cuando se configura la marca connect_with_handler; de lo contrario, se usa el modo manual.

  • network_bin.cc: Es el programa que queremos incluir en la zona de pruebas (es decir, el Sandboxee).
  • network_sandbox.cc: El programa de zona de pruebas que lo ejecutará (el ejecutor).