Usando Xorg en Gentoo Hardened
1.
Conceptos previos
¿Qué diferencia la ejecución de Xorg en un entorno Gentoo Hardened?
PaX, un parche del núcleo Linux, es una parte central del proyecto Gentoo
Hardened. PaX proporciona diversas funcionalidades como ASLR y memoria NX.
Se puede encontrar más información en
http://www.gentoo.org/proj/en/hardened/docs/pax-howto.xml (en
inglés). En el resto de este documento, se asumirá que el lector tiene una
comprensión general de cómo funciona PaX así como el conocimiento de los
Ejecutables Independientes de la Posición (PIE).
La característica específica de PaX que es de interés en este artículo es
MPROTECT, la cual protege contra el código ejecutable en el espacio de
direcciones de un programa. Una de las principales características de
Gentoo Hardened es la habilidad de correr PaX de forma efectiva debido a
la base ET_DYN/PIE. La meta eventual de Xorg es tener el propio binario
construido como ET_DYN/PIE de forma que se hayan eliminado las
relocalizaciones de texto y aleatorizar la base de las direcciones sin
afectar al rendimiento EX_EXEC.
En este punto, parece una opción lógica compilar Xorg con código PIC.
Gentoo ofrece gcc hardened para este propósito, el cula ofrece compilación
transparente PIE/SSP compiling. Es en este punto donde comienzan los
problemas con Xorg. Actualmente Xorg utiliza elfloader para gestionar
la carga de los módulos que necesita, sin embargo, elfloader no puede
resolver varios tipos de símbolos relocalizables que se generan siempre con
código PIC. Aún más importante es el hecho de que elfloader has no tiene
soporte para símbolos de Tabla de Desplazamiento Globales (Global Offset
Table o GOT) o símbolos del tipo Tabla de Enlazado de Procedimientos
(Procedure Linkage Table o PLT), los cuales son esenciales para el uso
de librerías compartidas.
Entonces, si elfloader no nos sirve, ¿Qué podemos usar?. Afortunadamente
hay un cargador dinámico en su sistema maduro, sobradamente probado y
completamente operacional. Éste es ld-linux.so proporcionado por glibc.
La idea obvia que aparece en este momento es que idealmente debería haber
una interfaz programable para el cargador de glibc loader, y que se podría
modificar el cargador de X para que lo utilice en lugar de usar su propio
cargador. Sorprendentemente esa interfaz existe: dlopen(3) y otros. Esto es
justamente lo que utiliza dlloader.
Nota: A partir de Xorg 7.0, dlloader es el cargador de módulos por defecto
para X. |
2.
Opciones de configuración del núcleo
CONFIG_PAX_KERNEXEC
La opción 'CONFIG_PAX_KERNEXEC' es el equivalente de PAGEEXEC y MPROTECT.
Habilitando esta opción, será más difícil inyectar y ejecutar código
'extraño' en la memoria del núcleo. Esta opción puede ofrecerle algunas
experiencias extrañas en una configuración hardened de Xorg (por ejemplo
que el puntero del ratón se quede parado en el lado izquierdo de la
pantalla). Lo recomendado, por tanto, es desactivar esta opción,
deseleccionándola en su configuración.
CONFIG_GRKERNSEC_IO
Habilitando esta opción provocará que las todas la llamadas ioperm(2) e
iopl(2) devuelvan un mensaje de error. Se pueden utilizar Las llamadas
ioperm(2) e iopl(2) para modificar el núcleo en tiempo de ejecución. Como
se quiere ejecutar el servidor Xorg encima de un núcleo hardened (en mayor
medida GRsecurity), tendrá que deshabilitar esta opción de configuración
para que su servidor se pueda arrancar y ejecutar.
3.
Instalación
Opciones actuales de instalación
A partir de la versión 7.0 de Xorg, se usa por defecto dlloader en lugar de
elfloader, no hay necesidad de hacer nada especial para compilar y hacer
funcionar a Xorg en un perfil hardened.
4.
Configuración
/etc/X11/xorg.conf
Puede configurar su Xorg configuration usando la Guía de configuración del
Servidor X en: /doc/es/xorg-config.xml
5.
Problemas conocidos
Experiencias con dlloader
La estrategia para enlazar de Gentoo Hardened es resolver todos los símbolos
en el momento de la carga, y esto se fuerza en todas las librerías
compartidas cuando éstas son construidas. Normalmente el cargador utiliza
resolución "perezosa" cuando se solicita. Por lo tanto, los símbolos se
resuelven cuando son utilizados. Lamentablemente algunos módulos de Xorg
tienen dependencias mutuas y otros problemas que provocan que no se puedan
cargar a menos que se habilite la resolución perezosa de símbolos. Para
solventar este problema, actualmente Gentoo compila los módulos Xorg y el
propio servidor con el ajuste -nonow de gcc. Esto soluciona los errores
"dlopen: undefined symbol" por lo que los métodos previos de detección
manual y carga de módulos ya no son necesarios.
Importante:
Por favor, informe de todos los problemas que encuentre rellenando una
incidencia en bugs.gentoo.org adjuntando los registros y configuraciones
completos.
|
Controladores binarios
Los controladores binarios no están soportados actualmente en el perfil
hardened y por tanto se recomienda usar los controladores de código abierto.
Ajustes PaX
Los ajustes PaX flags -P (PAGEEXEC), -S (SEGMEXEC), -M (MPROTECT) así como
-R (RANDMMAP) no funcionan con Xorg.
|