Preguntas de Uso Frecuente de Gentoo Hardened
1.
Preguntas
Introducción
Lo que sigue es una serie de preguntas recogidas del canal IRC
#gentoo-hardened y de la lista de correo gentoo-hardened mailing. Estas
preguntas están contestadas de forma rápida y concisa en lugar de
ofrecer una vista detallada de las tecnologías detrás de Gentoo
Hardened. Se recomienda leer el resto de la documentación en la página
del proyecto Gentoo Hardened Project y la presente en las páginas del
proyecto para tener una mejor visión.
Generales
Preguntas sobre PaX
Preguntas sobre Grsecurity
Preguntas sobre SELinux
2.
Generales
¿Qué es exactamente el "toolchain"?
El término "toolchain" se refiere a la combinación de paquetes de
software usados normalmente para construir y desarrollar para una
arquitectura determinada. El toolchain que tal vez haya oído nombrar
en el canal de IRC #gentoo-hardened consiste en el conjunto de
compiladores GCC (GNU Compiler Collection), binutils, y la librería C
de GNU (glibc).
¿Qué debería usar: el RBAC de Grsecurity o SELinux?
La respuesta a esta pregunta es muy subjetiva, y depende mucho de
sus requisitos por lo que el proyecto Gentoo Hardened solo persigue
proporcionar las tecnologías y dejar la elección de cual usar al
usuario. Esta decisión requiere mucha investigación que esperamos
facilitar con esta documentación. Sin embargo, si tiene preguntas
específicas acerca del modelo de seguridad que proporciona cada una,
no dude en preguntar al desarrollador pertinente en el canal de IRC
o en la lista de correo.
¿Se pueden usar usar Grsecurity, SELinux y PaX al mismo
tiempo?
Sí, es posible combinarlos ya que PaX y algunas características de
Grsecurity funcionan con el RBAC de Grsecurity y SELinux. Solo
habría problemas si solo puede usar un sistema de control de acceso
(sea RBAC o SELinux).
¿Necesito usar algún ajuste en LDFLAGS/CFLAGS para activar la
construcción de hardened?
No, el toolchain actual implementa el equivalente de CFLAGS="-fPIE
-fstack-protector-all -D_FORTIFY_SOURCE=2"
LDFLAGS="-Wl,-z,now -Wl,-z,relro" automáticamente mediante la
especificación definida en GCC y usando los ficheros de especificación
(specfiles) para deshabilitarla lo cual es una solución más apropiada.
Para los usuarios de versiones anteriores de hardened-gcc la mejor
solución es cambiar al perfil hardened y actualizar usando los pasos
descritos en la pregunta ¿Cómo cambio a
Gentoo Hardened?
Nota:
No se recomienda activar los ajustes de hardened manualmente.
|
Nota:
Enviando un ajuste -fno... deshabilitará el ajuste correspondiente,
también -fstack-protector-all y -fstack-protector interferirán
cuando se pasen directamente rompiendo paquetes como glibc.
|
Nota:
Gentoo parchea sus GCCs para permitir que se pasen archivos de
especificaciones mediante una variable de entorno. Actualmente se
instalan varios conjuntos de archivos de especificaciones en los
sistemas Gentoo para permitir a los usuarios de arquitecturas
soportadas activar o desactivar fácilmente la funcionalidad del
toolchain. Para acceder a los archivos de especificación como usuario
puede usar la utilidad gcc-config.
|
¿Puedo añadir -fstack-protector-all o -fstack-protector a CFLAGS en make.conf?
No, seguramente romperán la construcción de muchos paquetes, entre
otros glibc. Es mejor que deje a los perfiles hacer su trabajo.
¿Cómo desactivo la construcción de hardened?
Puede usar gcc-config para hacerlo:
Listado de Código 2.1: Ejemplo de salida de gcc-config |
# gcc-config -l
[1] x86_64-pc-linux-gnu-4.4.4 *
[2] x86_64-pc-linux-gnu-4.4.4-hardenednopie
[3] x86_64-pc-linux-gnu-4.4.4-hardenednopiessp
[4] x86_64-pc-linux-gnu-4.4.4-hardenednossp
[5] x86_64-pc-linux-gnu-4.4.4-vanilla
# gcc-config x86_64-pc-linux-gnu-4.4.4-hardenednopie
# gcc-config x86_64-pc-linux-gnu-4.4.4-hardenednossp
# gcc-config x86_64-pc-linux-gnu-4.4.4-hardenednopiessp
# gcc-config x86_64-pc-linux-gnu-4.4.4-vanilla
|
Nota:
La salida anterior puede variar dependiendo de la versión de gcc y de la
arquitectura que use, también las órdenes necesarias para deshabilitar
pueden variar dependiendo de la salida de la primera orden.
|
Puede conseguir lo mismo cambiando sus CFLAGS:
Importante:
El equipo no recomienda desactivar los ajustes manualmente, ni tampoco
una opción no soportada. Hágalo por su cuenta y riesgo.
|
Para desactivar el uso de SSP en la compilación cuando se usa el
toolchain hardened añada
-fno-stack-protector-all -fno-stack-protector a sus CFLAGS.
Nota:
En las versiones 3.4 de gcc necesitará usar
-fno-stack-protector-all -fno-stack-protector
|
Si quiere deshabilitar el uso de PIE añada -nopie a sus
CFLAGS y a sus LDFLAGS (ya que LDFLAGS se usa sin CFLAGS
cuando se usa gcc para enlazar los ficheros objeto).
Importante:
No se debe usar el ajuste -fno-pic ya que habilita
específicamente el código no PIC. En cambio, si usa -nopie
revertirá al comportamiento "vanilla" de GCC que seguramente era el lo
que deseaba.
|
Si quiere desactivar la opción de unión now (es la que se realiza por
defecto) añada -z,lazy a sus LDFLAGS.
Si desea desactivar la opcion de unión relro (que es la opción por
defecto) añada -z,norelro a sus LDFLAGS.
Nota:
Relro es el valor por defecto en binutils, por lo tanto asegúrese de que
quiere desactivarlo antes de hacerlo.
|
Nota:
Si está interesado en usar CFLAGS específicos para cada paquete con
Portage, entonces estará interesado en leer acerca de el
guión que solar ha desarrollado para gestionar esto
|
Acabo de encontrar el proyecto hardened, ¿tengo que instalar
todo lo de la página del proyecto para instalar Gentoo
Hardened?
No, el Proyecto Gentoo Hardened es una colección de subproyectos que
tienen como meta común la seguridad. Mientras que muchos de estos
proyectos pueden ser instalados conjuntamente, pueden surgir algunos
conflictos debido a las diversas implementaciones de listas de control
de acceso (ACL) que ofrece el proyecto Gentoo Hardened.
¿Por qué no funcionan mis programas cuando uso gcc hardened y
CFLAGS="-O3"?
Se sabe que el uso del ajuste de optimización -O3 puede dar
problemas con el uso de la protección de ruptura de la pila SSP
(Stack-Smashing protector) en construcciones oficiales (vanilla) en
algunas situaciones. Este ajuste de optimización no está
soportado oficialmente y por lo tanto el equipo de hardened aconseja
que no se use. Los problemas de compilación cuando un usuario usa
CFLAGS="-O3" serán marcados como INVALID/CANTFIX y/o serán
ignorados.
¿Cómo cambio al perfil hardened?
Para cambiar su perfil use eselect y selecciónelo de la lista.
Nota:
Se recomienda leer el capítulo seis de la primera parte de
"Instalando el sistema base de Gentoo" en el
Manual de Gentoo para obtener
instrucciones adecuadas de cómo cambiar su perfil.
|
Listado de Código 2.2: Ajustar make.profile |
# eselect profile list
[1] default/linux/amd64/10.0
[2] default/linux/amd64/10.0/desktop
[3] default/linux/amd64/10.0/desktop/gnome *
[4] default/linux/amd64/10.0/desktop/kde
[5] default/linux/amd64/10.0/developer
[6] default/linux/amd64/10.0/no-multilib
[7] default/linux/amd64/10.0/server
[8] hardened/linux/amd64
[9] hardened/linux/amd64/no-multilib
[10] selinux/2007.0/amd64
[11] selinux/2007.0/amd64/hardened
[12] selinux/v2refpolicy/amd64
[13] selinux/v2refpolicy/amd64/desktop
[14] selinux/v2refpolicy/amd64/developer
[15] selinux/v2refpolicy/amd64/hardened
[16] selinux/v2refpolicy/amd64/server
# eselect profile set 8
|
Nota:
La salida anterior puede variar dependiendo de la arquitectura que use.
También las órdenes requeridas para elegir el perfil pueden variar
dependiendo de la salida de la primera orden.
|
Tras configurar su perfil debería recompilar su sistema usando el
toolchain de hardened para tener una base consistente:
Listado de Código 2.3: Cambio al toolchain hardened |
# emerge --oneshot binutils gcc virtual/libc
# gcc-config -l
[1] x86_64-pc-linux-gnu-4.4.4 *
[2] x86_64-pc-linux-gnu-4.4.4-hardenednopie
[3] x86_64-pc-linux-gnu-4.4.4-hardenednopiessp
[4] x86_64-pc-linux-gnu-4.4.4-hardenednossp
[5] x86_64-pc-linux-gnu-4.4.4-vanilla
# gcc-config x86_64-pc-linux-gnu-4.4.4
# source /etc/profile
# emerge -e --keep-going system
# emerge -e --keep-going world
|
Se añade la opción --keep-going para asegurarse de que emerge
no parará en caso de que falle la construcción del algún paquete. Si
esto ocurriera, necesitará asegurarse de que el resto de los paquetes
se construyen. Puede comprobar la salida de emerge para averiguar
qué paquetes no se construyeron.
¿Cómo depuro con gdb?
Hemos escrito un
documento de cómo depurar en Gentoo Hardened (en inglés), por
lo que siguiendo las recomendaciones se debería solucionar el problema
que aparezca.
¿Porqué está desactivado el ajuste jit y orc en el perfil hardened?
JIT significa: compilación en ese momento (Just In Time Compilation) y
consiste en tomar código que debe ser interpretado (como bytecode de Java
o código JavaScript), compilarlo en código binario nativo en memoria
y ejecutar el código resultante. Esto significa que el programa necesita
una sección de memoria en la cual tenga permisos de escritura y ejecución
para escribir el código y luego ejecutarlo, lo cual está desautorizado
por PaX, a menos que el ajuste mprotect esté desactivado para el
ejecutable. Como resultado, desactivamos el uso del ajuste JIT para
evitar (por defecto) protestas y problemas de seguridad. ORC utiliza
compilación "Just In Time" (jit).
Es importante recordad que tener una sección que es escrita y luego
ejecutada puede ser un problema serio de seguridad, ya que un
atacante necesita introducir el código malicioso entre las fases
de escritura y ejecución de esa seccion para ejecutar el código que
desee.
¿Cómo activo el ajuste jit o el orc?
Si lo necesita, le recomendamos activar el ajuste específicamente en
cada paquete que lo necesite usando /etc/portage/package.use
Listado de Código 2.4: Ejemplo de /etc/portage/package.use activando JIT en algunas librerías |
x11-libs/qt-core jit
x11-libs/qt-script jit
x11-libs/qt-webkit jit
|
De todas formas puede activar este ajuste de forma global usando
/etc/make.conf.
Listado de Código 2.5: Ejemplo de /etc/make.conf con JIT activado |
CFLAGS="-O2 -pipe -fomit-frame-pointer -march=native"
CXXFLAGS="${CFLAGS}"
# CUIDADO: Cambiar su CHOST no es algo que se deba hacer a la ligera.
# Por favor consulte http://www.gentoo.org/doc/es/change-chost.xml antes
# de hacer el cambio.
CHOST="x86_64-pc-linux-gnu"
# Estos son los ajustes USE que se usaron además de los ya ofrecidos por
# el perfil usado para la construcción.
USE="jit"
MAKEOPTS="-j2"
GENTOO_MIRRORS="ftp://ftp.udc.es/gentoo/"
SYNC="rsync://rsync.europe.gentoo.org/gentoo-portage"
|
Importante:
Recuerde que si activa código JIT u ORC en PaX necesitará desactivar
mprotect en los binarios que usen ese código, directamente en ellos
o a través de librerías. Eche un vistazo a la
pregunta sobre PaX, Java y JIT para ver como
se hace esto.
|
3.
Preguntas sobre PaX
¿Dónde está la página oficial de PaX?
Aquí está la página oficial de
PaX.
¿Qué documentación hay en Gentoo sobre PaX?
Actualmente la única documentación que hay en Gentoo sobre PaX es
una guía de inicio
rápido de PaX.
¿Cómo funcionan las marcas de PaX?
Las marcas de PaX son una forma de indicarle a PaX qué características
se deben activar (o desactivar) para un determinado binario.
Las características se pueden activar, desactivar o simplemente no
definirlas. El hecho de activarlas o desactivarlas hará que se ignore
las acción del núcleo. Por lo que si se activa una característica, ésta
siempre se usará y por el contrario, desactivándola nunca se usará.
Cuando el estado de una característica no esté definido en el núcleo,
se elegirá su activación o desactivación. Por defecto, el núcleo hardened
activará las características salvo dos excepciones: bien la
característica no está soportada por la arquitectura, bien Pax está
corriendo en modo Soft. En estos casos, la característica será
desactivada.
Nota:
Para tener el modo Soft, su núcleo debe tener activada la característica
y debe activarla usando pax_softmode=1 en la línea de comandos
del núcleo o definiéndola a 1 en /proc/sys/kernel/pax/softmode.
|
Me sale este mensaje: "error while loading shared libraries:
cannot make segment writable for relocation: Permission denied." ¿Qué
significa?
Las relocalizaciones de texto son una forma el la cual las referencias
a las direcciones en el código ejecutable que no son conocidas en
el momento de enlazar son resueltas. Básicamente se escriben las
direcciones apropiadas en tiempo de ejecución, marcando como
escribible el segmento de código para cambiar la dirección y a
continuación se desmarca. Esto puede dar problemas, ya que un
atacante podría intentar explotar código malicioso cuando se realiza
la relocalización de texto para poder escribir código arbitrario en
el segmento de texto que podría ser ejecutado. Como esto también
implica que el código será cargado en una dirección fija (no dependiente
de la posición), puede también ser explotado para saltarse las
características de aleatorización proporcionadas por PaX.
Esto puede realizarse, por ejemplo, añadiendo una librería con
relocalizaciones de texto a las ya cargadas por el ejecutable. Pax
ofrece la opción CONFIG_PAX_NOELFRELOCS para evitarlo. Esta opción se
puede activar de la siguiente forma:
Listado de Código 3.1: Opciones de Menuconfig |
-> Security options
-> PaX
-> Enable various PaX features
-> Non-executable pages
[*] Restrict mprotect()
[*] Allow ELF text relocations
|
Si usa el toolchain de gentoo hardened, al compilar sus programas
creará librerías ELF PIC sin relocalizaciones de texto. Sin embargo,
ciertas librerías todavía contienen relocalizaciones de texto por
varias circunstancias (a menudo son librerías que contienen código en
ensamblador escrito incorrectamente). Esto puede ser una
vulnerabilidad ya que un atacante podría usar las librerías no-PIC
para ejecutar shellcode. Las librerías no-PIC también son malas para
el uso de memoria ya que no siguen el propósito de compartir código en
memoria de las librerías compartidas.
Para evitar este error y permitir que su programa se ejecute, deberá
sacrificar cierta seguridad y permitir generación de código durante la
ejecución para ese programa. La funcionalidad de PaX que le permite
hacer eso se llama MPROTECT. Deberá desactivar MPROTECT en todos los
ejecutables que usen librerías que no sean PIC.
Para buscar en su sistema relocalizaciones de texto, puede usar el
programa scanelf de app-misc/pax-utils. Si quiere más
información sobre cómo usar el paquete pax-utils visite, por
favor, la Guía de Gentoo
de las utilidades PaX.
Nota:
Versiones recientes de sys-apps/portage(>=2.0.53) buscan
automáticamente relocalizaciones de texto y muestran un mensaje de
aviso e incluso abortan el proceso merge dependiendo de las
FEATURES que haya habilitado en su /etc/make.conf.
|
Desde que empecé a usar PaX no puedo trabajar con código Java/JIT,
¿Porqué?
Como parte de su diseño, la máquina virtual de Java crea una cantidad
considerable de código durante la ejecución lo que no hace feliz a
PaX. Sin embargo, con las versiones actuales de portage y java, portage
marcará los binarios de forma automática, de todos modos necesitará
permitir a PaX marcarlos de forma que PaX pueda hacer una excepción con
ellos y tener paxctl instalado para que estas marcas puedan ser aplicadas
a los binarios (y hacer de nuevo emerge para que sean aplicadas).
Esto, por supuesto, no se puede aplicar a todos los paquetes que
enlacen a librerías con código JIT. En este caso hay dos alternativas
para corregir este problema:
Listado de Código 3.2: Activando el marcado en su núcleo |
-> Security options
-> PaX
-> Enable various PaX features
-> PaX Control
[*] Use ELF program header marking
|
Listado de Código 3.3: Install paxctl |
# emerge paxctl
|
Cuando haya realizado emerge de paxctl puede:
Listado de Código 3.4: Desactivar PaX para el binario |
# paxctl -pemrxs /camino/al/binario
|
Esta opción modificará ligeramente la cabecera ELF header para
ajustar correctamente los ajustes PaX en los binarios.
Nota:
Si usa PaX junto con otra implementación de seguridad como el RBAC
de Grsecurity, o SELinux deberá manejar PaX usando las configuraciones
del núcleo provistas para cada implementación.
|
La otra forma es usar su implementación de seguridad para hacer esto
mediante el uso de ganchos (hooks) en el núcleo.
¿Puedo desactivar las características de PaX al arrancar?
Aunque no está recomendado excepto cuando se usa para rescatar el sistema
o para situaciones de depuración, el posible cambiar algunos
comportamientos de PaX en el arranque a través de la línea de comandos
del núcleo.
Pasar la opción pax_nouderef en la línea de comandos del núcleo
desactivará uderef que puede causar problemas en algunos entornos de
virtualización y puede causar algunos errores (en ciertos momentos) como
resultado de dejar al núcleo desprotegido contra dereferencias a espacio
de usuario no deseadas.
Pasar la opción pax_softmode=1 en la línea de comandos del
núcleo activará el modo soft, el cual puede ser útil cuando arranquemos
un sistema no preparado con un núcleo PaX. En el modo soft PaX desactivará
la mayor parte de las características por defecto a menos que se le
indique lo contrario a través de las marcas. De forma similar,
pax_softmode=0 desactivará el modo soft que estaba activado en
la configuración.
4.
Preguntas sobre Grsecurity
¿Cuál es la página oficial de Grsecurity?
Esta es la página oficial de
Grsecurity.
¿Qué documentación está disponible sobre Grsecurity?
La documentación sobre Grsecurity más actual es esta guía rápida de
Grsecurity2.
¿Cómo funciona TPE?
Hemos escrito un documento
con información sobre cómo funciona TPE con diferentes ajustes
(en inglés).
¿Puedo usar Grsecurity con un núcleo reciente que no esté en el
árbol de portage?
Normalmente liberamos una nueva versión de los fuentes hardened no mucho
más tarde de la liberación de un nuevo parche de PaX/Grsecurity por lo
que la mejor opción es simplemente esperar un poco a que el equipo del
núcleo adapter los parches y los pruebe. Recuerde que no damos soporte
a los fuentes del núcleo que no procedan del árbol de portage.
5.
Preguntas sobre SELinux
¿Dónde están las preguntas de uso frecuente relacionadas con
SELinux?
Existe una guía con
Preguntas frecuentes (FAQ) sobre SELinux.
|