Checksec – una herramienta para analizar ejecutables contra “exploitation”

Checksec es un bash script para analizar la implementación de medidas contra explotación de ejecutables (PIE, RELRO, PaX, Canaries, ASLR, Fortify Source). Fue esrito originalmente por Tobias Klein y el código fuente original se encuentra aquí: http://www.trapkit.de/tools/checksec.html.

Instalación

Lo ideal es clonar el “repository” de la herramienta y copiar el archivo checksec al directorio /usr/bin

arturo@imperial-star:~$ git clone https://github.com/slimm609/checksec.sh.git
arturo@imperial-star:~$ sudo cp checksec.sh/checksec /usr/bin

o para descargar una versión en particular del software:

arturo@imperial-star:~$ git clone --depth 1 --branch 2.4.0 https://github.com/slimm609/checksec.sh.git
arturo@imperial-star:~$ sudo cp checksec.sh/checksec /usr/bin

Otra alternativa es instalar el software con sudo apt-get install checksec, el problema es que la versión que se instale puede ser una versión muy vieja.

Uso

El uso de la herramienta es sumamente sencillo, y el resultado de el análisis de algún ejecutable puede ser presentado en varios formatos (cli,csv,xml,json).

A continuación un ejemplo sobre como analizar un ejecutable (/usr/bin/git).

arturo@imperial-star:~$ checksec --file=/usr/bin/git
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH  Symbols     FORTIFY Fortified   Fortifiable FILE
Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH   No Symbols    Yes   10      21      /usr/bin/git

Lo ideal es analizar de manera automatizada los ejecutables, por ejemplo durante la creación del paquete de instalación del software. Para esto hay que seleccionar el formato del resultado del análisis que sea más conveniente para uno y analizarlo de manera sistemática para asegurar que cada uno de los “binaries” contenidos en el paquete de instalación tenga implementadas todas las medidas contra explotación.

A continuación un ejemplo de como generar el resultado del análisis en formato csv (comma separated values).

arturo@imperial-star:~$ checksec --file=/usr/bin/git --output=csv
Full RELRO,Canary found,NX enabled,PIE enabled,No RPATH,No RUNPATH,No Symbols,Yes,10,21,/usr/bin/git

Implementación de medidas contra la explotación

RELRO

$ gcc -g -Wl,-z,relro,-z,now -o test testcase.c

Mas info aquí.

Stack canary

-fstack-protector-strong

Mas info aquí.

No eXecute (NX)

Al parecer por default los ejecutables generados con gcc tienen activada esta opción. Ver esta pregunta en stackoverflow.

Mas info aquí.

PIE, PIC

Al compilar -fpie, -fPIC o -fpic dependiendo de lo que se requiera.

Al linkear otras librerías para un ejecutable -pie.

Mas info aqui, aquí , aquí, aquí y aquí.

RPATH, RUNPATH

Es posible generar archivos sin RPATH/RUNPATH, por ejemplo asignando true a la variable CMAKE_SKIP_RPATH de CMAKE al generar una versión “release”.

if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
  set(CMAKE_SKIP_RPATH TRUE)
endif()

Mas info aqui.

Usando el comando chrpath también es posible hacerlo después de haber generado el archivo binario.

SYMBOLS

Al generar una versión “release” de un archivo binario los “debug symbols” no serán incluidos, sin embargo otros símbolos sí lo serán. Con el comando strip es posible eliminar esos símbolos.

Para eliminar símbolos de un ejecutable:

strip -s path/executable

Para eliminar símbolos de una librería

strip --strip-unneeded path/libname.so

FORTIFY

-D_FORTIFY_SOURCE=2

Mas info aqui.

Enlaces

Autor: Arturo González

mexicano, ingeniero, programador

Deja un comentario