
Assistente de pesquisa de vulnerabilidades que localiza chamadas a funções de API potencialmente inseguras em um arquivo binário.
# 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) > "O caminho para bugs exploráveis é pavimentado com bugs não exploráveis." > > -- Mark Dowd Rhabdomancer é um plugin headless extremamente rápido para IDA que localiza chamadas a funções de API potencialmente inseguras em um arquivo binário. Auditores podem fazer backtrace a partir desses pontos candidatos para encontrar caminhos que permitam acesso a entrada não confiável.  ## Recursos - Experiência de usuário headless extremamente rápida, cortesia do IDA 9.x e dos bindings Rust idalib-rs. - Suporte a alvos binários C/C++ compilados para qualquer arquitetura implementada pelo IDA. - Locais de chamadas a funções de API ruins são impressos em stdout e marcados no IDB. - Locais de chamada em código de biblioteca reconhecido pelo IDA (por exemplo, um runtime estaticamente vinculado correspondido por assinaturas FLIRT) são rotulados como `(lib)`. - Chamadas através de stubs (por exemplo, as entradas `.plt` de binários ELF ou os stubs de importação de binários PE e Mach-O, listados como thunks) são rastreadas de volta até seus chamadores. - Em binários ELF, uma função é deliberadamente listada duas vezes com os mesmos locais de chamada: uma vez como seu stub `.plt` (marcado como thunk) e uma vez como sua importação. Cada local de chamada é marcado apenas uma vez no IDB. - Funções de API ruins conhecidas são agrupadas em níveis de maldade para ajudar a priorizar o trabalho de auditoria. - [BAD 0] Alta prioridade - Funções geralmente consideradas inseguras. - [BAD 1] Média prioridade - Funções interessantes que devem ser verificadas quanto a casos de uso inseguros. - [BAD 2] Baixa prioridade - Caminhos de código envolvendo essas funções devem ser cuidadosamente verificados. - A lista de funções de API ruins conhecidas é embutida e pode ser facilmente personalizada com um arquivo de configuração baseado em `conf/rhabdomancer.toml`. - Nomes de funções são correspondidos sem estas decorações: pontos e sublinhados iniciais (por exemplo, `_strcpy`), os prefixos de aliases de biblioteca (por exemplo, `__o_malloc` no Universal CRT, `__libc_system` e `__GI___snprintf` na glibc) e, apenas para stubs e tais aliases, o sufixo numérico que o IDA acrescenta a nomes já em uso (por exemplo, `memset_0`). > [!NOTE] > Funções fortificadas (por exemplo, `__strcpy_chk`, usada em vez de `strcpy` ao compilar com `_FORTIFY_SOURCE`) são > deliberadamente não correspondidas, pois são as variantes verificadas das funções listadas. Para também marcar suas > chamadas, adicione-as explicitamente a uma configuração personalizada (por exemplo, `"__strcpy_chk"` com a mesma > prioridade que `strcpy`). ## Artigos - <https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings> - <https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust> ## Veja também - <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> ## Instalação A maneira mais fácil de obter a versão mais recente é via [crates.io](https://crates.io/crates/rhabdomancer): 1. Baixe, instale e configure o IDA (consulte <https://hex-rays.com/ida-pro>). 2. Instale o LLVM/Clang (consulte <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. No Linux/macOS, instale da seguinte forma: ```sh export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` No Windows, em vez disso, use os seguintes comandos: ```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 ``` ## Compilação Como alternativa, você pode compilar a partir do [código-fonte](https://github.com/0xdea/rhabdomancer): 1. Baixe, instale e configure o IDA (consulte <https://hex-rays.com/ida-pro>). 2. Instale o LLVM/Clang (consulte <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. No Linux/macOS, compile da seguinte forma: ```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 ``` No Windows, em vez disso, use os seguintes comandos: ```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 ``` ## Uso 1. Certifique-se de que o IDA esteja configurado corretamente com uma licença válida. 2. Opcionalmente, personalize a lista de funções de API maliciosas conhecidas: copie [`conf/rhabdomancer.toml`](https://github.com/0xdea/rhabdomancer/blob/master/conf/rhabdomancer.toml) (escolha a tag que corresponde à sua versão instalada para obter sua lista interna exata), edite a cópia e defina a variável de ambiente `RHABDOMANCER_CONFIG` com o caminho dela. O arquivo deve definir os arrays `high`, `medium` e `low`, e nenhuma outra chave. Caso contrário, a lista interna é usada, a qual é incorporada ao binário no momento da compilação a partir de `conf/rhabdomancer.toml` (editar esse arquivo requer uma recompilação). 3. Certifique-se de que a variável de ambiente `IDADIR` esteja definida se a sua instalação do IDA estiver em um local não padrão. 4. Execute da seguinte forma: ```sh rhabdomancer <binary_file> ``` Qualquer arquivo IDB `.i64` existente será atualizado; caso contrário, um novo arquivo IDB será criado. 5. Abra o arquivo IDB `.i64` resultante com o IDA. 6. Selecione `View` > `Open subviews` > `Bookmarks` 7. Aproveite seus resultados convenientemente reunidos em uma janela do IDA. > [!NOTE] > O Rhabdomancer também adiciona comentários nos locais de chamada marcados. Tanto os marcadores quanto os comentários são etiquetados como > `[BAD n] <function_name>`, onde `n` é o nível de prioridade (0 = alto, 1 = médio, 2 = baixo), para que os scripts possam > procurá-los nos IDBs. Este formato é estável entre versões. ## Compatibilidade Apenas a versão mais recente do IDA é oficialmente suportada, mas versões mais antigas também podem funcionar. A tabela a seguir resume a versão compatível mais recente para cada versão do IDA: | Versão do IDA | Versão compatível mais recente | | ----------- | ------------------------- | | 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 | versão atual | | v9.4.260915 | versão atual | > [!NOTE] > Consulte a documentação do [idalib-rs](https://github.com/idalib-rs/idalib) para informações adicionais. ## Créditos O desenvolvimento deste projeto foi apoiado pelas seguintes organizações: - [HN Security](https://hnsecurity.it) - [Hex-Rays](https://hex-rays.com) por meio do seu [Contributor Program](https://hex-rays.com/contributor-program) ## Changelog - [CHANGELOG.md](https://github.com/0xdea/rhabdomancer/blob/master/CHANGELOG.md) ## TODO - Enriquecer ainda mais a lista conhecida de funções de API maliciosas (veja <https://github.com/0xdea/semgrep-rules>). - Seguir chamadas através de thunks fora de segmentos `.plt` (por exemplo, thunks `j_` de vinculação incremental do MSVC). - Considerar pular a marcação de locais de chamada em código de biblioteca reconhecido pelo IDA (atualmente apenas rotulado como `(lib)`). - Implementar saída serializada para facilitar a análise e o parsing automatizados. - Implementar um conjunto de regras básico no estilo de [VulFi](https://github.com/Accenture/VulFi) e [VulnFanatic](https://github.com/Martyx00/VulnFanatic).