stringtranslate.com

Ataque de tiempo

Un ejemplo de un ataque de sincronización que se lleva a cabo en la memoria caché web . El gráfico de la izquierda muestra un caso en el que el ataque de sincronización logra detectar una imagen almacenada en caché, mientras que el de la derecha no puede hacer lo mismo.

En criptografía , un ataque de tiempo es un ataque de canal lateral en el que el atacante intenta comprometer un criptosistema analizando el tiempo que lleva ejecutar algoritmos criptográficos. Cada operación lógica en una computadora lleva tiempo para ejecutarse, y el tiempo puede variar según la entrada; con mediciones precisas del tiempo para cada operación, un atacante puede trabajar hacia atrás hasta la entrada. Encontrar secretos a través de la información de tiempo puede ser significativamente más fácil que usar el criptoanálisis de pares conocidos de texto simple y texto cifrado. A veces, la información de tiempo se combina con el criptoanálisis para aumentar la tasa de fuga de información. [1]

La información puede filtrarse de un sistema a través de la medición del tiempo que lleva responder a ciertas consultas. La ayuda que esta información pueda brindar a un atacante depende de muchas variables: el diseño del sistema criptográfico, la CPU que ejecuta el sistema, los algoritmos utilizados, diversos detalles de implementación, contramedidas para ataques de tiempo, la precisión de las mediciones de tiempo, etc. Los ataques de tiempo se pueden aplicar a cualquier algoritmo que tenga una variación de tiempo dependiente de los datos. Eliminar las dependencias de tiempo es difícil en algunos algoritmos que utilizan operaciones de bajo nivel que frecuentemente presentan un tiempo de ejecución variado.

Los ataques de tiempo suelen pasarse por alto en la fase de diseño porque dependen en gran medida de la implementación y pueden introducirse de forma no intencionada con optimizaciones del compilador . Para evitarlos, es necesario diseñar funciones de tiempo constante y realizar pruebas cuidadosas del código ejecutable final. [1]

Evitación

Muchos algoritmos criptográficos pueden implementarse (o enmascararse mediante un proxy) de una manera que reduzca o elimine la información de tiempo dependiente de los datos, un algoritmo de tiempo constante . Considere una implementación en la que cada llamada a una subrutina siempre regresa exactamente en x segundos, donde x es el tiempo máximo que toma ejecutar esa rutina en cada entrada autorizada posible. En una implementación de este tipo, es menos probable que el tiempo del algoritmo filtre información sobre los datos suministrados a esa invocación. [2] La desventaja de este enfoque es que el tiempo utilizado para todas las ejecuciones se convierte en el del peor caso de rendimiento de la función.

La dependencia de los datos de la sincronización puede deberse a uno de los siguientes factores: [1]

Ejemplos

El tiempo de ejecución del algoritmo de elevar al cuadrado y multiplicar utilizado en la exponenciación modular depende linealmente de la cantidad de bits "1" en la clave. Si bien la cantidad de bits "1" por sí sola no es suficiente información para facilitar la búsqueda de la clave, se pueden utilizar ejecuciones repetidas con la misma clave y diferentes entradas para realizar un análisis de correlación estadística de la información de tiempo para recuperar la clave por completo, incluso por parte de un atacante pasivo. Las mediciones de tiempo observadas a menudo incluyen ruido (de fuentes como la latencia de la red o las diferencias de acceso a la unidad de disco de un acceso a otro y las técnicas de corrección de errores utilizadas para recuperarse de los errores de transmisión). Sin embargo, los ataques de tiempo son prácticos contra varios algoritmos de cifrado, incluidos RSA , ElGamal y el algoritmo de firma digital .

En 2003, Boneh y Brumley demostraron un ataque práctico basado en la red contra servidores web habilitados para SSL , basándose en una vulnerabilidad diferente relacionada con el uso de RSA con optimizaciones del teorema del resto chino . La distancia real de la red era pequeña en sus experimentos, pero el ataque recuperó con éxito una clave privada del servidor en cuestión de horas. Esta demostración condujo a la implementación y el uso generalizados de técnicas de cegamiento en implementaciones de SSL. En este contexto, el cegamiento tiene como objetivo eliminar las correlaciones entre la clave y el tiempo de cifrado. [3]

Algunas versiones de Unix utilizan una implementación relativamente costosa de la función de biblioteca crypt para convertir una contraseña de 8 caracteres en una cadena de 11 caracteres. En hardware más antiguo, este cálculo llevaba un tiempo deliberadamente largo: hasta dos o tres segundos en algunos casos. [ cita requerida ] El programa de inicio de sesión en las primeras versiones de Unix ejecutaba la función crypt solo cuando el sistema reconocía el nombre de inicio de sesión. Esto filtraba información a través del tiempo sobre la validez del nombre de inicio de sesión, incluso cuando la contraseña era incorrecta. Un atacante podría aprovechar estas filtraciones aplicando primero la fuerza bruta para producir una lista de nombres de inicio de sesión que se sabe que son válidos, y luego intentar obtener acceso combinando solo estos nombres con un gran conjunto de contraseñas que se sabe que se usan con frecuencia. Sin ninguna información sobre la validez de los nombres de inicio de sesión, el tiempo necesario para ejecutar tal enfoque aumentaría en órdenes de magnitud, volviéndolo efectivamente inútil. Las versiones posteriores de Unix han solucionado esta filtración ejecutando siempre la función crypt, independientemente de la validez del nombre de inicio de sesión. [ cita requerida ]

