stringtranslate.com

Ataque de tiempo

Un ejemplo de un ataque de sincronización realizado en la caché web . El gráfico de la izquierda indica 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 sincronización es un ataque de canal lateral en el que el atacante intenta comprometer un criptosistema analizando el tiempo necesario para ejecutar algoritmos criptográficos. Cada operación lógica en una computadora requiere tiempo para ejecutarse y el tiempo puede diferir según la entrada; con mediciones precisas del tiempo de cada operación, un atacante puede retroceder hasta la entrada. Encontrar secretos a través de información de tiempo puede ser significativamente más fácil que usar criptoanálisis de pares conocidos de texto sin formato y texto cifrado. A veces, la información temporal se combina con el criptoanálisis para aumentar la tasa de fuga de información. [1]

La información puede filtrarse de un sistema mediante la medición del tiempo que lleva responder a determinadas consultas. En qué medida esta información puede ayudar a un atacante depende de muchas variables: diseño del sistema criptográfico, la CPU que ejecuta el sistema, los algoritmos utilizados, diversos detalles de implementación, contramedidas de ataque de sincronización, la precisión de las mediciones de sincronización, etc. Los ataques de sincronización se pueden aplicar a cualquier algoritmo que tenga 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 exhiben tiempos de ejecución variados.

Los ataques de sincronización a menudo se pasan por alto en la fase de diseño porque dependen mucho de la implementación y pueden introducirse involuntariamente con optimizaciones del compilador . Evitar ataques de tiempo implica el diseño de funciones de tiempo constante y pruebas cuidadosas del código ejecutable final. [1]

Evitación

Muchos algoritmos criptográficos se pueden implementar (o enmascarar 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 lleva ejecutar esa rutina en cada entrada autorizada posible. En tal implementación, es menos probable que la sincronización 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 de los casos de desempeño de la función.

La dependencia de los datos del tiempo puede deberse a uno de los siguientes: [1]

Ejemplos

El tiempo de ejecución del algoritmo de cuadrado y multiplicación utilizado en la exponenciación modular depende linealmente del número de bits '1' en la clave. Si bien el número de bits '1' por sí solo no es información suficiente 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 mediante un atacante pasivo. Las mediciones de temporización observadas a menudo incluyen ruido (procedente de fuentes como la latencia de la red o las diferencias de acceso a la unidad de disco entre un acceso y otro, y las técnicas de corrección de errores utilizadas para recuperarse de los errores de transmisión). Sin embargo, los ataques de sincronización son prácticos contra una serie de algoritmos de cifrado, incluidos RSA , ElGamal y el algoritmo de firma digital .

En 2003, Boneh y Brumley demostraron un ataque práctico de sincronización basado en red en servidores web habilitados para SSL , basado en una vulnerabilidad diferente que tenía que ver con el uso de RSA con optimizaciones del teorema del resto chino . La distancia real de la red fue 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 uso generalizado de técnicas de cegamiento en implementaciones 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 requería un tiempo deliberado y mensurable: hasta dos o tres segundos en algunos casos. [ cita necesaria ] El programa de inicio de sesión en las primeras versiones de Unix ejecutaba la función de cripta solo cuando el sistema reconocía el nombre de inicio de sesión. Esto filtró 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 dichas filtraciones aplicando primero 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 sólo estos nombres con un gran conjunto de contraseñas que se sabe que se utilizan con frecuencia. Sin ninguna información sobre la validez de los nombres de inicio de sesión, el tiempo necesario para ejecutar dicho enfoque aumentaría en órdenes de magnitud, haciéndolo efectivamente inútil. Las versiones posteriores de Unix han solucionado esta fuga ejecutando siempre la función de cripta, independientemente de la validez del nombre de inicio de sesión. [ cita necesaria ]

Dos procesos que de otro modo estarían aislados de forma segura y que se ejecutan en un único sistema con memoria caché o memoria virtual pueden comunicarse provocando deliberadamente fallos de página y/o errores de caché en un proceso, y luego monitoreando 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 bifurcación, es posible que una segunda aplicación determine los valores de los datos en comparación con la condición de bifurcación al monitorear los cambios en el tiempo de acceso; en ejemplos extremos, esto puede permitir la recuperación de bits de claves criptográficas. [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 dependen de 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 en el momento oportuno son difíciles de prevenir y, a menudo, pueden usarse para extender otros ataques. Por ejemplo, en 2018, se redescubrió un antiguo ataque a RSA en una variante de canal lateral de temporización, dos décadas después del error original. [10]

Algoritmo

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

bool insecureStringCompare ( const void * a , const void * b , size_t length ) { const char * ca = a , * cb = b ; para ( tamaño_t i = 0 ; i < longitud ; i ++ ) si ( ca [ i ] ! = cb [ i ]) devuelve falso ; devolver 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 constanteTimeStringCompare ( const void * a , const void * b , size_t length ) { const char * ca = a , * cb = b ; resultado booleano = verdadero ; para ( tamaño_t i = 0 ; i < longitud ; i ++ ) resultado &= ca [ i ] == cb [ i ]; resultado de retorno ; }                                     

En el mundo de las funciones de la biblioteca C, la primera función es análoga a memcmp(), mientras que la última es análoga a 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 en el momento oportuno son más fáciles de montar si el adversario conoce los aspectos 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 (ver seguridad a través de la oscuridad , específicamente tanto la Maxim de Shannon como el principio de Kerckhoffs ), la resistencia a los ataques sincronizados tampoco debería depender. Al menos, se puede comprar un ejemplar y realizar 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 "Cripto en tiempo constante". OsoSSL . Consultado el 10 de enero de 2017 .
  2. ^ "Una guía para principiantes sobre criptografía en 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 de 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 canal lateral". googleprojectzero.blogspot.com.
  7. ^ "Preguntas frecuentes sobre sistemas Spectre". Fusión y espectro .
  8. ^ "Las fallas de seguridad ponen en riesgo prácticamente todos los teléfonos y computadoras". Reuters . 4 de enero de 2018.
  9. ^ "Impacto potencial en los procesadores de la familia POWER". Blog de IBM PSIRT . 14 de mayo de 2019.
  10. ^ Kario, Hubert. "El ataque de Marvin". gente.redhat.com . Consultado el 19 de diciembre de 2023 .
  11. ^ "Consttime_memequal".

Otras lecturas