Aislamiento de tablas de páginas del núcleo
# Aislamiento de tablas de páginas del núcleo

El aislamiento de tablas de páginas del núcleo o kernel (KPTI, antes conocido como KAISER) es una característica del núcleo Linux que mitiga la vulnerabilidad de seguridad Meltdown (que afecta principalmente a las CPUs x86 de Intel) y mejora la resistencia del núcleo ante cualquier intento de saltarse la aleatoriedad en la disposición del espacio de direcciones del núcleo (KASLR). Funciona aislando mejor las memorias del espacio de usuario y del espacio del kernel. KPTI se integró en la versión 4.15 del núcleo Linux, cuyo lanzamiento está previsto para principios de 2018, y se incorporó también como backport a los núcleos Linux 4.4.11 y 4.9.75. Windows y macOS también han tenido actualizaciones similares. KPTI no pretende solucionar la vulnerabilidad Spectre.

## Antecedentes de KAISER

Los parches de KPTI se basaron en KAISER (siglas en inglés de Kernel Address Isolation to have Side-channels Efficiently Removed, que traducido al español significa aislamiento de direcciones del núcleo para la eliminación eficiente de canales laterales), publicados en junio de 2017 cuando todavía no se conocía Meltdown. KAISER supone una mejora respecto a KASLR, una mitigación de 2014 para un problema mucho más leve.

En 2014, el núcleo Linux adoptó la aleatoriedad en la disposición del espacio de direcciones del núcleo (KASLR), que hace más difícil explotar otras vulnerabilidades del kernel y que depende de que los mapeos de direcciones del núcleo permanezcan ocultos ante el espacio de usuario. Sin embargo, a pesar de que esto prohíbe el acceso a estos mapeos del núcleo, resulta que existen varios ataques de canal lateral viables en los procesadores actuales que pueden dar pie a revelar el lugar en el que se encuentra esta memoria, haciendo así posible saltarse la protección que en principio ofrece KASLR.

Mientras que KASLR simplemente impide la fuga de datos referentes al mapeo en sí de direcciones de memoria, KAISER además impide la fuga de información contenida en esa memoria, cubriendo por tanto el caso de Meltdown.

En 2017, KAISER solucionó estos problemas de KASLR eliminando el origen de la fuga de direcciones.

KPTI está basado en KAISER. Si no está activado KPTI, en el momento de ejecutar código en el espacio de usuario (es decir, aplicaciones) Linux mantendría toda la memoria del kernel en tablas de páginas, aunque protegida. La ventaja estriba en que cuando la aplicación realiza una llamada al sistema en el núcleo o cuando se recibe una interrupción, las tablas de páginas del núcleo siempre están presentes, con lo cual la carga de trabajo extra relacionada con la mayoría de cambios de contexto (limpieza del TLB, intercambio de tablas de páginas, etc.) puede evitarse.

## KPTI y la vulnerabilidad Meltdown

En enero de 2018 se hizo pública la vulnerabilidad Meltdown, que se sabe que afecta a las CPUs Intel x86 y ARM Cortex A75. Se trataba de una vulnerabilidad mucho más grave que el baipás a KASLR que KAISER pretendía originalmente solventar: se descubrió que el propio contenido de la memoria del kernel podía quedar expuesto, no sólo la localización de los mapeos de memoria como anteriormente se pensaba. Los parches de KAISER fueron adaptados para corregir el problema de Meltdown, y de paso recibieron el nombre KPTI.

KPTI (basado en KAISER) previene Meltdown al impedir que todas las ubicaciones protegidas se mapeen al espacio de usuario.

No hay constancia actualmente de que los procesadores AMD x86 estén afectados por Meltdown, con lo cual no necesitan KPTI para mitigar el problema. Sin embargo, los procesadores AMD sí son susceptibles al baipás de KASLR cuando KPTI está desactivado.

## Implementación

KPTI corrige estas fugas de información separando completamente las tablas de páginas del espacio de usuario de las del espacio del núcleo. En los procesadores que soportan los identificadores de contexto de proceso (PCID) puede evitarse la limpieza del TLB, pero incluso entonces esto supone una pérdida significativa de rendimiento, particularmente con tareas donde intervienen muchas llamadas al sistema o interrupciones.

En los procesadores que soportan los identificadores de contexto de proceso (PCID), se puede evitar el Translation Lookaside Buffer (TLB), pero esto trae un costo significativo en el rendimiento, particularmente en cargas de trabajo pesadas de interrupciones y llamadas al sistema.

La sobrecarga de trabajo se estableció en un 0.28 % según los autores originales de KAISER; un desarrollador de Linux la fijó en aproximadamente un 5 % para la mayoría de tareas típicas y en un máximo de un 30 % en determinados casos aún contando con la optimización de PCID; en el caso de la base de datos PostgreSQL el impacto en pruebas sólo de lectura en un procesador Intel Skylake fue del 7 al 17% (o del 16 al 23% sin PCID), mientras que una evaluación completa de pruebas de referencia arrojaba una caída de rendimiento de entre el 13 y el 19% (Coffee Lake frente a Broadwell-E). Phoronix ha realizado muchas pruebas de referencia en las que Redis perdía un 6-7 % de rendimiento mientras que la compilación del núcleo Linux se ralentizaba en un 5 % en Haswell.

KPTI puede desactivarse parcialmente con la opción "nopti" de arranque del núcleo. También se han añadido medios para desactivar KPTI en caso de que futuros procesadores corrijan las fugas de información descritas.

