Deshabilitar SMEP en x86_64

2

Recientemente he estado investigando sobre la explotación del kernel en X86_64. Un problema con el que me he encontrado es que encontré que la SMEP de Intel está matando mi ejemplo de una desreferencia de puntero NULL en el núcleo en el que he estado trabajando.

¿Puede / cómo deshabilitar SMEP en linux? He logrado eliminar SMAP (Protección de acceso al modo de seguridad) en el kernel de Linux 3.8.x deshabilitando la funcionalidad en el archivo .config, pero mi problema aún persiste. Supongo que SMEP debe desactivarse de manera diferente a SMAP, dado que después de deshabilitarlo, la ejecución de mi página NULL asignada se detiene instantáneamente tan pronto como la ejecución se desvía dentro del espacio del kernel.

Ya he establecido mmap_min_addr en 0, así que no hay comentarios que me indiquen que modifique este valor en / proc / sys / vm :).

    
pregunta A.Smith 28.10.2013 - 10:57
fuente

3 respuestas

3

Parece que SMEP se puede deshabilitar (en linux) usando un parámetro de arranque. Si bien estoy seguro de que la sugerencia anterior funciona (deshabilitar el código de kernel-land es una opción obvia que desearía haber hecho antes: P) la siguiente podría ser una forma más fácil de lograr el mismo resultado final.

Encontré información aquí sobre cómo hacer esto.

Parece que al agregar el parámetro de inicio del kernel nosmep a los parámetros de inicio, como se explica en el enlace anterior, se puede desactivar SMEP. También he encontrado en este enlace a la documentación de kernel.org que hay otros parámetros que se puede usar para desactivar otros mecanismos de protección, como NX o apparmour.

Para confirmar si SMEP se ha desactivado, puede escribir el siguiente comando en su terminal:

cat /proc/cpuinfo | grep smep

Este comando imprime el contenido del archivo /proc/cpuinfo y canaliza la salida a grep para intentar encontrar la bandera smep en la salida.

Si el comando devuelve un valor (lo más probable es que smep sea el valor devuelto, si está habilitado) entonces SMEP está habilitado, de lo contrario, si no se devuelve ningún valor (es decir, grep no devuelve nada al terminal), SMEP ha sido exitoso discapacitado.

Espero que esto ayude a alguien más en mi posición. Tengo la intención de escribir un artículo en mi blog sobre los detalles específicos de SMEP y cómo evitarlo / desactivarlo. Publicaré el enlace aquí después de haber escrito la publicación :).

¡Gracias a todos los que ayudaron!

A.

    
respondido por el A.Smith 28.10.2013 - 19:04
fuente
4

SMEP se activa mediante bit 20 del registro de control CR4 , mientras que SMAP es el bit 21. La inhabilitación puede ser hecho, al menos, parcheando el código del kernel para eliminar la configuración de este bit.

El código relevante parece estar en el archivo arch/x86/kernel/cpu/common.c , alrededor de la línea 269:

    if (cpu_has(c, X86_FEATURE_SMEP))
            set_in_cr4(X86_CR4_SMEP);

Solo comenta eso, recompila, reinicia. (No lo he probado).

    
respondido por el Tom Leek 28.10.2013 - 12:20
fuente
0

Puede deshabilitar SMEP mediante el uso de una cadena ROP en el kernel, que los demás respondedores no indicaron aquí. No hay necesidad de parchear o recompilar o reiniciar. Simplemente busque en el binario del kernel los gadgets ROP. Un ejemplo de código que deshabilitaría SMEP sería: (creo que sería fácil encontrar variaciones de esto en todos los núcleos) (Advertencia, Sintaxis de Intel )

mov eax , cr4
and eax , 0xfff ; This disables both SMAP and SMEP, as the higher 20 bits are cleared
mov cr4 , eax

Un ejemplo de una cadena ROP que encontré en un kernel real (aproveché esto para saltar a userland):

0xaddr1: mov eax, cr4 ; pop ebp ; ret
0xaddr2: and eax, 0xfff ; ret
0xaddr3: mov cr4, eax ; pop ebp ; ret

Hay un montón de recursos en Google .

    
respondido por el Mukesh Sai Kumar 21.01.2018 - 10:03
fuente

Lea otras preguntas en las etiquetas