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:
- El ejecutor inicia el Sandboxee desde su ruta de acceso al archivo con
::sandbox2::GetDataDependencyFilePath(). - El ejecutor envía la entrada al Sandboxee a través del canal de comunicación
CommsconSendBytes(). - El Sandboxee calcula el CRC4 y envía sus respuestas al ejecutor a través del canal de comunicación
Comms, que lo recibe conRecvUint32().
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:
- El ejecutor inicia el Sandboxee desde su ruta de acceso al archivo con
GetDataDependencyFilepath, al igual que para CRC4. - Configura límites, abre un descriptor de archivo en
/proc/versiony lo marca para que se asigne en el Sandboxee conMapFd. - 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/hostnameCMake + Ninja
cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameGoogle3 (Blaze)
blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostnameMarcas:
--sandbox2tool_resolve_and_add_librariespara 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_envpara conservar las variables de entorno actuales--sandbox2tool_redirect_fd1para recibir el SandboxeeSTDOUT_FILENO (1)y generarlo de forma local--sandbox2tool_cpu_timeoutpara establecer el tiempo de espera de la CPU en segundos--sandbox2tool_walltime_timeoutpara establecer el tiempo de espera del reloj en segundos--sandbox2tool_file_size_creation_limitpara establecer el tamaño máximo de los archivos creados--sandbox2tool_cwdpara 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 deForkingClient::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
NetworkProxyClienty usaNetworkProxyClient::Connectdirectamente.
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).