Mayhem: ataque de corrupción de bits de memoria para evitar la autenticación Sudo y OpenSSH

Investigadores del Instituto Politécnico de Worcester (EE. UU.) han introducido un nuevo tipo de ataque Mayhem que utiliza la técnica de distorsión dinámica de bits de memoria de acceso aleatorio Rowhammer para cambiar los valores de las variables de pila utilizadas como indicadores en el programa para decidir si se han realizado comprobaciones de autenticación y seguridad. aprobado. Se muestran ejemplos prácticos del ataque para eludir la autenticación en SUDO, OpenSSH y MySQL, así como para cambiar el resultado de las comprobaciones relacionadas con la seguridad en la biblioteca OpenSSL.

El ataque se puede aplicar a aplicaciones que utilizan comprobaciones para comparar valores que difieren de cero. Ejemplo de código vulnerable: int auth = 0; ... // código de verificación que cambia el valor de autenticación en caso de autenticación exitosa if(auth != 0) return AUTH_SUCCESS; de lo contrario, devolverá AUTH_FAILURE;

En el contexto de este ejemplo, para que un ataque tenga éxito es suficiente corromper cualquier bit de la memoria asociada con la variable de autenticación de 32 bits en la pila. Si algún bit de la variable está dañado, el valor ya no será cero y el operador condicional determinará la finalización exitosa de la autenticación. Estos patrones de validación son bastante comunes en aplicaciones y se encuentran, por ejemplo, en SUDO, OpenSSH, MySQL y OpenSSL.

Mayhem: ataque de destrucción de bits de memoria para evitar la autenticación Sudo y OpenSSH

El ataque también se puede aplicar a comparaciones de la forma “if(auth == 1)”, pero en este caso su implementación se vuelve más complicada, ya que es necesario distorsionar no cualquier bit de 32, sino el último bit. El método también se puede utilizar para influir en los valores de las variables en los registros del procesador, ya que el contenido de los registros se puede vaciar temporalmente en la pila cuando se activa un cambio de contexto, una llamada a una función o un controlador de señales. Durante el período de tiempo que los valores de los registros están en la memoria, se pueden introducir distorsiones en esta memoria y el valor modificado se restaurará en el registro.

Mayhem: ataque de destrucción de bits de memoria para evitar la autenticación Sudo y OpenSSH

Para distorsionar los bits, se utiliza una de las modificaciones del ataque de clase RowHammer. Dado que la memoria DRAM es una matriz bidimensional de celdas, cada una de las cuales consta de un capacitor y un transistor, realizar lecturas continuas de la misma región de la memoria produce fluctuaciones de voltaje y anomalías que causan una pequeña pérdida de carga en las celdas vecinas. Si la intensidad de lectura es alta, entonces la celda vecina puede perder una cantidad suficientemente grande de carga y el siguiente ciclo de regeneración no tendrá tiempo de restaurar su estado original, lo que conducirá a un cambio en el valor de los datos almacenados en la celda. . Para protegerse contra RowHammer, los fabricantes de chips han agregado un mecanismo TRR (Target Row Refresh), que bloquea la corrupción de celdas en casos especiales, pero no protege contra todas las posibles variantes de ataque.

Para protegerse contra el ataque Mayhem, se recomienda utilizar en las comparaciones no una evaluación de las diferencias desde cero o una coincidencia con uno, sino una verificación de coincidencia utilizando un valor inicial aleatorio con octetos distintos de cero. En este caso, para establecer el valor deseado de la variable, es necesario distorsionar con precisión un número significativo de bits, lo cual no es realista, a diferencia de la distorsión de un bit. Ejemplo de código no atacable: int auth = 0xbe406d1a; ... // código de verificación que establece el valor de autenticación en 0x23ab8701 en caso de autenticación exitosa if(auth == 0x23ab8701) return AUTH_SUCCESS; de lo contrario, devolverá AUTH_FAILURE;

Los desarrolladores de sudo ya utilizaron el método de protección especificado y se incluyó en la versión 1.9.15 como solución para la vulnerabilidad CVE-2023-42465. Planean publicar un prototipo del código para llevar a cabo el ataque después de que se hayan corregido los principales proyectos vulnerables.

Fuente: opennet.ru

Añadir un comentario