Этот репозиторий реализует инструмент, чтобы убедиться, что исправления гарантированы для отслеживания эквивалентности (PATE).
Цель состоит в том, чтобы доказать, что патчи безопасности, применяемые к двоичным файлам, только удаляют только плохое поведение или иным образом характеризуют их именно для разработчика патча. Verifier поддерживает двоичные файлы PowerPC и AARCH32 (в настоящее время требует статически связанных бинарных файлов эльфов).
Самый быстрый способ начать - создать изображение Docker и использовать инструмент через Docker. Для более подробных инструкций по сборке см. В разделе разработки ниже.
Во -первых, создайте изображение Docker с командой:
Docker Build -Platform Linux/AMD64. -t Pate
Далее запустите Verifier на примере:
Docker run -rm -it -pplatform linux/amd64 -v "$ (pwd)"/tests/integration/packet/exe:/target pate -original /target/packet.exe -patched /target/packet.patched.exe -s parse_packet
Verifier принимает следующие аргументы командной строки:
-h,-Помогите показать этот текст справки
-О,-оригинальный Exe Original Binary
-p,-исправленная exe patched byrinar
-B,-информация о блоке блока блока блока файла, касающаяся двоичных файлов
-s,-StartyMbol Arg STARNERAL Analysis из функции с этим символом
-Д,-NodScovery не динамически обнаруживайте пары функций на основе
вызовы
-Специалист Arg SMT-решатель для использования для решения проверки
условия. Один из CVC4, YECES или Z3
(по умолчанию: yices)
-Goal-Timeout arg Время ожидания для проверки индивидуальных целей за считанные секунды
(По умолчанию: 300)
-Гивристический время, а также время ожидания проверки эвристических целей в секундах
(По умолчанию: 10)
-Хранилистые Хиньты Арг
Проанализируйте спецификацию Anvill для обнаружения кода
Подсказки
-Печатные холмы Арг
Проанализируйте спецификацию Anvill для обнаружения кода
Подсказки
-Морожены-пробабилистские Hints arg
Анализировать файл json, содержащий вероятностную функцию
Имя/Адрес
-Печатные пробабилистские-Хинты Arg
Анализировать файл json, содержащий вероятностную функцию
Имя/Адрес
-Хранилище-функциональные HINT-HINT-HINTS ARG
Анализировать файл CSV, содержащий имя функции/адрес
Подсказки
-Печатный CSV-функциональный Hints Arg
Анализировать файл CSV, содержащий имя функции/адрес
Подсказки
-Оригинал-BSI-HINTS ARG анализируется файл JSON, содержащий имя функции/адрес
Подсказки
-Периодиат-BSI-HINTS ARG анализ файла JSON, содержащий имя функции/адрес
Подсказки
----
двоичные файлы
-V,-условно Arg verbosity of holduring outpult (по умолчанию: Info)
-Save-Macaw-CFGS Dir Save Macaw CFGS в предоставленный каталог
-Файл-файл-файл-срезок
Сохранить взаимодействие с решателем SMT во время символического
выполнение этого файла
-Поджак-Summary-Json файл
Файл, чтобы сохранить интересные результаты в JSON
формат
-файл файла-log-файла для сохранения журналов отладки в
-e,-Errorrormode arg verifier режим обработки ошибок
(по умолчанию: drotonanyfailure)
-r,-Rescopemode arg Переменная
(по умолчанию: throwoneqrescopefailure)
-Недоедованные функции. Пропустить анализ функций без символов
-Skip-Divergent-Control-Flow
<Проверка>
-Target-equiv-regs Arg вычисляют условие эквивалентности, достаточное для
установить равенство в данных регистрах после
Toplevel entrypoint возвращается. <Проверка>
-Сегменты Arg Scip (0-индексированные) при загрузке эльфа
-Json-Toplevel Run Toplevel в режиме json-output (интерактивный режим
только)
-только для чтения сегменты ARG Mark Segments как только для чтения (0-индексированные) при загрузке
Эльф
-Скрипт-имени файла Сохраните CFGS MACAW для предоставленного каталога
-Assume-Stack-Scope Добавьте дополнительные предположения о рамке стека
Во время вызовов функций (небезопасно)
-Синьер-нагрузки, не поднимайте ни один из данных типов предупреждения
-Всегда класс-возврат всегда разрешают сбои классификатора, предполагая
Функция возвращается, если возможно.
В разделе быстрого запуска описана команда для запуска Verifier на тестовом примере с помощью контейнера Docker. Этот раздел будет охватывать некоторые полезные команды для других сценариев.
Если у вас есть tar файл изображения Docker Verifier, вы можете установить его, используя команду:
Docker Load -i /path/to/pate.tar
Чтобы запустить проверчик через Docker после этого:
Docker run -rm -it -platform linux/amd64 pate -help
Чтобы использовать проверку с Docker, полезно отобразить каталог на вашей локальной файловой системе в контейнер Docker, чтобы иметь возможность сохранять выходные файлы. Предполагая, что ваши оригинальные и исправленные двоичные файлы являются original.exe patched.exe
MKDIR VERIFIERDATA
cp inriginal.exe patched.exe verifierdata/
Docker run -rm -it -platform linux/amd64
-v `pwd`/verifierdata`:/verifierdata pate
-ОРИГИНАЛЬНЫЙ /ВЕРИФИРДАТА/ORIGINAL.EXE
-Печата /verifierdata/patched.exe
--Proof-summary-json /verifierdata/report.json
-log-file /verifierdata/pate.log
-САЙС-МАКАУ-КФГС /VERIFIERDATA /CFGS
Эта команда запустит проверку на двух двоичных файлах и бросит вас в цикл чтения-eval-print, где вы можете интерактивно исследовать вывод верификатора.
По умолчанию верификатор начинает проверять из официальной точки входа в программу. Это часто не очень полезно (и может быть проблематичным для сложных двоичных файлов с большим _start , который вызывает проблему для нашего обнаружения кода). Кроме того, для изменений с известным (или, по крайней мере, ожидаемым) объемом воздействия, анализ только пораженных функций значительно быстрее. Чтобы вместо этого указать точку входа анализа, передача опции -s <function_symbol> запустит анализ из функции, соответствующей данному символу. Обратите внимание, что это требует, чтобы символы функции были предоставлены для двоичных файлов (либо в качестве встроенных символов отладки, либо отдельно в одном из форматов подсказки).
Хотя это невыразится, иногда полезно рассматривать функциональный вызов как нето. Например, игнорирование больших функций, которые не изменились и вряд ли повлияют на правильность (EG, крупные криптографические функции из доверенных библиотек), может значительно повысить производительность. Чтобы использовать эту функцию, передайте файл конфигурации в Verifier, используя опцию --blockinfo , гарантируя, что файл конфигурации включает в себя следующие директивы:
Игнорировать оригинальные функции = [<drade>, ...] Игнорируйте, перечисленные функции = [<drade>, ...]
где каждый из списков является списком адресов функций для игнорирования. Хотя два списка указаны отдельно, они почти наверняка должны быть «выровнены» между двумя двоичными файлами (т. Е. Игнорирование функции в исходном бинарном файле, вероятно, означает, что соответствующая функция в бинарном двоике также должна игнорироваться).
Проверитель получает выгоду от метаданных карликов двумя способами:
Чтобы ввести метаданные карлика в двоичные файлы без него (например, разряженные двоичные файлы), мы рекомендуем использовать инструмент с надписью карлика. В качестве примера использования dwarf-writer через изображение докера, предполагая существование цели ( target-binary.exe ) и метаданных в формате Anvill JSON ( target-binary.exe.json ):
Docker Load -i DWARF-WRITER-DOCKER.TAR
Mkdir dwarfwriterdata
CP Target-binary.exe target-binary.exe.json dwarfwriterdata/
Docker Run -rm -it -v `pwd`/dwarfwriterdata:/dwarfwriterdata dwarf -writer
-anvill /dwarfwriterdata/target-binary.exe.json
/Dwarfwriterdata/target-binary.exe
/Dwarfwriterdata/target-binary-dwarf.exe
Это создаст версию бинарного аннотированного с метаданными карликами в DwarfWriterData/target-binary-dwarf.exe .
Если у вас есть инструмент llvm-dwarfdump , вы можете использовать его для проверки генерируемых метаданных карликов. pate Verifier автоматически воспользуется преимуществами намеков на карликовые метаданные, если он не будет направлен на их игнорирование.
Проверитель принимает два двоичных файла в качестве ввода: оригинальный двоичный и исправленный двоичный файл. Предполагается, что некоторые ориентированные на безопасность патч был применен к первоначальному бинарному файлу, который в значительной степени сохраняет его поведение, но может исправить некоторые нежелательные поведения. Затем проверка пытается доказать, что две двоичные файлы демонстрируют одно и то же наблюдаемое поведение; Если он не может, он дает дифференциальную резюме , которая описывает условия, при которых промежуточный двоичный файл демонстрирует отличное поведение от оригинала. Это позволяет разработчикам патчей понимать влияние их патчей на семантику программы и оценивать, ограничивается ли воздействие путям выполнения, которые они намеревались.
Verifier не требует предоставленной вручную спецификацию от пользователей; Вместо этого он рассматривает исходную программу как желаемую поведенческую спецификацию. Это расположение делает Pate реляционным проверкой, так как оно связывает исчеденный двоичный файл с оригиналом. Verifier основан на ряде существующих библиотек для обнаружения бинарного кода и символического выполнения программ (включая программы машинного кода). Примерно, верификатор работает по:
Инструмент Pate записан в Haskell и требует компилятора GHC (мы тестируем с 9,6) и инструмент для сборки кабины для компиляции. Строительство из источника может быть достигнуто:
git clone [email protected]: galoisinc/pate.git CD Pate GIT подмодуля cp cabal.project.dist cabal.project Кабал Настройка PKG: PATE ./pate.sh -help
Verifier требует, чтобы решатель SMT был доступен на PATH . По умолчанию - yices - z3 и cvc4 также могут работать, но не регулярно протестированы с помощью Pate.
Этот материал основан на работе, поддерживаемой Агентством Advanced Research Projects (DARPA) и Центром военно-морских информационных войн Pacific (NIWC Pacific) в соответствии с номером контракта N66001-20-C-4027. Любые мнения, выводы и выводы или рекомендации, выраженные в этом материале, являются мнениями автора (-ов) и не обязательно отражают взгляды DARPA & NIWC Pacific.