Dos procesos que de otro modo estarían aislados de forma segura y se ejecutan en un único sistema con memoria caché o memoria virtual pueden comunicarse provocando deliberadamente errores de página o de caché en un proceso y, a continuación, supervisando los cambios resultantes en los tiempos de acceso del otro. Del mismo modo, si una aplicación es confiable, pero su paginación/almacenamiento en caché se ve afectado por la lógica de ramificación, es posible que una segunda aplicación determine los valores de los datos en comparación con la condición de ramificación supervisando los cambios en los tiempos de acceso; en ejemplos extremos, esto puede permitir la recuperación de bits de clave criptográfica. [4] [5]

Los ataques Meltdown y Spectre de 2017 , que obligaron a los fabricantes de CPU (incluidos Intel, AMD, ARM e IBM) a rediseñar sus CPU, se basan en ataques de sincronización. [6] A principios de 2018, casi todos los sistemas informáticos del mundo se ven afectados por Spectre. [7] [8] [9]

Los ataques de sincronización son difíciles de prevenir y, a menudo, se pueden utilizar para extender otros ataques. Por ejemplo, en 2018, se redescubrió un antiguo ataque a RSA en una variante de canal lateral de sincronización, dos décadas después del error original. [10]

Algoritmo

El siguiente código C demuestra una comparación de cadenas insegura típica que detiene la prueba tan pronto como un carácter no coincide. Por ejemplo, al comparar "ABCDE" con "ABxDE", devolverá el resultado después de 3 iteraciones del bucle:

bool insecureStringCompare ( const void * a , const void * b , tamaño_t longitud ) { const char * ca = a , * cb = b ; para ( tamaño_t i = 0 ; i < longitud ; i ++ ) si ( ca [ i ] != cb [ i ]) devuelve falso ; devuelve verdadero ; }                                  

En comparación, la siguiente versión se ejecuta en tiempo constante probando todos los caracteres y utilizando una operación bit a bit para acumular el resultado:

bool constantTimeStringCompare ( const void * a , const void * b , tamaño_t longitud ) { const char * ca = a , * cb = b ; bool resultado = verdadero ; para ( tamaño_t i = 0 ; i < longitud ; i ++ ) resultado &= ca [ i ] == cb [ i ]; devolver resultado ; }                                     

En el mundo de las funciones de biblioteca de C, la primera función es análoga a memcmp(), mientras que la última es análoga a las de NetBSD consttime_memequal()o [11] OpenBSD timingsafe_bcmp()y timingsafe_memcmp. En otros sistemas, se puede utilizar la función de comparación de bibliotecas criptográficas como OpenSSL y libsodium .

Notas

Los ataques de sincronización son más fáciles de montar si el adversario conoce los detalles internos de la implementación del hardware y, más aún, el sistema criptográfico en uso. Dado que la seguridad criptográfica nunca debería depender de la oscuridad de ninguno de los dos (consulte la seguridad a través de la oscuridad , específicamente tanto la Máxima de Shannon como el principio de Kerckhoff ), la resistencia a los ataques de sincronización tampoco debería depender de ello. Como mínimo, se puede comprar un ejemplar y aplicarle ingeniería inversa. Los ataques de sincronización y otros ataques de canal lateral también pueden ser útiles para identificar, o posiblemente aplicar ingeniería inversa, a un algoritmo criptográfico utilizado por algún dispositivo.

Referencias

  1. ^ abc "Constant-Time Crypto". BearSSL . Consultado el 10 de enero de 2017 .
  2. ^ "Guía para principiantes sobre criptografía de tiempo constante" . Consultado el 9 de mayo de 2021 .
  3. ^ David Brumley y Dan Boneh. Los ataques de sincronización remota son prácticos. Simposio de seguridad USENIX, agosto de 2003.
  4. ^ Véase Percival, Colin, Cache Missing for Fun and Profit, 2005.
  5. ^ Bernstein, Daniel J., Ataques de sincronización de caché en AES, 2005.
  6. ^ Horn, Jann (3 de enero de 2018). "Lectura de memoria privilegiada con un canal lateral". googleprojectzero.blogspot.com.
  7. ^ "Preguntas frecuentes sobre los sistemas Spectre". Meltdown y Spectre .
  8. ^ "Las fallas de seguridad ponen en riesgo prácticamente todos los teléfonos y ordenadores". Reuters . 4 de enero de 2018.
  9. ^ "Potencial impacto en los procesadores de la familia POWER". Blog de IBM PSIRT . 14 de mayo de 2019.
  10. ^ Kario, Hubert. "El ataque de Marvin". people.redhat.com . Consultado el 19 de diciembre de 2023 .
  11. ^ "Consttime_memequal".

Lectura adicional