¿Recuerdan Meltdown? Aplicaciones sin privilegios eran capaces de leer la memoria del kernel debido a una característica integrada en las CPUs… Microsoft la parcheó en enero pero al hacerlo abrió un agujero aún peor permitiendo que cualquier proceso pueda leer el contenido completo de la memoria (a velocidades de gigabytes por segundo), incluso escribir en ella.
No se necesitan exploits complejos: Microsoft ya hizo el arduo trabajo en Windows 7 x64 y Server 2008 R2 x64 de mapeo en la memoria requerida en cada proceso en ejecución. La explotación es solo una cuestión de leer y escribir en la memoria virtual en proceso ya mapeada. No se requieren API sofisticadas ni llamadas de sistema, ¡solo lectura y escritura estándar!
El bug radica en que se permite el acceso en user-mode a una entrada (0x1e8) de la tabla de paginado PML4 (Page Map Level 4), una de las cuatro que se utilizan para trasladar direcciones virtuales a físicas. Y aún peor, dicha entrada es usada en Windows 7 y Server 2008 R2 x64 como auto-referenciable (Self-Referencing) lo que significa que cualquier proceso de usuario puede ver y modificar la tabla PML4 y, de forma adyacente, la memoria física. Recomiendo echar un vistazo al artículo de Adam aka @_xpn_ donde lo explica perfectamente.
Una de las consecuencias de explotar este fallo es la posibilidad de escalar privilegios, como se puede observar en el siguiente vídeo de demo:
Para construir el exploit, “sólo” hay que desarrollar los siguientes pasos:
- Crear un nuevo conjunto de tablas de página que permita acceder a cualquier dirección de memoria física.
- Crear un conjunto de firmas que puedan usarse para buscar estructuras _EPROCESS en la memoria del kernel.
- Encontrar la dirección de memoria _EPROCESS para el proceso en ejecución y para el proceso del Sistema.
- Reemplace el token del proceso en ejecución con el de System, elevando a NT AUTHORITY\System.
Tenéis el código completo y funcional aquí.
Por último, Microsoft ha publicado el parche para esta vulnerabilidad, bautizada como CVE-2018-1038, así que toca parchear rápido: