Gentoo Logo

Preguntas de Uso Frecuente de Gentoo Hardened

Contenido:

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 pueden interferir cuando son pasados directamente.

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.

¿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

Para desactivar la construcción PIE, cambie al perfil hardenednopie:
# gcc-config x86_64-pc-linux-gnu-4.4.4-hardenednopie

Para desactivar el soporte SSP y cambiar al perfil
hardenednossp
# gcc-config x86_64-pc-linux-gnu-4.4.4-hardenednossp
Para desactivar el soporte SSP y PIE del perfil hardenednopie:
# gcc-config x86_64-pc-linux-gnu-4.4.4-hardenednopiessp
Para desactivar el soporte hardened para el perfil vanilla:
# gcc-config x86_64-pc-linux-gnu-4.4.4-vanilla
Necesita ejecutar este comando en las sesiones activas para definir los cambios

Nota: La salida anterior puede variar dependiendo de la versión de gcc y de la arquitectura que use, también los comandos necesarios para deshabilitar pueden variar dependiendo de la salida del primer comando.

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 (Reemplace 8 por el perfil hardened deseado)

Nota: La salida anterior puede variar dependiendo de la arquitectura que use. También los comandos requeridos para elegir el perfil pueden variar dependiendo de la salida del primer comando.

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
Asegúrese de que se está usando la cadena de herramientas hardened (la versión de gcc puede variar):

# 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
Si no se ha seleccionado la versión hardened, selecciónela
# gcc-config x86_64-pc-linux-gnu-4.4.4
# source /etc/profile
Continúe haciendo emerge del sistema
# 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.

¿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 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.

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?

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.
#Si tiene más especificaciones use, debería bastar añadir jit al final
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 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.



Imprimir

Página actualizada 2011-3-27

Sumario: Preguntas frecuentes surgidas en el canal IRC #gentoo-hardened y la lista de correos gentoo-hardened.

Adam Mondl
Autor

solar
Colaborador

Guillaume Destuynder
Colaborador

El equipo de PaX
Colaborador

klondike
Colaborador

Magnus Granberg
Colaborador

Anthony G. Basile
Colaborador

Jaime Gascón Romero
Traductor

José María Alonso
Traductor

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.