Cadena de carga de Lua, lista blanca contra inyección

3

Necesito recibir información del usuario de un poco de matemática, que quieren resolver. En lugar de analizar las entradas yo mismo, solo quiero usar lua, la función loadstring para cargar sus entradas y evaluarlas.

Pero no quiero dejar que ejecuten código abaritario, Así que paso la cadena a través de una lista blanca para asegurarme de que solo usen caracteres matemáticos.

function calc(inputEquationStr)
    local startValid, endValid = string.find(inputEquationStr,"[%(%)%.%^%*%+%-/%d]+")
    if startValid>1 or endValid<string.len(inputEquationStr) then
        print("Error: Input doesn't look like math.")
    else
        local funcStr = "return " .. inputEquation 
        local mathFunction = loadstring(funcStr)
        assert(mathFunction, "Syntax Error, in input")

        print(mathFunction())
    end

end

function calcOuter(inputStr)
    local success, err = pcall(calc, inputStr)
    if not success then
        print("Error : " .. tostring(err))
    end

end

Así que la parte importante, como lo veo, es que en la lista blanca solo se permiten +, -,., *, /, ^, () y dígitos. Lo que se hace con string.find(inputEquationStr,"[%(%)%.%^%*%+%-/%d]+"

¿Esto será suficiente para proteger contra la inyección? ¿Hay algún tipo de camino, como cadenas codificadas en hexadecimal que debo vigilar?

    
pregunta Lyndon White 22.08.2013 - 06:57
fuente

3 respuestas

-2

Hmm, está bien, asumo que estás usando Lua 5.1 (cadena de carga) pero la cadena de carga también exceptúa el bytecode y el bytecode es números. AUGE Bien, déjame suponer que no te preocupa que el usuario haga otra cosa, como hacer que el proceso se cuelgue, y estás usando una caja de arena Lua irrompible; ¿Cómo estás protegiendo el binario? Es muy fácil omitir su cheque o cambiar cualquier código C / Lua inyectando y parcheando eso.

Corta a la persecución: No se moleste en tratar de prevenir la inyección a menos que quiera pasar una cantidad considerable de tiempo jugando al gato y al ratón con una galleta, una galleta que generalmente tiene más tiempo que usted. Pase la mayor parte de su tiempo previniendo la inyección si esta es una preocupación real que le costaría más dinero que solo irse o es de misión crítica.

    
respondido por el Jim 28.08.2013 - 20:56
fuente
1

Recomendaría dedicar un poco de esfuerzo a escribir un analizador para las expresiones aritméticas en la entrada en lugar de ejecutarlo dinámicamente como código Lua. Incluso si no tiene una biblioteca de análisis de terceros disponible, no es demasiado difícil escribir un lexer que divida una cadena en símbolos relevantes, y luego los atraviese con una función de máquina de estado o recursiva.

Las vulnerabilidades de inyección de código remoto son muy serias, y existen muchas posibilidades de ataques: ¿qué sucede si un atacante intenta dividir por cero? ¿O intenta explotar un error en su intérprete Lua? ¿O hace algo raro con las codificaciones de caracteres? ¿O usa alguna característica de lenguaje oscuro en la que no pensaste? Considerar todos estos asuntos es probablemente mucho más trabajo que escribir un analizador para expresiones aritméticas simples.

Incluso si pudieras elegir una lista blanca que hiciera esto completamente seguro, aún podría ser posible que alguna versión futura de Lua presente alguna nueva sintaxis o característica que permita un nuevo ataque en esto.

Otro problema potencial: si desea introducir alguna característica nueva en el futuro (por ejemplo, también permite que los usuarios calculen las raíces cuadradas), deberá eliminar este enfoque y comenzar a crear un analizador de todos modos. o expanda su lista blanca, haciéndola más complicada y, por lo tanto, más insegura.

    
respondido por el AardvarkSoup 29.08.2013 - 22:09
fuente
1

Hace algo que hice algo similar y mi solución fue que configuré el entorno para las funciones matemáticas y eso es todo lo que hay. Si se llama a cualquier otra función, se producirá un error al intentar indexar a cero.

    
respondido por el Creator 24.02.2016 - 22:42
fuente

Lea otras preguntas en las etiquetas