Guía de inicio rápido para usar PaX con Gentoo Hardened
1.
¿Qué es Gentoo Hardened?
Gentoo Hardened es un proyecto interesado en reforzar el sistema Gentoo.
Soportamos diferentes soluciones y existe una flexibilidad adecuada para
crear su propia configuración. En el corazón de la configuración de un
sistema Gentoo común está PaX.
2.
¿Qué es PaX?
PaX es un parche para el núcleo Linux que ofrece el reforzamiento del
mismo de dos formas:
La primera, ASLR (Address Space Layout Randomization o Esquema de
Aleatorización del Espacio de Direcciones) ofrece una forma de
aleatorizar la distribución de direcciones de todos los datos cargados
en memoria. Cuando se construye una aplicación como un PIE
(Position Independent Executable o Ejecutable Independiente de la
Posición), Pax puede aleatorizar las direcciones de la aplicación base.
La segunda forma de protección ofrecida por PaX es la memoria no
ejecutable. Esto impide una forma muy común de ataque en el cual
un atacante inserta código ejecutable en memoria. Se puede encontrar más
información sobre PaX en esta misma guía, pero la página oficial está en
http://pax.grsecurity.net.
3.
Una introducción a PIE y SSP
Como se ha mencionado arriba, PaX se complementa con PIE. Este método
de construir ejecutables almacena información necesaria para relocalizar
partes del ejecutable en memoria, de ahí el nombre Independiente de la
Posición.
SSP (Stack Smashing Protector o Protector contra Ataques a la Pila)
es una tecnología que se añade al ejecutable en el momento de su
construcción. SSP fue originalmente introducida por IBM bajo el nombre
ProPolice. Modifica el compilador de C para insertar código de
inicialización en funciones que crean un buffer en memoria.
Nota:
En las nuevas versiones de SSP, es posible aplicar SSP a todas las
funciones, añadiendo protección a funciones cuyo buffer normalmente
estaría por debajo del límite de tamaño para SSP. Esto es habilitado
mediante la CFLAG -fstack-protector-all.
|
Durante la ejecución, cuando se crea un buffer, SSP añade un valor
aleatorio secreto al final del buffer: el chivato. Cuando la función
retorna, SSP se asegura de que el chivato no ha sido modificado. Si un
atacante quisiera intentar un desbordamiento de buffer, sobreescribiría
este valor y esto desembocaría en un manejador de ataque a pila.
Consecuentemente esto causaría la finalización del proceso atacado.
Más información
sobre SSP.
4.
Construyendo un núcleo con PaX habilitado
Varios árboles con el núcleo parcheado con PaX están disponibles en
Gentoo.
Para las máquinas basadas en 2.4/2.6, los núcleos recomendados son
hardened-sources
Obtenga uno de los árboles fuente recomendados, o aplique los parches
apropiados presentes en http://pax.grsecurity.net a su árbol
y configúrelo como normalmente lo haría para la máquina destino.
En Security Options -> PaX, aplique las opciones que se
muestran abajo.
Listado de Código 4.1: Configuración del núcleo |
[*] Enable various PaX features
PaX Control ->
[ ] Support soft mode
[*] Use legacy ELF header marking
[*] Use ELF program header marking
MAC system integration (none) --->
Non-executable page ->
[*] Enforce non-executable pages
[*] Paging based non-executable pages
[*] Segmentation based non-executable pages
[*] Emulate trampolines
[*] Restrict mprotect()
[ ] Disallow ELF text relocations
Address Space Layout Randomization ->
[*] Address Space Layout Randomization
[*] Randomize kernel stack base
[*] Randomize user stack base
[*] Randomize mmap() base
[*] Randomize ET_EXEC base
|
Construya este núcleo como lo haría normalmente e instálelo en
/boot.
5.
Construyendo una zona de usuario con PIE/SSP habilitado
Gentoo Hardened ha añadido soporte para la construcción transparente
de PIE/SSP usando un fichero de especificación de GCC. Esto significa
que cualquier usuario que realice una actualización de instalaciones
anteriores de Hardened deberá eliminar cualquier LDFLAGS o CFLAGS
usadas para activar PIE/SSP. También, se debe tener en cuenta que
el paquete hardened-gcc es ahora obsoleto y debe ser
desinstalado (la versión 5.0 es una paquete inútil). Para obtener
la versión actual de GCC, añada USE="hardened pic" a
/etc/make.conf si no está usando el perfil hardened.
Para mantener un conjunto de herramientas consistente, primero haga
emerge binutils gcc virtual/libc. A continuación, reconstruya
el sistema completo haciendo emerge -e world. A partir de ese
momento todos los paquetes se construirán usando las tecnologías PIE/SSP.
Aviso:
Tanto PIE como SSP pueden causar algún tipo de problema con algunos
paquetes. Si encuentra alguno que falle al compilar, por favor,
informe de una nueva y detallada incidencia incluyendo los datos
de la compilación que ha fallado y la salida de emerge info en
http://bugs.gentoo.org/.
|
Probablemente quiera también hacer emerge de pax-utils.
A menudo, si un fichero ELF tiene relocalizaciones ejecutables en
el segmento de texto, éstas pueden causarnos problemas.
scanelf -BRylptq
6.
Cuando las cosas no van como debieran (PaX Control)
Algunas aplicaciones legítimas intentarán generar código en tiempo de
ejecución, el cual se ejecuta fuera de memoria. Naturalmente, PaX no
lo permitirá y terminará las aplicaciones que intenten hacerlo.
Nota:
La más notable de este tipo de aplicaciones es XFree/Xorg, mplayer y
herramientas multimedia basadas en xine-lib. La forma más fácil de
evitar estos problemas es desactivar las protecciones de PaX.
|
Afortunadamente existe una utilidad para activar o desactivar las
protecciones para un ejecutable: paxctl. Al igual que otros
paquetes en Gentoo, instale paxctl mediante el comando
emerge paxctl. El uso de esta utilidad se muestra mediante
paxctl -h.
Nota:
Si tiene una versión antigua de binutils, necesitará usar chpax,
el cual edita las marcas de PaX con el formato antiguo. El uso de chpax
es muy parecido al de paxctl. Esto también requiere el soporte de marcas
construido en su núcleo.
Las nuevas versiones de paxctl hacen chpax obsoleto.
|
Listado de Código 6.1: paxctl -h |
usage: paxctl <options> <files>
options:
-p: disable PAGEEXEC -P: enable PAGEEXEC
-e: disable EMUTRMAP -E: enable EMUTRMAP
-m: disable MPROTECT -M: enable MPROTECT
-r: disable RANDMMAP -R: enable RANDMMAP
-x: disable RANDEXEC -X: enable RANDEXEC
-s: disable SEGMEXEC -S: enable SEGMEXEC
-v: view flags -z: restore default flags
-q: suppress error messages -Q: report flags in short format flags
|
La primera opción que se suele usar es -v, la cual muestra los
ajustes realizados en un binario en particular.
Listado de Código 6.2: paxctl -v |
shell user # paxctl -v /usr/bin/Xorg
PaX control v0.2
Copyright 2004 PaX Team <pageexec@freemail.hu>
- PaX flags: -p-sM--x-eR- [/usr/bin/Xorg]
PAGEEXEC is disabled
SEGMEXEC is disabled
MPROTECT is enabled
RANDEXEC is disabled
EMUTRAMP is disabled
RANDMMAP is enabled
|
Esto muestra un binario XFree con todas las protecciones deshabilitadas.
Para activar una de estas protecciones en un binario, nos será útil la
opción -z ya que restaura el valor por defecto de esa protección.
Para desactivar las protecciones en Xorg, ejecute
paxctl -zpeMRxs /usr/bin/Xorg.
Puede probar a activar/desactivar varias protecciones para comprobar
cuáles son las mínimas para poder trabajar. A menudo se comprueba que
son necesarias las combinaciones -m -sp.
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logo y nombre de Gentoo.
|