
Гипервизор для фаззинга, построенный на WHVP и Bochs
Привет! Добро пожаловать в applepie! Это инструмент, предназначенный для фаззинга, интроспекции и поиска ошибок! Это гипервизор, использующий Windows Hypervisor Platform API, доступный в последних версиях Windows (в частности, разработано и протестировано на Windows 10 17763). Bochs используется для обеспечения глубокой интроспекции и эмуляции устройств.
Windows Hypervisor Platform API (WHVP) — это набор API для доступа к возможностям гипервизора Hyper-V. Этот API позволяет нам легко реализовать виртуальную машину полностью в пользовательском пространстве без необходимости в специальных драйверах или разрешениях.
Это быстро развивающийся проект. Я, вероятно, буду твитить о выходе новых функций до того, как они будут задокументированы.
Мне нравится иметь материальные вещи для своих проектов:
Это инструмент, предназначенный для фаззинга и интроспекции во время исследований безопасности. Используя гипервизор, можно применять распространенные методы фаззинга к любому целевому объекту, будь то ядро или пользовательское пространство. Эта среда позволяет фаззить целые системы без необходимости иметь исходный код цели. На уровне гипервизора можно собирать покрытие кода, а при необходимости эмуляция Bochs может обеспечить произвольную интроспекцию в среде эмуляции. Эта информация о покрытии может использоваться для определения эффективности тестовых случаев фаззинга. Тестовый случай, вызвавший увеличение покрытия, может быть сохранен как интересный. Эти входные данные можно использовать позже, дополняя новыми искажениями.
Фаззинг со снимками — основное применение этого инструмента. Вы делаете снимок системы в определенном состоянии и сохраняете его. Затем этот снимок можно загрузить для фаззинга, внедрить тестовый случай и возобновить выполнение. Поскольку ВМ можно сбросить очень дешево, ее можно часто перезапускать. Если Word загружается 5 секунд, но вы можете сделать снимок прямо в момент чтения вашего файла, вы сокращаете тестовый случай только до того, что имеет отношение к входным данным. Это позволяет создать очень плотный цикл фаззинга без необходимости иметь доступ к исходному коду. Поскольку ВМ являются полностью отдельными системами, многие из них могут работать параллельно для масштабирования на все ядра.
В настоящее время этот инструмент поддерживает только сбор покрытия кода, динамическую загрузку символов для Windows, а также разбор символов/модулей для целей Windows. Поддержка фаззинга будет добавлена совсем скоро.
Учитывая, что я уже писал почти все эти функции ранее (покрытие, фаззинг, быстрые сбросы и т.д.). Я ожидаю, что этот проект довольно быстро станет готов к фаззингу, если я не отвлекусь :D
Я стремлюсь к концу января для покрытия (готово!), фидбека, списков модулей (готово!), списков процессов, быстрых сбросов и поддержки символов (готово!). Это сделает его очень мощным фаззером.
Основная поддерживаемая цель — современная Windows 10. Цели Windows имеют возможность загрузки символов из хранилища символов. Это обеспечивает символьное покрытие для целей Windows из коробки. Однако код написан таким образом, что поддержка Linux может быть легко добавлена.
Без какой-либо поддержки, любая ОС, которая загружается, все еще может быть подвергнута фаззингу, и может быть собрано базовое покрытие.
Перед сообщением о проблемах с поддержкой ОС, пожалуйста, проверьте, что проблема связана с гипервизором/изменениями в Bochs, попробовав загрузить вашу цель с использованием стандартного предварительно собранного Bochs без гипервизора. Bochs не является широко используемым и часто может содержать критические ошибки даже для таких распространенных вещей, как загрузка Linux. Особенно с учетом быстрых внутренних изменений в использовании CPUID/MSR с внедрением мер защиты от Spectre/Meltdown в ОС.
Смотрите страницу issues на Github для списка проблем. Я уже добавил несколько. Некоторые из них необходимо решить быстро, прежде чем начнется разработка фаззинга.
Для сборки вам понадобится несколько вещей:
Установите Visual Studio 2017 и убедитесь, что он обновлен. Мы используем некоторые самые современные API, заголовки и библиотеки.
Я использовал версию cl.exe: Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x64
И версию SDK 10.0.17763.0
Установите Rust через https://rustup.rs/. Я использовал rustc 1.32.0-nightly (b3af09205 2018-12-04)
Убедитесь, что вы установили цепочку инструментов x86_64-pc-windows-msvc, так как для этого проекта поддерживается только 64-битная версия.
Убедитесь, что cargo находится в вашем PATH. Обычно это так по умолчанию.
Скачайте python https://www.python.org/ и убедитесь, что он находится в вашем PATH, чтобы можно было вызвать python.
Установите 64-битный Cygwin (https://www.cygwin.com/setup-x86_64.exe) именно в C:\cygwin64. При установке Cygwin убедитесь, что вы установили пакеты autoconf и make.
Зайдите в "Включение или отключение компонентов Windows" и отметьте флажок рядом с "Hyper-V" и "Windows Hypervisor Platform". Это, конечно, требует, чтобы ваш компьютер поддерживал Hyper-V.
Это руководство по установке было проверено на следующем:
Clean install of Windows 10, Build 17763
rustc 1.33.0-nightly (8e2063d02 2019-01-07)
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27025.1 for x64
Visual Studio Community 2017 version 15.9.4
applepie commit `f84c084feb487e2e7f31f9052a4ab0addd2c4cf9`
Python 3.7.2 x64
git version 2.20.1.windows.1

