¿Cómo debe responder una página web a un ataque CSRF?

10

Sé que utilizas tokens para prevenir CSRF, pero ¿cómo debería responder la página receptora cuando es atacada? ¿Debería fallar en silencio, fingiendo que la transacción fue exitosa? ¿Mostrar un mensaje de error? ¿Registrar el ataque?

Por favor, explique su razonamiento para su respuesta, ya que me gustaría entender el por qué detrás de una mejor práctica.

Editar :

Algunas de las respuestas hasta ahora parecen recomendar que los usuarios reciban un mensaje de error de algún tipo. Una parte en la que no pensé cuando hice esta pregunta es la posibilidad de falsos positivos. Quizás no estoy siendo lo suficientemente imaginativo, pero me cuesta mucho crear un escenario en el que un usuario legítimo se confunda con un ataque CSRF en el curso del uso normal de un sitio web. ¿Alguien puede explicar cómo esto podría suceder? ¿Cómo aparecería el mensaje de error CSRF si un CSRF no estuviera realmente en progreso?

Si un usuario puede desencadenar accidentalmente un mensaje de error CSRF visible, supongo que puedo ver el punto, pero si no puede, no estoy seguro de por qué querría mostrar uno. Es de suponer que el atacante sabría que está atacando, por lo que darles un mensaje de error parece inútil o darles más información de la que deberían tener. Si alguien pudiera aclarar, me ayudaría a entenderlo mejor.

    
pregunta VirtuosiMedia 28.10.2011 - 07:48
fuente

3 respuestas

5

En caso de que esté utilizando una solución de token secreto para contrarrestar los ataques CSRF. Puede haber muchas estrategias de respuesta en caso de que no reciba el token secreto en su solicitud donde lo esperaba (no entraré cuando debería incluir / excluir los tokens). Necesita mantener un equilibrio entre la usabilidad y la seguridad

Algunas de las posibles respuestas al usuario pueden ser

  • Invalide la sesión y lleve al usuario a la página de caducidad de la sesión genérica. Esta página puede ser común para tiempo inactivo, uso del botón de retroceso / actualización, etc. Debe considerarse para sitios web como transacciones, manejo de datos muy confidenciales, etc.

  • No invalide la sesión, solicite al usuario que ingrese la contraseña

  • Redirige al usuario a una página de confirmación antes de procesar la solicitud

En todos los casos, debe registrar esto como un evento de seguridad.

    
respondido por el Sachin Kumar 28.10.2011 - 09:56
fuente
4

Por lo general, recomiendo que todas las excepciones y errores muestren una página de error estándar, y no debería revelar por qué ocurrió el error / excepción, o cuál fue el error. Registre el error y proporcione al usuario el número de transacción de registro.

La razón por la que no revelaría lo que sucedió, es decir, esta acción fue rechazada debido a un posible ataque de CSRF, es que el atacante obtiene información sobre cómo protege el sitio contra tal ataque. (Por supuesto, en el caso específico de CSRF, esto se revela por la presencia de tokens, pero creo que no debería revelar más información de la que sea absolutamente necesaria en cualquier caso)

    
respondido por el efr4k 28.10.2011 - 09:24
fuente
1

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.

    
respondido por el random65537 05.11.2011 - 06:03
fuente

Lea otras preguntas en las etiquetas