
Assistente per la ricerca di vulnerabilità che individua le chiamate a funzioni API potenzialmente non sicure in un file binario.
# 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) > "La strada verso i bug sfruttabili è lastricata di bug non sfruttabili." > > -- Mark Dowd Rhabdomancer è un plugin headless per IDA estremamente veloce che individua le chiamate a funzioni API potenzialmente insicure in un file binario. I revisori possono risalire a ritroso da questi punti candidati per trovare percorsi che consentono l'accesso a input non attendibili.  ## Funzionalità - Esperienza utente headless estremamente veloce grazie a IDA 9.x e ai binding Rust idalib-rs. - Supporto per binari C/C++ compilati per qualsiasi architettura implementata da IDA. - Le posizioni delle chiamate a funzioni API pericolose vengono stampate su stdout e contrassegnate nell'IDB. - Le posizioni delle chiamate nel codice di libreria riconosciuto da IDA (ad esempio, un runtime linkato staticamente riconosciuto tramite firme FLIRT) sono etichettate `(lib)`. - Le chiamate attraverso stub (ad esempio, le voci `.plt` dei binari ELF o gli stub di importazione dei binari PE e Mach-O, elencati come thunk) vengono ricondotte ai loro chiamanti. - Nei binari ELF, una funzione viene deliberatamente elencata due volte con le stesse posizioni di chiamata: una volta come suo stub `.plt` (contrassegnato come thunk) e una volta come sua importazione. Ogni posizione di chiamata viene contrassegnata una sola volta nell'IDB. - Le funzioni API pericolose note sono raggruppate in livelli di pericolosità per aiutare a dare priorità al lavoro di revisione. - [BAD 0] Priorità alta - Funzioni generalmente considerate insicure. - [BAD 1] Priorità media - Funzioni interessanti che dovrebbero essere verificate per casi d'uso insicuri. - [BAD 2] Priorità bassa - I percorsi di codice che coinvolgono queste funzioni dovrebbero essere controllati attentamente. - L'elenco delle funzioni API pericolose note è integrato e può essere facilmente personalizzato con un file di configurazione basato su `conf/rhabdomancer.toml`. - I nomi delle funzioni vengono confrontati senza queste decorazioni: punti e underscore iniziali (ad esempio, `_strcpy`), i prefissi degli alias di libreria (ad esempio, `__o_malloc` nella Universal CRT, `__libc_system` e `__GI___snprintf` in glibc) e, solo per stub e tali alias, il suffisso numerico che IDA aggiunge ai nomi già in uso (ad esempio, `memset_0`). > [!NOTE] > Le funzioni fortificate (ad esempio, `__strcpy_chk`, usata al posto di `strcpy` quando si compila con > `_FORTIFY_SOURCE`) non vengono deliberatamente confrontate, poiché sono le varianti controllate delle funzioni > elencate. Per contrassegnare anche le loro chiamate, aggiungile esplicitamente a una configurazione personalizzata > (ad esempio, `"__strcpy_chk"` con la stessa priorità di `strcpy`). ## Articoli - <https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings> - <https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust> ## Vedi anche - <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> ## Installazione Il modo più semplice per ottenere l'ultima versione è tramite [crates.io](https://crates.io/crates/rhabdomancer): 1. Scarica, installa e configura IDA (vedi <https://hex-rays.com/ida-pro>). 2. Installa LLVM/Clang (vedi <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. Su Linux/macOS, installa come segue: ```sh export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` Su Windows, invece, usa i seguenti comandi: ```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 ``` ## Compilazione In alternativa, puoi compilare dal [sorgente](https://github.com/0xdea/rhabdomancer): 1. Scarica, installa e configura IDA (vedi <https://hex-rays.com/ida-pro>). 2. Installa LLVM/Clang (vedi <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. Su Linux/macOS, compila come segue: ```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 ``` Su Windows, invece, usa i seguenti comandi: ```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 ``` ## Utilizzo 1. Assicurarsi che IDA sia configurato correttamente con una licenza valida. 2. Facoltativamente, personalizzare l'elenco delle funzioni API note come dannose: copiare [`conf/rhabdomancer.toml`](https://github.com/0xdea/rhabdomancer/blob/master/conf/rhabdomancer.toml) (scegliere il tag che corrisponde alla versione installata per il suo elenco predefinito esatto), modificare la copia e impostare la variabile d'ambiente `RHABDOMANCER_CONFIG` con il suo percorso. Il file deve definire gli array `high`, `medium` e `low`, e nessun'altra chiave. In caso contrario, viene utilizzato l'elenco predefinito, che è incorporato nel binario in fase di compilazione da `conf/rhabdomancer.toml` (modificare quel file richiede una ricompilazione). 3. Assicurarsi che la variabile d'ambiente `IDADIR` sia impostata se l'installazione di IDA si trova in una posizione non standard. 4. Eseguire come segue: ```sh rhabdomancer <binary_file> ``` Qualsiasi file IDB `.i64` esistente verrà aggiornato; in caso contrario, verrà creato un nuovo file IDB. 5. Apri il file IDB `.i64` risultante con IDA. 6. Seleziona `View` > `Open subviews` > `Bookmarks` 7. Goditi i tuoi risultati comodamente raccolti in una finestra di IDA. > [!NOTE] > Rhabdomancer aggiunge anche commenti nelle posizioni delle chiamate contrassegnate. Sia i segnalibri che i commenti sono etichettati come > `[BAD n] <function_name>`, dove `n` è il livello di priorità (0 = alto, 1 = medio, 2 = basso), in modo che gli script possano > cercarli negli IDB. Questo formato è stabile tra le release. ## Compatibilità È ufficialmente supportata solo l'ultima release di IDA, ma anche le versioni precedenti potrebbero funzionare. La seguente tabella > riassume l'ultima release compatibile per ciascuna versione di IDA: | Versione IDA | Ultima release compatibile | | ----------- | ------------------------- | | 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 | release corrente | | v9.4.260915 | release corrente | > [!NOTE] > Consulta la documentazione di [idalib-rs](https://github.com/idalib-rs/idalib) per ulteriori informazioni. ## Crediti Lo sviluppo di questo progetto è stato supportato dalle seguenti organizzazioni: - [HN Security](https://hnsecurity.it) - [Hex-Rays](https://hex-rays.com) tramite il loro [Contributor Program](https://hex-rays.com/contributor-program) ## Changelog - [CHANGELOG.md](https://github.com/0xdea/rhabdomancer/blob/master/CHANGELOG.md) ## TODO - Arricchire ulteriormente la lista delle funzioni API note come malevole (vedi <https://github.com/0xdea/semgrep-rules>). - Seguire le chiamate attraverso i thunk al di fuori dei segmenti `.plt` (ad es., i thunk `j_` del linking incrementale MSVC). - Considerare di saltare il contrassegno delle posizioni delle chiamate nel codice di libreria riconosciuto da IDA (ora solo etichettato `(lib)`). - Implementare l'output serializzato per facilitare l'analisi e il parsing automatizzati. - Implementare un ruleset di base nello stile di [VulFi](https://github.com/Accenture/VulFi) e [VulnFanatic](https://github.com/Martyx00/VulnFanatic).