
HAL – Анализатор аппаратного обеспечения
HAL [/hel/] — это комплексный фреймворк для обратного проектирования и манипуляции списками соединений (netlist).
Практически все доступные исследования по анализу списков соединений работают с графовым представлением проверяемого списка соединений. В своей основе HAL предоставляет именно это: фреймворк для парсинга списков соединений из произвольных источников, например, ПЛИС или ASIC, в графовое представление, а также необходимые встроенные инструменты для обхода и анализа входящих в него вентилей и цепей.
Наше видение заключается в том, чтобы HAL стал эквивалентом инструментов вроде IDA или Ghidra для аппаратного реверс-инжиниринга. Мы хотим, чтобы HAL обеспечил общую основу для исследователей и аналитиков, улучшив воспроизводимость результатов и абстрагировавшись от повторяющихся базовых задач, таких как парсинг списков соединений и т.д.
HAL активно разрабатывается группой Embedded Security из Института безопасности и конфиденциальности Макса Планка. Помимо нескольких исследовательских проектов, он также используется в наших университетских лекциях «Einführung ins Hardware Reverse Engineering» (Введение в аппаратный реверс-инжиниринг) в Рурском университете Бохума (RUB).
Обратите внимание, что у нас также есть набор современных эталонных схем для оценки методов обратного проектирования списков соединений, доступный в отдельном репозитории.
Этот репозиторий содержит подборку проверенных плагинов:
libertyПодробная документация по возможностям HAL с точки зрения пользователя доступна в нашей Вики. Кроме того, мы предоставляем полную документацию по C++ API и Python API.
Инструкции по сборке HAL см. на соответствующей странице в нашей Вики.
Установите HAL или соберите его и запустите GUI с помощью hal -g. Вы можете просмотреть все доступные опции с помощью hal [--help|-h]. Мы включили несколько примеров проектов в подкаталог examples. Чтобы начать работу с примером проекта, импортируйте его через Import Project из главного меню или перетащив zip-файл в область OPEN PROJECT на экране приветствия. После этого появится всплывающее окно с запросом каталога с правами на запись, в котором HAL создаст каталог проекта и распакует файлы. Не используйте внешние инструменты для распаковки, так как вносятся изменения, чтобы список соединений и библиотека вентилей были найдены при следующем открытии проекта.
Если вы хотите открыть собственный список соединений Verilog или VHDL, вместо этого выполните Import Netlist. Это сработает только в том случае, если в plugins/gate_libraries/definitions есть соответствующая библиотека вентилей, или вы укажете библиотеку вентилей вручную. Инструкции по созданию собственной библиотеки вентилей и другие полезные руководства см. в вики.
Следующий пример кода относится к примеру fsm.
Используйте встроенную оболочку Python или окно Python-скрипта для взаимодействия. Оба поддерживают (ограниченную) функцию автозаполнения.
Давайте выведем все таблицы поиска и напечатаем их булевы функции:
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("")
Для примера списка соединений fsm.vhd выводится:
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)
Вы можете внести свой вклад в развитие HAL. Не стесняйтесь отправлять новые pull request через github. Пожалуйста, перед этим запустите статические проверки + clang format. Вы также можете установить эти проверки как git-хуки перед любым коммитом.
Чтобы установить hook clang-format, установите git-hooks и выполните:
git hooks --install
Запустите сборку Docker через:
docker-compose run --rm hal-build
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" --no-merges
Если вы используете HAL в академическом контексте, процитируйте фреймворк, используя ссылку ниже:
@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}},
}
Вы также можете включить оригинальную статью. Однако отметим, что HAL значительно изменился по сравнению с исходным прототипом, описанным в статье. Поэтому мы предпочитаем цитировать вышеуказанную запись.
@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}}
}
Чтобы получить обзор задач, которые мы собираемся решить с помощью HAL, вы можете посмотреть наше выступление на 36C3.
HAL распространяется под лицензией MIT для поощрения сотрудничества с другими исследовательскими группами и вклада со стороны промышленности. Пожалуйста, обратитесь к файлу лицензии для получения дополнительной информации.
HAL — это программное обеспечение, по крайней мере, уровня «альфа». Используйте на свой страх и риск. Мы не поощряем любое вредоносное использование нашего инструментария.