Depuración en Gentoo Hardened
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
|
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 logotipo y nombre de Gentoo.
|