Investigadores de la Universidad de Stanford, la Universidad de California en San Diego y la Universidad de Texas en Austin un conjunto de herramientas , que puede ser utilizado como un nivel adicional de aislamiento para bloquear vulnerabilidades en bibliotecas de funciones. RLBox está diseñado para abordar el problema de la seguridad de bibliotecas de terceros no confiables, que no están bajo el control de los desarrolladores, pero cuyas vulnerabilidades pueden comprometer el proyecto principal.
La compañía Mozilla implementar RLBox en las versiones de Linux de Firefox 74 y en las versiones de macOS de Firefox 75 para aislar la ejecución de la biblioteca , responsable del renderizado de fuentes. Además, RLBox no es específico de Firefox y puede aplicarse para aislar cualquier biblioteca en proyectos arbitrarios. RLBox bajo la licencia MIT. Actualmente, RLBox es compatible con plataformas Linux y macOS, y se espera soporte para Windows más adelante.
el funcionamiento de RLBox se basa en compilar código C/C++ de la biblioteca aislada a un código intermedio de bajo nivel de WebAssembly, que luego se presenta en forma de un módulo WebAssembly, cuyos permisos están restringidos a este módulo (por ejemplo, una biblioteca para el procesamiento de cadenas no podrá abrir un socket de red o un archivo). La conversión de código C/C++ a WebAssembly se realiza mediante .
Para la ejecución directa, el módulo WebAssembly se compila a código máquina mediante el compilador y se ejecuta en un 'nanoproceso' separado, aislado del resto de la memoria de la aplicación. El compilador Lucet se basa en el mismo código que el motor JIT , utilizado en Firefox para la ejecución de WebAssembly.
El módulo compilado opera en un área de memoria separada y no tiene acceso al resto del espacio de direcciones. En caso de explotación de una vulnerabilidad en la biblioteca, el atacante estará limitado y no podrá acceder a las áreas de memoria del proceso principal o transferir el control fuera del entorno aislado.
Se proporciona a los desarrolladores una interfaz de alto nivel , que permite llamar a funciones de la biblioteca en modo aislado. Los manejadores de WebAssembly requieren casi ningún recurso adicional y la interacción con ellos no es significativamente más lenta que la llamada a funciones normales (las funciones de la biblioteca se ejecutan en forma de código nativo, y los costos adicionales solo ocurren al copiar y verificar datos en el proceso de interacción con el entorno aislado). Las funciones de la biblioteca aislada no se pueden llamar directamente y para acceder a ellas es necesario utilizar
la capa invoke_sandbox_function().
A su vez, si se necesitan llamar a funciones externas desde la biblioteca, estas funciones deben definirse explícitamente mediante el método register_callback (por defecto, RLBox proporciona acceso a las funciones ). Para asegurar un funcionamiento seguro con la memoria (memory safety), la mera aislamiento de la ejecución del código no es suficiente y también se necesita asegurar la verificación de los flujos de datos devueltos.
Los valores formados en el entorno aislado se marcan como no confiables, se limitan mediante y requieren y copia en la memoria de la aplicación.
Sin limpieza, intentar usar datos tainted en un contexto que requiera datos normales (y viceversa) resulta en la generación de errores en la fase de compilación. Los argumentos pequeños de las funciones, los valores devueltos y las estructuras se trasladan mediante copia entre la memoria del proceso y la memoria del entorno aislado. Para grandes conjuntos de datos, se reserva memoria en el entorno aislado, y al proceso principal se le devuelve un puntero directo 'sandbox-reference'.
Fuente: opennet.ru
