ruby - ¿Cómo se usa ptrace para un sandbox cuando se ejecuta un código no confiable en Rails?
ruby-on-rails-4 (1)
Supongamos que tengo este código de controlador horrible:
class MovesController < ApplicationController
def create
eval(params[:input])
end
end
He estado buscando una mejor manera de lograr la ejecución de un código no confiable durante algún tiempo y me topé con la discusión en esta característica de ruby-lang: https://bugs.ruby-lang.org/issues/8468
La solución real a este problema es ejecutar un sandbox en el nivel superior a Ruby. Ejecuto código no confiable en http://eval.in dentro de una caja de arena basada en ptrace. Charlie Somerville
Investigaciones adicionales sobre el tema no obtuvieron más que pura documentación de ptrace. ¿Existe alguna práctica / biblioteca conocida para usar ptrace en Ruby and Rails o sería necesario configurar su propia solución?
Hay una gema llamada trusted-sandbox para hacer eso. Pero ten cuidado, porque Docker no es realmente a prueba de hackers.
También hay Geordi utilizado por CodePad .
Hubo una implementación de sandbox (con errores) para ruby 1.8, pero ya no es compatible.
Pero en realidad, tu pregunta es como la vieja broma donde el paciente dice: "Doctor, me duele cuando hago esto". Y el doctor responde "bueno, no hagas eso".
Hay un millón de cosas que podrías hacer en su lugar:
- Use un idioma con caja de arena de primera clase (como Lua).
- Use un lenguaje de plantillas (como líquido o bigote). Escriba su propio analizador para las cosas que realmente deben hacerse.
- Ejecute el "programa" que se ejecuta en el lado del cliente (en javascript o hotruby ) y solo envíe los datos procesados a su servidor.