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.