
HAL [/hel/] es un framework integral de ingeniería inversa y manipulación de netlist.
Prácticamente toda la investigación disponible sobre análisis de netlist opera sobre una representación basada en grafos de la netlist bajo inspección. En su núcleo, HAL proporciona exactamente eso: un framework para analizar netlist de fuentes arbitrarias, por ejemplo, FPGAs o ASICs, en una representación de netlist basada en grafos y proporcionar las herramientas integradas necesarias para el recorrido y análisis de las puertas y nets incluidas.
Nuestra visión es que HAL se convierta en el equivalente de herramientas como IDA o Ghidra para la ingeniería inversa de hardware. Queremos que HAL proporcione una base común para investigadores y analistas para mejorar la reproducibilidad de los resultados de investigación y abstraer tareas básicas recurrentes como el análisis de netlists, etc.
HAL es desarrollado activamente por el grupo de Seguridad Integrada del Instituto Max Planck para la Seguridad y la Privacidad. Además de múltiples proyectos de investigación, también se utiliza en nuestra conferencia universitaria "Einführung ins Hardware Reverse Engineering" (Introducción a la Ingeniería Inversa de Hardware) en la Universidad del Ruhr en Bochum (RUB).
Tenga en cuenta que también tenemos un conjunto de circuitos de referencia modernos de última generación para la evaluación de técnicas de ingeniería inversa de netlist disponibles en un repositorio separado.
Este repositorio contiene una selección de complementos seleccionados:
libertyUna documentación completa de las características de HAL desde la perspectiva del usuario está disponible en nuestra Wiki. Además, proporcionamos documentación completa de la API de C++ y API de Python.
Para instrucciones sobre cómo compilar HAL, consulte la página dedicada en nuestra Wiki.
Instale HAL o compile HAL e inicie la GUI con hal -g. Puede listar todas las opciones disponibles con hal [--help|-h].
Hemos incluido algunos proyectos de ejemplo en el subdirectorio examples. Para comenzar con un proyecto de ejemplo, debe importarlo
a través de Import Project desde el menú principal o arrastrando el archivo comprimido en el área OPEN PROJECT de la pantalla de bienvenida.
Al hacerlo, aparecerá una ventana emergente solicitando un directorio con permisos de escritura donde HAL creará el directorio del proyecto y descomprimirá
los archivos. No utilice herramientas externas para descomprimir, ya que se realizan adaptaciones para que la netlist y la biblioteca de puertas
se encuentren la próxima vez que se abra el proyecto.
En caso de que desee abrir su propia netlist Verilog o VHDL, debe ejecutar Import Netlist en su lugar. Esto solo funcionará si
hay una biblioteca de puertas correspondiente en plugins/gate_libraries/definitions o si proporciona la biblioteca de puertas manualmente.
Para obtener instrucciones sobre cómo crear su propia biblioteca de puertas y otros tutoriales útiles, eche un vistazo a la wiki.
El siguiente código de ejemplo se refiere al ejemplo fsm.
Use el shell de Python integrado o la ventana de scripts de Python para interactuar. Ambos cuentan con funcionalidad de autocompletado (limitada).
Listemos todas las tablas de búsqueda e imprimamos sus funciones booleanas:
for gate in netlist.get_gates():
if "LUT" in gate.type.name:
print("{} (id {}, type {})".format(gate.name, gate.id, gate.type.name))
print(" {}-to-{} LUT".format(len(gate.type.input_pins), len(gate.type.output_pins)))
boolean_functions = gate.boolean_functions
for name in boolean_functions:
print(" {}: {}".format(name, boolean_functions[name]))
print("")
Para la netlist de ejemplo fsm.vhd esto imprime:
FSM_sequential_STATE_REG_0_i_3_inst (id 4, type LUT6)
6-to-1 LUT
O: (!I1 & !I2 & I3 & !I4 & I5) | (I0 & !I2) | (I0 & I1) | (I0 & I3) | (I0 & I4) | (I0 & I5)
FSM_sequential_STATE_REG_0_i_2_inst (id 3, type LUT6)
6-to-1 LUT
O: (I2 & I3 & I4 & !I5) | (I1 & !I5) | (I1 & !I4) | (I1 & !I3) | (I0 & I1) | (I1 & I2)
FSM_sequential_STATE_REG_1_i_3_inst (id 6, type LUT6)
6-to-1 LUT
O: (!I1 & I4 & !I5) | (!I1 & !I3 & I4) | (I0 & I4 & !I5) | (I0 & !I3 & I4) | (!I1 & I2 & I4) | (I0 & I2 & I4) | (!I2 & !I5) | (!I2 & !I4) | (!I2 & !I3) | (!I0 & !I4) | (!I0 & !I2) | (!I0 & !I1) | (I1 & !I4) | (I1 & !I2) | (I0 & I1) | (I3 & !I5) | (I3 & !I4) | (!I0 & I3) | (I1 & I3) | (I2 & I3) | (!I4 & I5) | (!I3 & I5) | (!I0 & I5) | (I1 & I5) | (I2 & I5)
FSM_sequential_STATE_REG_1_i_2_inst (id 5, type LUT6)
6-to-1 LUT
O: (!I0 & I1 & !I2 & I3 & I4 & !I5) | (I0 & !I2 & I3 & I4 & I5)
OUTPUT_BUF_0_inst_i_1_inst (id 18, type LUT1)
1-to-1 LUT
O: !I0
OUTPUT_BUF_1_inst_i_1_inst (id 20, type LUT2)
2-to-1 LUT
O: (I0 & !I1) | (!I0 & I1)
Te damos la bienvenida a contribuir al desarrollo de HAL. No dudes en enviar una nueva solicitud de extracción (pull request) a través de GitHub.
Considere ejecutar las verificaciones estáticas + clang format antes de eso.
También puede instalar estas verificaciones como ganchos de git (git hooks) antes de cualquier commit.
Para instalar el gancho clang-format, instale git-hooks y ejecute:
git hooks --install
Inicie la compilación Docker con:
docker-compose run --rm hal-build
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" --no-merges
Si utiliza HAL en un contexto académico, cite el framework utilizando la referencia a continuación:
@misc{hal,
author = {{Embedded Security Group}},
publisher = {{Max Planck Institute for Security and Privacy}},
title = {{HAL - The Hardware Analyzer}},
year = {2019},
howpublished = {\url{https://github.com/emsec/hal}},
}
Siéntase libre de incluir también el artículo original. Sin embargo, notamos que HAL ha cambiado masivamente desde su prototipo original descrito en el artículo. Por lo tanto, preferimos citar la entrada anterior.
@article{2018:Fyrbiak:HAL,
author = {Marc Fyrbiak and Sebastian Wallat and Pawel Swierczynski and Max Hoffmann and Sebastian Hoppach and Matthias Wilhelm and Tobias Weidlich and Russell Tessier and Christof Paar},
title = {{HAL-} The Missing Piece of the Puzzle for Hardware Reverse Engineering, Trojan Detection and Insertion},
journal = {IEEE Transactions on Dependable and Secure Computing},
year = {2018},
publisher = {IEEE},
howpublished = {\url{https://github.com/emsec/hal}}
}
Para obtener una visión general de los desafíos que nos propusimos resolver con HAL, no dudes en ver nuestra charla en 36C3.
HAL está licenciado bajo la Licencia MIT para fomentar la colaboración con otros grupos de investigación y contribuciones de la industria. Consulte el archivo de licencia para obtener más información.
HAL es, como máximo, software de calidad alfa. Úselo bajo su propio riesgo. No fomentamos ningún uso malicioso de nuestro conjunto de herramientas.