Explicación de la API de Sandboxed

La API de Sandboxed (SAPI) se basa en el proyecto establecido de Sandbox2. En esta página, se explica la arquitectura de diseño de SAPI y los conceptos clave.

Descripción general

SAPI está diseñado para proporcionar a los desarrolladores herramientas que les permitan preparar bibliotecas C/C++ para zonas de pruebas, además de las APIs necesarias para la comunicación con la versión de zona de pruebas de las bibliotecas C/C++.

En este diagrama, se muestra la arquitectura de una biblioteca C/C++ de zona de pruebas de SAPI:

Diagrama de SAPI

SAPI también proporciona primitivas para la sincronización de memoria manual y automática (según los atributos de puntero personalizados) (arreglos, estructuras) entre las bibliotecas SAPI y el código host.

Por último, una API de Transactions de alto nivel habilita la supervisión de bibliotecas SAPI y las reinicia si fallan (p.ej., debido a infracciones de seguridad, fallas o agotamiento de los recursos).

Sandbox2

Los ingenieros de seguridad de Google desarrollan y mantienen el proyecto de código abierto Sandbox2, que es la tecnología principal de zona de pruebas que usa SAPI. Sandbox2 contiene tres componentes principales: la Política de la zona de pruebas, el Ejecutor y Sandboxee.

Política de zona de pruebas

La política de la zona de pruebas define el entorno de ejecución restringido para la biblioteca de la zona de pruebas. Esto se logra aclarando qué llamadas de sistema se pueden ejecutar. SAPI usa el mismo mecanismo que Sandbox2. Consulta la sección Política de la zona de pruebas y la página de introducción para Sandbox2 si quieres obtener más información sobre cómo diseñar y definir una política de zona de pruebas.

SAPI usa una política predeterminada. Como alternativa, puedes usar una política de zona de pruebas dedicada definiéndola en un archivo de encabezado sandbox.h y pasándola como un argumento en la regla de compilación sapi_library.

Biblioteca de zona de pruebas

Esta es la biblioteca C/C++ de zona de pruebas que se ejecutará en el entorno de zona de pruebas restringido proporcionado por Sandbox2. En última instancia, la biblioteca de la zona de pruebas expone la funcionalidad requerida que puede consumir el código de host.

La biblioteca de la zona de pruebas se compila con la regla de compilación sapi_library, en la que puedes especificar una política de zona de pruebas personalizada que defina el entorno de ejecución restringido. Según la biblioteca, es posible que tengas que escribir código de wrapper o stub (consulta libcurl), pero no se espera que cambies el código fuente de la biblioteca C/C++ mientras preparas la versión SAPI.

Objeto SAPI y stub de RPC

Un objeto SAPI es un objeto de C++ que expone la API de la biblioteca de la zona de pruebas. Desvía las llamadas del código de host al stub de RPC, que está incorporado en la biblioteca SAPI junto con la biblioteca de zona de pruebas.

El sistema de compilación genera automáticamente estos dos elementos con la regla de compilación sapi_library(). SAPI es compatible con dos sistemas de compilación, Bazel y CMake de Google.

Código de host

El código de host es lo que implementa la lógica proporcionada por la biblioteca SAPI. Es lo que, de lo contrario, consumiría la versión no incluida en la zona de pruebas de la biblioteca C/C++. Como tal, el código de host llama a funciones exportadas por la biblioteca SAPI y pasa datos a la zona de pruebas y los recibe de ella.

Se debe adaptar el código de host para usar la biblioteca SAPI. En particular, no es posible llamar a las funciones de la biblioteca porque esta se aloja en un proceso de zona de pruebas separado. Por lo tanto, SAPI proporciona herramientas que crean un objeto SAPI que procesa llamadas de proxy a una biblioteca SAPI.

Conceptos

Reglas de compilación de Bazel

El proyecto SAPI proporciona dos reglas de compilación de Bazel para poner en zona de pruebas una biblioteca C/C++:

  • sapi_library(): crea todas las salidas necesarias para que la biblioteca C/C++ esté protegida como una zona de pruebas de Sandbox2. El resultado de compilación se puede usar como una dependencia de la regla cc_binary() para compilar el objeto binario del código de host.
  • sapi_interface(): Genera automáticamente el encabezado que se puede incluir en el objeto binario del código de host.

Para obtener una explicación más detallada de las reglas de compilación, consulta Reglas de compilación.

Variables

SAPI proporciona una serie de tipos especiales, llamados tipos de API, que recomendamos usar en el código de host. El motivo principal por el que se necesitan los tipos de SAPI es el proceso (y, por lo tanto, la memoria) del aislamiento entre el código de host y la biblioteca de la zona de pruebas.

Para obtener una explicación más detallada de este tema y una descripción general de algunos tipos de SAPI comunes, consulta Variables.

Transacciones

Como se explicó anteriormente, cualquier llamada de la API a una biblioteca de zona de pruebas pasa a través de una capa de RPC. Para poder controlar una falla en esta capa, debes implementar el manejo de errores adecuado. El módulo SAPI Transaction proporciona el mecanismo necesario para garantizar que todas las llamadas a una biblioteca de zona de pruebas se completen sin problemas a nivel de RPC o se muestren con un error relevante.

Para obtener una explicación más detallada de este tema, consulta Transacciones.

Cómo comenzar

Lee nuestra página de introducción para configurar tu primer proyecto de API de Sandboxed.