Gentoo Logo

Depuración en Gentoo Hardened

Contenido:

1.  Resolviendo la cuestión '??'

Cuando esté depurando, probablemente se haya encontrado que GDB puede que no muestre las direcciones, y en su lugar aparezcan líneas con '??' donde debería aparecer el símbolo. Esto puede deberse a dos cosas diferentes.

La primera causa es que su versión de GDB es demasiado antigua y no tiene en cuenta que las direcciones son relativas. Esto debería estar corregido en la versión actual estable de GDB de modo que debería actualizarla. Otra forma de corregir el problema es aplicar la solución 3.

La segunda razón puede ser que su núcleo hardened está ocultando los mapeos. Este problema es bien conocido y ha sido corregido por el equipo de desarrollo principal por lo que será corregido en futuras versiones de hardened-sources. De todos modos, hasta que esta corrección llegue al árbol y sea estabilizada, puede aplicar cualquiera de las soluciones.

Solución 1: Deshabilitar RANDMMAP en el binario

Una solución consiste en deshabilitar la característica RANDMMAP con paxctl en ese binario en particular. Al hacer esto, Grsec deshabilitará la protección del mapeo para ese binario ya que no tiene ningún sentido conservarla en este caso. Esto se traduce en un entorno más seguro pero también se alejará de la forma en que el binario se ejecutaría en un entorno real.

Listado de Código 1.1: Deshabilitar RANDMMAP con paxctl

# paxctl -r binario

Solución 2: Deshabilitando la opción para ocultar los mapeos

Otra forma de corregir el problema es deshabilitar la opción que oculta las direcciones en los ejecutables protegidos por PaX para evitar ataques basados en esa información. Esta opción puede facilitar las cosas a un atacante hasta que se habilite de nuevo aunque también significa que el entorno será lo más parecido al entorno real de ejecución.

Listado de Código 1.2: Deshabilitar la ocultación del mapeo

Address Space Protection --->
 [ ] Remove addresses from /proc/<pid>/[smaps|maps|stat]

Solución 3: Enlazar un binario no PIE

Una última solución consiste en deshabilitar la última fase de enlazado pie en el momento de la compilación usando -nopie. Las compilaciones anteriores pueden seguir usando -fPIE de forma normal (lo cual es también el comportamiento por defecto del compilador hardened), así, su ejecutable está en la situación más próxima a la realidad ya que el enlazado final creará un ejecutable normal.
Intente añadir -nopie a LDFLAGS si construye los binarios usando emerge.

2.  Usar puntos de ruptura (breakpoints)

Puede encontrarse con que PaX evita que GDB defina los puntos de ruptura software, dependiendo de cómo se haya configurado el núcleo. Esto incluye el punto de ruptura en la función principal (main) en la que necesitará comenzar. Existen dos formas de evitar esto con diferentes efectos y restricciones para resolverlo.

Solución 1: Eliminando los ajustes RANDEXEC y MPROTECT

La primera solución consiste en hacer que PaX deshabilite las características RANDEXEC y MPROTECT para el binario que se quiere depurar. Para hacer esto tendrá que hacer que paxctl utilice las opciones m y x en el ejecutable. La opción x se utiliza por defecto, por lo que basta con hacer:

Listado de Código 2.1: Deshabilitar MPROTECT

# /sbin/paxctl -m binario

Después de esto, GDB debería poder añadir puntos de ruptura software en el binario, si por alguna razón no puede hacerlo, intente deshabilitar las características SEGMEXEC y PAGEEXEC (opciones s y p respectivamente).

Listado de Código 2.2: Deshabilitar SEGMEXEC y PAGEEXEC

# /sbin/paxctl -ps binario

Abajo mostramos qué es lo que ocurre a un nivel inferior cuando se añade un punto de ruptura software, y porqué PaX desactiva esto. Necesita conocer a grandes rasgos cómo funciona un procesador para comprenderlo. Esto no es necesario para resolver el problema por lo que si quiere puede ignorarlo.

Cuando el depurador añade un punto de ruptura software, cambia la instrucción en la imagen de memoria del ejecutable para que sea una instrucción de punto de ruptura (en los procesadores x86 y amd64 estas instrucciones son bp y bu). Esta instrucción detiene el procesador y le da el control al depurador y tiene la ventaja de que se puede colocar en un número ilimitado de puntos del programa. Debido a que PaX no permite la escritura en la memoria ejecutable por razones de seguridad, es imposible que el depurador modifique el código y añada el punto de ruptura.

Solución 2: Usando puntos de ruptura hardware

Otra solución consiste en el uso de puntos de ruptura hardware, éstos no requieren ningún cambio en el comportamiento de PaX, pero normalmente su uso está limitado (por ejemplo a un máximo de cuatro en los procesadores x86 y amd64 incluyendo los puntos de vigilancia (watchpoints) de direcciones), además tienen el problema de que necesitan que el programa ya esté en ejecución para que se puedan añadir (aunque existe algún trabajo en proceso para corregir esto en GDB).

Para definirlos, utilice la orden hbreak en lugar de break.

Debajo mostramos qué ocurre a un nivel inferior cuando se añade un punto de ruptura hardware. Necesita conocer a grandes rasgos cómo funciona un procesador para comprenderlo. Esto no es necesario para resolver el problema por lo que si quiere puede ignorarlo.

Cunado un depurador añade un punto de ruptura hardware, cambia algunos de los registros del procesador (en los procesadores x86 y amd64 estos registros se llaman Dr) por lo que el procesador se detiene cuando se accede a cierta dirección (bien sea para leer su contenido, escribir en ella o ejecutar el código que contiene). Como resultado no hay porqué escribir ningún dato en la memoria solucionando el problema que se planteaba con los puntos de ruptura software, pero también se limita el número de puntos de ruptura disponibles.

3.  Restaurando el fichero después del depurado

Después del depurado, puede que querer restaurar el sistema a su estado normal, si usó paxctl puede dejar las opciones como estaban por defecto usando la opción -z. Debido a que la opción -z pondrá a cero todas las opciones, también se querrá mantener la emulación trampolín deshabilitada. Esto se realiza con la opción -e.

Listado de Código 3.1: Volviendo a dejar las opciones a sus valores por defecto. Mantener deshabilitada la emulación trampolín

# paxctl -ze binario


Imprimir

Página actualizada 28 de abril, 2012

Sumario: En este documento estudiaremos las formas de realizar un depurado binario correcto cuando estemos usando un núcleo hardened y una cadena de herramientas con PaX/Grsec, PIE y SSP.

Francisco Blas Izquierdo Riera
Autor

Hugo Mildenberger
Contributor

José María Alonso
Traductor

Donate to support our development efforts.

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