Vulnerabilidad de Linux: cualquiera puede iniciar sesión tocando Retroceso 28 veces. ¿Cómo este método omite la contraseña?

Es muy lamentable que Linux, que se considera más seguro, tenga esta peligrosa amenaza de seguridad. Agradezco su pregunta para decir que algunos investigadores de algún laboratorio de seguridad en España han descubierto que este es un error en el cargador de arranque Grub 2 . Es triste descubrir que el gestor de arranque solía llevarlo a un lugar llamado “Grub rescue shell” y una vez que está allí, puede acceder a la computadora sin iniciar sesión en la computadora.

Si comprende la programación en C, a continuación se muestra la parte del código Grub 2 que causó este error de software.

static int grub_username_get (char buf [], unsigned buf_size) {
unsigned cur_len = 0;
clave int;
mientras que (1) {
clave = grub_getkey ();
if (clave == ‘\ n’ || clave == ‘\ r’)
descanso;
if (clave == ‘\ e’) {
cur_len = 0;
descanso;
}
if (key == ‘\ b’) // ¡No verifica los flujos inferiores! {
cur_len–; // ¡Desbordamiento de enteros!
grub_printf (“\ b”);
continuar;
}
if (! grub_isprint (clave))
continuar;
if (cur_len + 2 <buf_size) {
buf [cur_len ++] = clave; // ¡¡Fuera de dos !!
grub_printf (“% c”, clave);
}
}
grub_memset (buf + cur_len, 0, buf_size – cur_len); // Fuera de límites sobrescribir
grub_xputs (“\ n”);
grub_refresh ();
return (clave! = ‘\ e’);
}

Arriba está la función vulnerable grub_username_get ()

Hay dos funciones que sufren la misma falla de flujo inferior de entero. Grub_username_get () y grub_password_get () ubicados en grub-core / normal / auth.c y lib / crypto.c respectivamente.

Arriba puede ver la línea número 12 y 13. El principal problema son esas dos líneas.

Digamos que escribe 10 caracteres como contraseña o nombre de usuario. Ahora, si presiona retroceso una vez, su contraseña / nombre de usuario debe tener ahora 9 caracteres. Por lo tanto, debe disminuir el valor de la variable cur_len cada vez que se presiona la tecla de retroceso. Por eso fue diseñado de esta manera. Pero ahora piense que no tiene nada escrito y que el valor cur_len ya es 0. ¿Qué sucederá si disminuye aún más la variable? Matemáticamente debería ser -1, pero en computadoras significa el mayor valor negativo que puede contener la variable o, básicamente, el complemento de 2 de -1

El siguiente ejemplo ayuda a comprender cómo podemos explotar esto. Suponiendo que el búfer de nombre de usuario reside en la dirección 0x7f674 y el atacante presiona la tecla de retroceso solo una vez (produciendo un flujo inferior a 0xffffffff), el memset resultante será:

grub_memset (0x7f673, 0, 1025)

Porque ( buf + cur_len) = ( 0x7f674 + 0xffffffff) – 1 = 0x7f673

y (buf_size – cur_len) = (1024 – (-1)) = 1025

Por lo tanto, todo el búfer de nombre de usuario (1024) más el primer byte debajo del búfer se establecerá en cero.

Por lo tanto, el número de pulsaciones de teclas de retroceso (sin introducir ningún nombre de usuario), es el número de bytes por debajo del nombre de usuario que se ponen a cero.

Se puede acceder a esto para borrar la contraseña y el nombre de usuario ya guardados y hacer que el sistema piratee.

Simplemente cambiando

if (clave == ‘\ b’)

a esto

if (clave == ‘\ b’ && cur_len)

Podemos evitar esto

Encuentra más información aquí [1]

Editar: todas las principales distribuciones de Linux han lanzado los parches de software. Por favor, instálelos para solucionar esto.

EL PARCHE DE SOFTWARE: http://hmarco.org/bugs/patches/0…

Notas al pie

[1] Grub2 Autenticación Bypass 0 días

Tenga en cuenta que este gran ya ha sido parcheado en grub2, y nunca fue tan simple como tocar el espacio de retroceso 28 veces. Tuviste una gran cantidad de configuración adicional para llegar a un mensaje de rescate completo, e incluso entonces esto no mitigó el cifrado de partición de raíz y arranque.