He estado trabajando en un proyecto personal en C # cuyo propósito es más o menos permitir al usuario ejecutar scripts escritos por otros usuarios y restringir los permisos de ese script. Mi programa compila los scripts con una biblioteca de terceros, los guarda con los mecanismos de seguridad de acceso al código .NET y se asegura de que solo tengan los permisos que el usuario desea otorgarles.
En términos generales, mis requisitos de seguridad son:
- el usuario debe poder restringir el acceso del script no confiable a solo ciertas partes del sistema de archivos, incluida la prohibición de todo acceso al sistema de archivos
- el usuario debe poder restringir las conexiones de red del script no confiable a ciertas direcciones IP o nombres de host, incluida la prohibición de todas las conexiones de red
- está bien si la secuencia de comandos de usuario logra bloquear o finalizar la aplicación host, pero la secuencia de comandos de usuario no debe ser capaz de eludir las restricciones de permisos (es decir, la denegación de servicio está bien, el incumplimiento no lo es)
Estoy contemplando intentar hacer algo similar en C ++, como una especie de ejercicio personal. Obviamente, las cosas son más complicadas cuando se ejecuta código nativo directamente, incluso si los scripts de usuario están escritos en un lenguaje de scripting como Lua.
El primer enfoque que se me ocurre es insertar mis propios ganchos en las funciones de biblioteca estándar de los entornos de secuencias de comandos. Por ejemplo, si el lenguaje de script es Lua, en lugar de exponer io.open normalmente, tendría que exponer un contenedor que verificara los argumentos contra los permisos del script antes de pasarlos a la implementación original.
Mi preocupación con este enfoque es que aumenta drásticamente la cantidad de mi propio código que está a cargo de la seguridad y, por lo tanto, una posible vulnerabilidad de seguridad que escribí yo mismo. En otras palabras, cuando trabajo con .NET CAS, puedo confiar en que Microsoft hizo bien su trabajo en el código de sandboxing, en lugar de tener que confiar en mi propio código de sandboxing.
¿Hay alguna alternativa que desconozca?