Ataques de tiempo: contra el servidor PHP - Prevención / Tutoriales [duplicado]

-1

¿Cuál es la forma más simple y efectiva de prevenir los ataques de tiempo para los programadores que usan PHP?

Soy un estudiante de secundaria, soy nuevo en programación y he estado aprendiendo Seguridad desde hace unas semanas. Conozco los ataques de Inyección SQL basados en el Tiempo y los Ciegos, y sé cómo se realizan y cómo podemos prevenirlos. Pero, en esta página de documentos PHP explica que la comparación de contraseñas también es vulnerable a ataques de tiempo (cuando se usa '==' operador).

Consideré que cualquier cosa escrita en el backend del servidor con PHP está a salvo de Client Side Perspective pero aquí es el caso totalmente diferente. Los hackers pueden aprovechar los métodos indirectos y adivinar el backend e intentar explotarlo. Dado que no hay muchos tutoriales, cosas, información para leer acerca de cómo se pueden realizar ataques de tiempo contra el script PHP que realiza la comparación de 2 cadenas, quiero saber las cosas que se deben tener en cuenta para evitar este tipo de ataques.

Quiero que contestes estas preguntas.

  1. Si comparo los hashes con md5, ¿será aplicable? (perspectiva practica).
  2. Si es Sí, entonces ¿Hay otras cosas que podrían ser vulnerables aparte de la comparación de cadenas? (ejemplos por favor)
  3. ¿Qué es lo mejor que puedo hacer para evitarlo?
  4. ¿Son estos ataques comunes / sensibles?
  5. Un breve tutorial / script para demostrar cómo funcionan los ataques de sincronización.

Esta pregunta no pregunta qué son los ataques de tiempo, sino cómo se realizan y cómo se pueden prevenir. (solo para servidores en PHP)

gracias :)

    
pregunta Abhas Kumar Sinha 18.10.2018 - 09:54
fuente

1 respuesta

0

1) Un ataque de sincronización MD5 es igual a la dificultad de un ataque de sincronización de texto simple, más un ataque de tabla de arco iris MD5. Simplemente use un ataque de tiempo normal para descubrir los primeros 8-10 bits del MD5 (es fácil generar cadenas cuyos MD5 tienen una secuencia específica de 8-10 bits). Luego, la tabla del arco iris coincide en esos primeros 8-10 bits para obtener un pequeño conjunto de contraseñas. Luego, fuerza bruta esas contraseñas.

2) Cualquier cosa en la que la verificación esté relacionada con el tiempo. Un ejemplo sería una consulta SQL compleja. Si usa una base de datos SQL para verificar la primera entrada y luego otra consulta para verificar la segunda entrada, entonces el atacante podría usar un ataque de tiempo para verificar la validez de la primera entrada antes de adivinar la segunda entrada.

3) Su bucle for debe recorrer todos los caracteres de la respuesta correcta, sin salir si se encuentra un carácter incorrecto o una longitud de entrada. Los compiladores pueden optimizar esto, por lo que quizás desee asegurarse de que se generen efectos secundarios de esta comparación que el compilador no puede optimizar.

4) No, en absoluto. Si su secuencia de comandos PHP realiza alguna llamada al sistema, inmediatamente hará una comparación de cadenas insignificantemente corta. Donde la variación en los tiempos de comparación de cadenas es cientos o miles de veces menor que cualquier otra variación. Simplemente escriba números aleatorios en un archivo al final de la secuencia de comandos y será imposible un ataque de tiempo. Además, si lo hace a través de Internet, un ataque de tiempo es increíblemente inviable. Los tiempos de Internet abarcan cientos de milisegundos y, a veces, incluso segundos. Las comparaciones de cadenas están en los microsegundos bajos, si no en nanosegundos.

5)

Servidor

correct = pwsd.length == ans.length;
for(int i = 0; i < pswd.length && i < ans.length && correct; i++ ) {
    sleep(1); // 1ms
    correct &= pswd[i] == ans[i];
}

Atacante

time = 0ms
guess = 0
while ( time < 0.9ms )
    guess = "A" * randomInt(1, 100)
    time = timeit(execute("Server.exe", guess))
log("LENGTH: ", guess.length)
time = 1ms
while ( time < 1.9ms )
    guess[0] = "A" + randomInt(0, 26)
    time = timeit(execute("Server.exe", guess))
log("First Character: ", guess[0])
time = 2ms
while ( time < 2.9ms )
    guess[1] = "A" + randomInt(0, 26)
    time = timeit(execute("Server.exe", guess))
log("Second Character: ", guess[1])
...

Por supuesto, puede poner el bit time = Xms, while, log("Xth character") en una función y luego para el bucle sobre guess.length . Esto es más útil cuando estás en el mismo sistema y atacas a un binario de Linux que está diseñado para administradores, ya que tienes una excelente precisión de tiempo. Un ejemplo famoso de ataques de tiempo fue Meltdown y Specter, que utilizan los tiempos de caché de la CPU para explotar los datos (las estimaciones correctas son instantáneas, mientras que las fallas de memoria caché tardan un poco).

    
respondido por el Nicholas Pipitone 18.10.2018 - 21:13
fuente

Lea otras preguntas en las etiquetas