
Ассистент для исследования уязвимостей, который находит вызовы потенциально небезопасных функций API в бинарном файле.
# rhabdomancer [](https://github.com/0xdea/rhabdomancer) [](https://crates.io/crates/rhabdomancer) [](https://crates.io/crates/rhabdomancer) [](https://hex-rays.com/ida-pro) [](https://twitter.com/0xdea) [](https://infosec.exchange/@raptor) [](https://github.com/0xdea/rhabdomancer/actions/workflows/build.yml) [](https://github.com/0xdea/rhabdomancer/actions/workflows/doc.yml) > "Дорога к эксплуатируемым уязвимостям вымощена неэксплуатируемыми уязвимостями." > > -- Mark Dowd Rhabdomancer — это молниеносно быстрый headless-плагин для IDA, который находит вызовы потенциально небезопасных API-функций в бинарном файле. Аудиторы могут выполнить обратную трассировку от этих кандидатных точек, чтобы найти пути, позволяющие получить доступ к недоверенному вводу.  ## Возможности - Молниеносно быстрый headless-опыт благодаря IDA 9.x и Rust-биндингам idalib-rs. - Поддержка бинарных целей на C/C++, скомпилированных для любой архитектуры, реализованной в IDA. - Местоположения вызовов плохих API-функций выводятся в stdout и помечаются в IDB. - Местоположения вызовов в библиотечном коде, распознанном IDA (например, статически слинкованный рантайм, сопоставленный FLIRT-сигнатурами), помечаются как `(lib)`. - Вызовы через заглушки (например, записи `.plt` в ELF-бинарниках или импортные заглушки PE- и Mach-O-бинарников, перечисляемые как thunks) трассируются обратно к их вызывающим. - В ELF-бинарниках функция намеренно перечисляется дважды с одинаковыми местоположениями вызовов: один раз как её `.plt`-заглушка (помеченная как thunk) и один раз как её импорт. Каждое местоположение вызова помечается в IDB только один раз. - Известные плохие API-функции сгруппированы по уровням опасности, чтобы помочь расставить приоритеты в аудиторской работе. - [BAD 0] Высокий приоритет — функции, которые обычно считаются небезопасными. - [BAD 1] Средний приоритет — интересные функции, которые следует проверить на небезопасные сценарии использования. - [BAD 2] Низкий приоритет — пути кода, связанные с этими функциями, следует тщательно проверять. - Список известных плохих API-функций встроен и может быть легко настроен с помощью конфигурационного файла на основе `conf/rhabdomancer.toml`. - Имена функций сопоставляются без следующих украшений: ведущих точек и подчёркиваний (например, `_strcpy`), префиксов библиотечных псевдонимов (например, `__o_malloc` в Universal CRT, `__libc_system` и `__GI___snprintf` в glibc) и, только для заглушек и подобных псевдонимов, числового суффикса, который IDA добавляет к уже используемым именам (например, `memset_0`). > [!NOTE] > Укреплённые функции (например, `__strcpy_chk`, используемая вместо `strcpy` при сборке с `_FORTIFY_SOURCE`) намеренно не сопоставляются, поскольку они являются проверяемыми вариантами перечисленных функций. Чтобы также помечать их вызовы, добавьте их явно в пользовательскую конфигурацию (например, `"__strcpy_chk"` с тем же приоритетом, что и `strcpy`). ## Статьи - <https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings> - <https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust> ## См. также - <https://github.com/0xdea/ghidra-scripts/blob/main/Rhabdomancer.java> - <https://docs.hex-rays.com/release-notes/9_0#headless-processing-with-idalib> - <https://github.com/idalib-rs/idalib> - <https://books.google.it/books/about/The_Art_of_Software_Security_Assessment.html> ## Установка Самый простой способ получить последнюю версию — через [crates.io](https://crates.io/crates/rhabdomancer): 1. Скачайте, установите и настройте IDA (см. <https://hex-rays.com/ida-pro>). 2. Установите LLVM/Clang (см. <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. В Linux/macOS установка выполняется следующим образом: ```sh export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` В Windows вместо этого используйте следующие команды: ```powershell $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` ## Компиляция В качестве альтернативы можно собрать из [исходного кода](https://github.com/0xdea/rhabdomancer): 1. Скачайте, установите и настройте IDA (см. <https://hex-rays.com/ida-pro>). 2. Установите LLVM/Clang (см. <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. В Linux/macOS компиляция выполняется следующим образом: ```sh git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo build --release --locked ``` В Windows вместо этого используйте следующие команды: ```powershell git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo build --release --locked ``` ## Использование 1. Убедитесь, что IDA правильно настроена и имеет действующую лицензию. 2. При необходимости настройте список известных опасных API-функций: скопируйте [`conf/rhabdomancer.toml`](https://github.com/0xdea/rhabdomancer/blob/master/conf/rhabdomancer.toml) (выберите тег, соответствующий вашей установленной версии, для получения точного встроенного списка), отредактируйте копию и задайте переменную окружения `RHABDOMANCER_CONFIG` с путём к ней. Файл должен определять массивы `high`, `medium` и `low`, и никаких других ключей. В противном случае используется встроенный список, который встраивается в бинарный файл во время сборки из `conf/rhabdomancer.toml` (редактирование этого файла требует пересборки). 3. Убедитесь, что переменная окружения `IDADIR` задана, если ваша установка IDA находится в нестандартном месте. 4. Запустите следующим образом: ```sh rhabdomancer <binary_file> ``` Любой существующий файл базы данных `.i64` будет обновлён; в противном случае будет создан новый файл базы данных. 5. Откройте полученный файл базы данных `.i64` в IDA. 6. Выберите `View` > `Open subviews` > `Bookmarks` 7. Наслаждайтесь результатами, удобно собранными в окне IDA. > [!NOTE] > Rhabdomancer также добавляет комментарии в отмеченных местах вызовов. И закладки, и комментарии помечаются как > `[BAD n] <function_name>`, где `n` — уровень приоритета (0 = высокий, 1 = средний, 2 = низкий), чтобы скрипты могли > искать их в базах данных IDA. Этот формат стабилен между релизами. ## Совместимость Официально поддерживается только последний релиз IDA, но более старые версии также могут работать. В следующей таблице приведены последние совместимые релизы для каждой версии IDA: | Версия IDA | Последний совместимый выпуск | | ----------- | ------------------------- | | v9.0.240925 | v0.2.4 | | v9.0.241217 | v0.3.5 | | v9.1.250226 | v0.6.2 | | v9.2.250908 | v0.7.6 | | v9.3.260213 | v0.8.1 | | v9.3.260327 | v0.9.0 | | v9.3.260421 | v0.9.3 | | v9.4.260714 | текущий выпуск | | v9.4.260915 | текущий выпуск | > [!NOTE] > Дополнительную информацию см. в документации [idalib-rs](https://github.com/idalib-rs/idalib). ## Благодарности Разработку этого проекта поддерживали следующие организации: - [HN Security](https://hnsecurity.it) - [Hex-Rays](https://hex-rays.com) в рамках их [Contributor Program](https://hex-rays.com/contributor-program) ## Журнал изменений - [CHANGELOG.md](https://github.com/0xdea/rhabdomancer/blob/master/CHANGELOG.md) ## TODO - Дальнейшее обогащение списка известных опасных API-функций (см. <https://github.com/0xdea/semgrep-rules>). - Отслеживание вызовов через thunk-функции вне сегментов `.plt` (например, `j_` thunk-функции инкрементальной компоновки MSVC). - Рассмотреть возможность пропуска отметки мест вызовов в библиотечном коде, распознанном IDA (сейчас только помечается `(lib)`). - Реализовать сериализованный вывод для облегчения автоматизированного разбора и анализа. - Реализовать базовый набор правил в стиле [VulFi](https://github.com/Accenture/VulFi) и [VulnFanatic](https://github.com/Martyx00/VulnFanatic).