
rhabdomancer v0.10.0
Assistente de pesquisa de vulnerabilidades que localiza chamadas a funções de API potencialmente inseguras em um arquivo binário.
rhabdomancer
"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
.pltde 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.
- 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
- 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_mallocno Universal CRT,__libc_systeme__GI___snprintfna 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 destrcpyao 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 questrcpy).
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:
- Baixe, instale e configure o IDA (consulte https://hex-rays.com/ida-pro).
- Instale o LLVM/Clang (consulte https://rust-lang.github.io/rust-bindgen/requirements.html).
- No Linux/macOS, instale da seguinte forma:
No Windows, em vez disso, use os seguintes comandos:export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked$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:
- Baixe, instale e configure o IDA (consulte https://hex-rays.com/ida-pro).
- Instale o LLVM/Clang (consulte https://rust-lang.github.io/rust-bindgen/requirements.html).
- No Linux/macOS, compile da seguinte forma:
No Windows, em vez disso, use os seguintes comandos: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 --lockedgit 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
- Certifique-se de que o IDA esteja configurado corretamente com uma licença válida.
- Opcionalmente, personalize a lista de funções de API maliciosas conhecidas: copie
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 ambienteRHABDOMANCER_CONFIGcom o caminho dela. O arquivo deve definir os arrayshigh,mediumelow, e nenhuma outra chave. Caso contrário, a lista interna é usada, a qual é incorporada ao binário no momento da compilação a partir deconf/rhabdomancer.toml(editar esse arquivo requer uma recompilação). - Certifique-se de que a variável de ambiente
IDADIResteja definida se a sua instalação do IDA estiver em um local não padrão. - Execute da seguinte forma:
Qualquer arquivo IDBrhabdomancer <binary_file>.i64existente será atualizado; caso contrário, um novo arquivo IDB será criado. - Abra o arquivo IDB
.i64resultante com o IDA. - Selecione
View>Open subviews>Bookmarks - 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>, ondené 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: