tutorial - ¿Cómo ejecutar un código Ruby no confiable dentro de un entorno seguro?
ruby wikipedia (4)
Quiero poder ejecutar código ruby no confiable. Quiero poder pasar variables a dicho código no confiable que pueda usar. También quiero que dicho código me devuelva un resultado. Aquí hay un ejemplo conceptual de lo que estoy pensando
input = "sweet"
output = nil
Thread.start {
$SAFE = 4
#... untrusted code goes here, it uses the input variable(s)
#to calculate some result that it places in the output variable
}
#parse the output variable as a string.
Solo para aclarar, básicamente estoy usando el código que no es de confianza como una función. Quiero proporcionarle algunas entradas y luego permitir que escriba en la salida. Eso es todo lo que realmente quiero, no me importa cómo se hace, solo quiero la capacidad de usar código Ruby no confiable como una especie de función. La solución no tiene que parecerse en nada al código que escribí arriba, solo lo estoy usando para ilustrar lo que quiero.
Ahora, actualmente puedo pensar en 3 maneras de hacer esto:
- Use el constructo de nivel $ SAFE arriba.
- whytheluckystiff tiene un plugin Sandbox para ruby
- Podría ejecutar cada función en su propia máquina virtual, utilizando algún tipo de software de virtualización de os como vmware o Xen o algo así.
Me pregunto si alguien tiene alguna recomendación para ejecutar código ruby no confiable de una manera funcional. ¿Qué opción recomendarías? ¿Cómo lo harías? Gracias.
$ SAFE no es suficiente; necesitas estar al menos al nivel de la caja de arena de Why''s freaky. Sin embargo, no sé si ese código de sandbox se mantiene activamente o si alguna vez resolvió los agujeros como bucles infinitos, etc.
Inseguro generalmente significa hostil. Si puedes relajarte de hostil a, digamos, "ingenuo", y dependiendo de los requisitos de tu aplicación, puedes salirte con Sandboxing en Ruby. No es realmente un escenario de primera clase en el diseño del lenguaje.
Sin embargo, incluso con eso, probablemente no necesite ir al nivel de separación de la máquina. Me sentiría bastante seguro al usar un sandbox en un proceso generado por separado, con tu aplicación funcionando como un administrador de procesos para matar a cualquiera que logre colgar / encender. Ahora, eso es unos pocos órdenes de magnitud más de trabajo que tu simple bloque anterior.
Pero recuerda y sigue repitiendo, "SAFE no puede tratar con hostil".
Recomiendo usar JRuby.
La JVM ha tenido un modelo de seguridad muy sólido incorporado desde el principio, y JRuby se aprovecha de eso. Puede restringir el acceso a archivos, restringir la carga de código y mucho más. Es mucho mejor que cualquier cosa que exista en las implementaciones nativas de Ruby, y hay una serie de sitios que ejecutan sitios de espacio aislado accesibles para el usuario sobre JRuby para este propósito.
Creé una gema llamada ''sandbox confiable'' que ejecuta el código Ruby dentro de un contenedor Docker totalmente controlado. Puede desactivar la red, establecer cuotas de disco, limitar el tiempo de ejecución, equilibrar la CPU con otros contenedores en ejecución, establecer límites de memoria, etc. Y la sobrecarga es bastante baja.
Puede leer más sobre esto aquí: https://github.com/vaharoni/trusted-sandbox
¡Déjame saber lo que piensas!
$SAFE
no lo protege de todo lo que un pirata informático malintencionado podría hacer.
Después de haber recorrido este camino (ver Ruby: ¿crear una evaluación de espacio aislado? ), Seguí los consejos de los comentaristas e incrustó un intérprete específico de la aplicación que me dio control total sobre lo que podía y no podía hacerse (ver Ruby: buscando ruby - intérprete o lenguaje de scripts insertables ).
Resultó ser increíblemente fácil de utilizar (como menos de una hora desde la descarga de la gema a un intérprete personalizado) - ver https://github.com/jcoglan/stickup