Investigadores del Instituto Politécnico de Worcester (EE. UU.) presentaron un nuevo tipo de ataque llamado Mayhem, que utiliza el método de distorsión de bits en la memoria dinámica RAM Rowhammer para modificar los valores de las variables en la pila, utilizadas en el programa como indicadores para determinar la efectividad de la autenticación y los controles de seguridad. Se demostraron ejemplos prácticos de este ataque para eludir la autenticación en SUDO, OpenSSH y MySQL, así como para alterar los resultados de los controles de seguridad en la biblioteca OpenSSL.
El ataque puede aplicarse a aplicaciones que utilizan la comparación de diferencias de valores con respecto a cero durante las verificaciones. Ejemplo de código vulnerable: int auth = 0; … // código de verificación que cambia el valor de auth en caso de autenticación exitosa if(auth != 0) return AUTH_SUCCESS; else return AUTH_FAILURE;
En el contexto de este ejemplo, para que el ataque sea exitoso, es suficiente distorsionar cualquier bit en la memoria correspondiente a la variable de 32 bits auth en la pila. Al distorsionar cualquier bit en la variable, el valor ya no será cero y el operador condicional determinará una autenticación exitosa. Este tipo de patrones de verificación son bastante comunes en las aplicaciones y se encuentran, por ejemplo, en SUDO, OpenSSH, MySQL y OpenSSL.

El ataque también se puede aplicar a comparaciones del tipo «if(auth == 1)», pero en este caso su ejecución se complica, ya que es necesario distorsionar no cualquier bit de 32, sino el último bit. El método también puede usarse para influir en los valores de las variables en los registros del procesador, dado que el contenido de los registros puede ser momentáneamente volcado en la pila al cambiar de contexto, al llamar a funciones o al activarse un manejador de señales. Durante el tiempo en que los valores de los registros están en la memoria, se pueden introducir distorsiones en esa memoria y se restaurará el valor alterado en el registro.

Para la manipulación de bits se utiliza una de las variaciones del ataque de la clase RowHammer. Dado que la memoria DRAM es una matriz bidimensional de celdas, cada una compuesta por un condensador y un transistor, la lectura continua de la misma área de memoria provoca fluctuaciones de voltaje y anomalías que provocan una pequeña pérdida de carga en las celdas adyacentes. Si la intensidad de lectura es alta, la celda vecina puede perder una cantidad suficiente de carga y el siguiente ciclo de regeneración no restaurará su estado original, lo que resultará en un cambio en el valor de los datos almacenados en la celda. Para protegerse contra RowHammer, los fabricantes de chips añadieron un mecanismo TRR (Target Row Refresh), que bloquea la manipulación de celdas en casos específicos, pero no protege contra todas las posibles variantes del ataque.
Para protegerse contra el ataque Mayhem, se recomienda utilizar en las comparaciones no la evaluación de diferencias desde cero o coincidencias con uno, sino la verificación de coincidencias usando un valor aleatorio de semilla con octetos no nulos. En este caso, para establecer el valor deseado de la variable, es necesario distorsionar con precisión un número significativo de bits, lo que no es realista, a diferencia de distorsionar un solo bit. Ejemplo de código no susceptible al ataque: int auth = 0xbe406d1a; … // código de verificación que establece el valor de auth en 0x23ab8701 en caso de autenticación exitosa if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;
El método de protección mencionado ya ha sido implementado por los desarrolladores de sudo y se incluyó en la versión 1.9.15 como una corrección a la vulnerabilidad CVE-2023-42465. El prototipo de código para llevar a cabo el ataque se planea publicar después de realizar las correcciones en los principales proyectos vulnerables.
Fuente: opennet.ru
