Parece que hay dos fuerzas impulsoras aquí. ¿Qué quiere decirle al usuario final y qué no quiere decirle al atacante? La información más dañina que podría divulgar puede ser cualquier información de tiempo relacionada con la salida de error.
De nuevo, en algunos ataques CSRF los errores pueden ser visibles, mientras que en otros ataques los errores pueden ser suprimidos u ocultos. Eso me haría querer tomar estas acciones en un sitio de alta seguridad:
-
Termine la sesión y cualquier sesión "ascendente" que pueda estar relacionada con OpenID o la federación.
-
Si el usuario ha iniciado sesión con varias pestañas, rediríjalo a una página que les informe:
- Esto puede ser el resultado de una segunda sesión / pestaña de navegación que está abierta.
- Dígale al usuario que o evite que esto vuelva a suceder, cierre todos los navegadores y solo navegue por un sitio a la vez (o use un navegador que admita esta seguridad de forma nativa)
- Lo que sucedió (los chicos malos trataron de hacer xxxx a yyy) (Ten cuidado de no repetir los datos del atacante o, de lo contrario, esto te abre a XSS)
Al principio me gustó la propuesta aquí para ir a una pantalla de "edición" que le permite a un usuario verificar los cambios que se están intentando. Luego pensé en la posibilidad de hacer click-jacking y cómo eso puede eliminar cualquier beneficio de esto. Nuevamente, no quiero habilitar una "característica" no compatible de mi sitio donde los usuarios externos puedan completar previamente un formulario en nombre de alguien. Ofreceré un punto final dedicado para este propósito si se desea.
Otras acciones que me gustan hasta ahora al manejar un error incluyen:
-
Conexiones de aceleración (Thread.Sleep) que encuentran alguna de las siguientes tendencias
- Errores por la fuente de la dirección IP (cuidado si la fuente es un usuario de NAT con miles de máquinas detrás)
- Errores por referencia (cuidado para evitar un DOS en todo el sistema)
- Página de destino (Controlador / Vista) (sí, esto también puede ser DOS)
- Usuario registrado (o usuario anónimo)
Si observa que una combinación de esos factores está causando muchas de sus alertas CSRF, puede reducir la velocidad y acelerar o negar las conexiones hasta que las condiciones mejoren. Una métrica podría ser errores / tiempo.
Aunque la mayoría de las implementaciones permiten una semilla, ASP.NET MVC en particular facilita la implementación de una semilla constante (compilada) en todo el sitio. Este constant
puede animar a los atacantes a tratar de adivinar cuál es tu semilla. Para evitar esto, estoy pegando un código MVC de ASP.NET que soluciona algunos problemas
- Habilita una semilla dinámica
- Un lugar centralizado para iniciar su registro y seguimiento de excepciones desde todos los controladores.
- La prevención de la divulgación criptográfica de Oracle duerme un tiempo fijo antes de que se genere un error y se envíe al cliente. Esto es, por supuesto, inspirado en la mitigación ASP.NET de Scott Gu , con la función adicional de dormir durante una cantidad de tiempo fija frente a una cantidad de tiempo aleatoria.
Para comenzar, busque en este blog para la implementación básica . Luego modifique el método OnAuthorization
como este
protected override void OnAuthorization(AuthorizationContext filterContext)
{
TimeSpan maxSleepDuration = new TimeSpan(0, 0, 0, 0, 700); //Errors will always take 700ms
DateTime timeStart = DateTime.UtcNow;
base.OnAuthorization(filterContext);
string httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride();
if (this._verbs.Verbs.Contains(httpMethodOverride, StringComparer.OrdinalIgnoreCase))
{
try
{
this._validator.OnAuthorization(filterContext);
}
catch (HttpAntiForgeryException e)
{
//todo: Custom actions here? Track the IP? Referrer? Do special actions based on IP?
TimeSpan timespent = DateTime.UtcNow - timeStart;
int sleepDuration = maxSleepDuration.Milliseconds - timespent.Milliseconds;
if (sleepDuration > 0 && sleepDuration != System.Threading.Timeout.Infinite)
System.Threading.Thread.Sleep(sleepDuration);
//todo: Error here, or redirect back to validation screen
throw e;
}
}
}
Por último, es posible que desee verificar su MachineKey no está configurado para generar automáticamente y asegura la rotación de esta clave en su programación de ITOps.