¿Qué riesgos únicos trae el enlace del modelo MVC a un sitio web? ¿Qué vigilancia adicional se necesita?

11

Por lo que entiendo, "enlace de modelo" es donde un sitio web basado en ASP.NET MVC o Ruby on Rails (hay otros ...) toma parámetros en la declaración GET de HTTP y los pasa como variables para codificar dentro del sitio .

Dado que GitHub (un sitio popular de FOSS para programadores) fue pirateado a través de un modelo de vinculación, me gustaría saber qué prácticas generales son necesarias para cerrar este agujero. Específicamente

  • ¿Qué es el exploit de enlace de modelo?

  • ¿Están afectados todos los marcos MVC?

  • ¿Esto es algo que el desarrollador debe abordar ... o puede un proxy / filtro web corregir esto?

  • ¿Existe alguna herramienta de seguridad que ayude a identificar o diagnosticar este problema en un sitio determinado?

pregunta random65537 06.02.2013 - 04:26
fuente

2 respuestas

5

El enlace de modelo es una característica bastante buena y puede agregar un plus a la seguridad general si se usa correctamente.

Así es como funciona (el código y las características se aplican a ASP.NET MVC pero pueden ser las mismas en Ruby): Supongamos que tiene un formulario en una página web:

<form action="/SendData">

  Email: <input type="text" name="email" id="email"><br>
  Address:<input type="text" name="address" id="address"><br>

  <input type="submit" value="Submit">

</form>

Escribes una clase como esta:

class Contact{
   String Email{get;set;} 
   String Address{get;set;} 
}

Con el enlace de modelo, la función que se ocupa de la solicitud del usuario puede ser:

public ActionResult SendData(Contact contact){
        //do something with contact.Email and contact.Address
}

Como puede ver, el enlace del modelo coloca automáticamente los datos que recibió en la solicitud HTML en un objeto del tipo Contacto.

Además, puede definir funciones de validación mediante el uso de Anotaciones de datos.

class Contact{
   [Required(ErrorMessage="Input email please!")]
   [RegularExpression("^some_regex"),ErrorMessage ="Error"]
   String Email{get;set;} 
   [Required(ErrorMEssage="Input address please!")]
   String Address{get;set;} 
}

y verifíquelo así:

public ActionResult SendData(Contact contact){
    if(ModelState.IsValid)
    {
        //do something with contact.Email and contact.Address
    }
}

Como puede ver, es fácil agregar validación y algunos errores comunes (como pueden evitarse consultas SQL mal escritas).

Ahora, para explicar el problema que llevó al hackeo de GitHub (enlace masivo):

¿Qué sucede si tiene propiedades en su clase que no aparecen en el formulario?

<form action="/SendData">

  Email: <input type="text" name="email" id="email"><br>
  <input type="submit" value="Submit">

</form>

Si un atacante también envía una variable con el nombre dirección , el marco se vinculará automáticamente, sin saber que en la forma original no hubo tal entrada.

En el caso de GitHub , los desarrolladores probablemente usaron un Objeto que tenía una propiedad que diferenciaba entre administradores y usuarios normales ( esAdmin , por ejemplo). Al enviar este parámetro en el formulario de inicio de sesión (u otra página), junto con el usuario y la contraseña, el atacante podría haber accedido a la funcionalidad administrativa.

Hay varias formas de resolver este problema (enlace de lista negra, enlace de lista blanca), pero recomiendo usar Interfaces y Clases que solo contengan las propiedades del formulario (o que tengan el otro atributo marcado como solo lectura ).

Lista blanca ejemplo de enlace:

public ActionResult SendData(
[Bind(Include="Email")]Contact contact)
{
    //...
}

Con respecto a los marcos afectados, probablemente la mayoría de ellos se ven afectados (Ruby y ASP), pero esto no es una vulnerabilidad en sí, es solo una mala programación. Mientras los programadores aborden esta funcionalidad correctamente, todo debería estar bien.

No creo que una herramienta automatizada pueda detectar este tipo de problemas, pero una revisión exhaustiva del código debería resolverlo.

    
respondido por el Dinu S 06.02.2013 - 12:44
fuente
1

Como actualización de los comentarios de Dinu, los modelos en muchos marcos PHP sufren este mismo tipo de cosas. Hay muy pocos que ofrecen "propiedades restringidas" que no se pueden establecer desde la carga. La mayoría de ellos simplemente asume que sabes lo que estás haciendo cuando "cargas ()" los valores en ellos y asignas las propiedades en consecuencia, nuevamente, las prácticas de codificación descuidadas.

Laravel 4 es uno que he visto que ofrece restricciones para ayudar a prevenir problemas de asignación masiva.

    
respondido por el enygma 06.02.2013 - 14:16
fuente

Lea otras preguntas en las etiquetas