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 defectuoso de una suma de verificación CRC4, que demuestra cómo colocar otro programa en la zona de pruebas y cómo comunicarse con él.

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

Cómo funciona:

  1. El ejecutor inicia el Sandboxee desde su ruta de acceso al archivo con ::sandbox2::GetDataDependencyFilePath().
  2. El ejecutor envía la entrada al Sandboxee a través del canal de comunicación Comms con SendBytes().
  3. El 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 alguna llamada al sistema que no sea la comunicación (read() y write()), se finaliza debido a un incumplimiento de política.

static

El ejemplo estático muestra cómo colocar en la zona de pruebas un objeto binario vinculado de forma estática, como un objeto binario de terceros para el que no tienes la fuente, lo que significa que no sabe que se colocará en la zona de pruebas.

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

Cómo funciona:

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

tool

El ejemplo de herramienta es una herramienta para desarrollar tus propias políticas y experimentar con las APIs de Sandbox2, además de una demostración de sus funciones.

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

Pruébalo tú mismo:

Bazel

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

CMake + 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 requeridas para el Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS> para que los directorios adicionales estén disponibles para el Sandboxee
  • --sandbox2tool_keep_env para conservar las variables de entorno actuales
  • --sandbox2tool_redirect_fd1 para recibir el Sandboxee STDOUT_FILENO (1) y generarlo 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 del reloj en segundos
  • --sandbox2tool_file_size_creation_limit para establecer el tamaño máximo de los archivos creados
  • --sandbox2tool_cwd para establecer 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á las solicitudes fork() que provengan del ejecutor superior.

Este modo ofrece un rendimiento potencialmente mayor en comparación con otros tipos de zonas de pruebas, ya que, aquí, la creación de instancias nuevas de Sandboxees no requiere la ejecución de objetos binarios nuevos, solo la bifurcación de los existentes.

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

red

El espacio de nombres de red, que está habilitado de forma predeterminada, impide que el proceso en 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(). El Sandboxee recibe el socket con ::sandbox2::Comms::RecvFD() y, luego, puede usarlo para intercambiar los datos como de costumbre.

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

network_proxy

En este ejemplo, se muestra una forma alternativa de abordar un espacio de nombres de red. Internamente, funciona exactamente de la misma manera que el ejemplo anterior, pero se expone como una API más conveniente.

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

  • Automática : Para ello, instala un controlador automático y, luego, emite llamadas de conexión regulares.
  • Manual : Para ello, obtén un NetworkProxyClient y usa NetworkProxyClient::Connect directamente.

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

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