
Fuzzer para controladores del kernel de Linux
Este repositorio contiene todas las fuentes (incluyendo scripts de configuración) que necesitas para poner difuze en funcionamiento.
Ubuntu >= 14.04.5 LTS
Consulta el readme
Como se explica en nuestro artículo, hay dos componentes principales de difuze: Recuperación de Interfaz y Motor de Fuzzing
El mecanismo de recuperación de interfaz se basa en pases de análisis de LLVM. Cada paso de la recuperación de interfaz está escrito como pases individuales. Sigue las instrucciones a continuación para poner en funcionamiento la Recuperación de Interfaz.
Este paso se encarga de instalar LLVM y c2xml:
Primero, asegúrate de tener libxml (requerido para c2xml):
sudo apt-get install libxml2-dev
sudo pip install lxml
A continuación, hemos creado un único script que descarga y construye todas las herramientas necesarias.
cd helper_scripts
python setup_difuze.py --help
usage: setup_difuze.py [-h] [-b TARGET_BRANCH] [-o OUTPUT_FOLDER]
optional arguments:
-h, --help show this help message and exit
-b TARGET_BRANCH Branch (i.e. version) of the LLVM to setup. Default:
release_38 e.g., release_38
-o OUTPUT_FOLDER Folder where everything needs to be setup.
Ejemplo:
python setup_difuze.py -o difuze_deps
Para completar la configuración también necesitas modificaciones en tu variable de entorno PATH local. El script de configuración te dará los cambios exactos que necesitas hacer.
Esto depende de la finalización exitosa de la Configuración. Tenemos un único script que compila todo, de nada.
cd InterfaceHandlers
./build.sh
Esto depende de la finalización exitosa de la Compilación. Para ejecutar los componentes de Recuperación de Interfaz en controladores del kernel, primero necesitamos convertir los controladores a bitcode de LLVM.
Primero, necesitamos tener un kernel compilable. Esto significa que deberías ser capaz de compilar el kernel usando la configuración de compilación habitual, es decir, make.
Primero capturamos la salida del comando make, de esta salida extraemos el comando de compilación exacto.
makebear make <all the options to make>
Ejemplo: bear make -j8Esto generará un archivo compile_commands.json en el directorio actual.
Simplemente pasa V=1 y redirige la salida al archivo.
Ejemplo:
make V=1 O=out ARCH=arm64 > makeout.txt 2>&1
NOTA: NO USES MÚLTIPLES PROCESOS, es decir, -j. Ejecutar en modo multiproceso desordenará el archivo de salida ya que múltiples procesos intentan escribir en el archivo de salida.
Eso es todo. A continuación, en el siguiente paso nuestro script toma el makeout.txt generado y ejecuta la Recuperación de Interfaz en todos los controladores reconocidos.
Todos los diversos pasos de la Recuperación de Interfaz están envueltos en un único script helper_scripts/run_all.py
Cómo ejecutar:
cd helper_scripts
python run_all.py --help
usage: run_all.py [-h] [-l LLVM_BC_OUT] [-a CHIPSET_NUM] [-m MAKEOUT]
[-c COMPJSON] [-g COMPILER_NAME] [-n ARCH_NUM] [-o OUT]
[-k KERNEL_SRC_DIR] [-isclang] [-clangp CLANG_PATH]
[-llvmlinkp LLVMLINK_PATH] [-skb] [-skl] [-skp] [-skP]
[-ske] [-skI] [-ski] [-skv] [-skd] [-f IOCTL_FINDER_OUT]
optional arguments:
-h, --help show this help message and exit
-l LLVM_BC_OUT Destination directory where all the generated bitcode
files should be stored.
-a CHIPSET_NUM Chipset number. Valid chipset numbers are:
1(mediatek)|2(qualcomm)|3(huawei)|4(samsung)
-m MAKEOUT Path to the makeout.txt file.
-c COMPJSON Path to the compile_commands_json generated by Bear.
-g COMPILER_NAME Name of the compiler used in the makeout.txt, This is
needed to filter out compilation commands. Ex: aarch64
-linux-android-gcc
-n ARCH_NUM Destination architecture, 32 bit (1) or 64 bit (2).
-o OUT Path to the out folder. This is the folder, which
could be used as output directory during compiling
some kernels.
-k KERNEL_SRC_DIR Base directory of the kernel sources.
-isclang flag to indicate that clang was used to built the
kernel
-clangp CLANG_PATH Absolute path to the clang binary (if not provided,
the one available in the path will be used)
-llvmlinkp LLVMLINK_PATH
Absolute path to the llvm-link binary (if not
provided, the one available in the path will be used)
-skb Skip LLVM Build (default: not skipped).
-skl Skip Dr Linker (default: not skipped).
-skp Skip Parsing Headers (default: not skipped).
-skP Skip Generating Preprocessed files (default: not
skipped).
-ske Skip Entry point identification (default: not
skipped).
-skI Skip Generate Includes (default: not skipped).
-ski Skip IoctlCmdParser run (default: not skipped).
-skv Skip V4L2 ioctl processing (default: not skipped).
-skd Skip Device name finder (default: not skipped).
-f IOCTL_FINDER_OUT Path to the output folder where the ioctl command
finder output should be stored.
El script compila, enlaza y ejecuta la Recuperación de Interfaz en todos los controladores reconocidos, por lo que puede tomar un tiempo considerable (45 min-90 min).
El script anterior realiza las siguientes tareas en modo multiprocesador para hacer uso de todos los núcleos de la CPU:
Todos los archivos de bitcode generados se colocarán en la carpeta proporcionada al argumento -l.
Este paso toma un tiempo considerable, dependiendo del número de núcleos que tengas.
Por lo tanto, si ya has realizado este paso, puedes saltarlo pasando -skb.
Esto realiza el enlace, recorre todos los archivos de bitcode e identifica los archivos de bitcode relacionados que necesitan ser enlazados y los enlaza (usando llvm-link) en un archivo de bitcode consolidado (que se almacenará junto al archivo de bitcode correspondiente).
Similar al paso anterior, puedes saltar este paso pasando -skl.
Este paso busca las declaraciones de puntos de entrada en los archivos de encabezado y almacena su configuración en el archivo: hdr_file_config.txt bajo el directorio de compilación de LLVM.
Para saltar: -skp