
rhabdomancer v0.10.0
Assistant de recherche de vulnérabilités qui localise les appels à des fonctions API potentiellement non sécurisées dans un fichier binaire.
rhabdomancer
"La route vers les bugs exploitables est pavée de bugs inexploitables."
-- Mark Dowd
Rhabdomancer est un plugin headless IDA ultra-rapide qui localise les appels à des fonctions d'API potentiellement non sécurisées dans un fichier binaire. Les auditeurs peuvent remonter la trace depuis ces points candidats pour trouver des chemins permettant l'accès à des entrées non fiables.

Fonctionnalités
- Expérience utilisateur headless ultra-rapide grâce à IDA 9.x et aux bindings Rust idalib-rs.
- Prise en charge des cibles binaires C/C++ compilées pour toute architecture implémentée par IDA.
- Les emplacements des appels à des fonctions d'API dangereuses sont affichés sur stdout et marqués dans l'IDB.
- Les emplacements d'appel dans du code de bibliothèque reconnu par IDA (par exemple, un runtime lié statiquement reconnu par les signatures FLIRT) sont
étiquetés
(lib). - Les appels via des stubs (par exemple, les entrées
.pltdes binaires ELF ou les stubs d'import des binaires PE et Mach-O, listés comme thunks) sont retracés jusqu'à leurs appelants. - Dans les binaires ELF, une fonction est délibérément listée deux fois avec les mêmes emplacements d'appel : une fois comme son stub
.plt(marqué comme thunk) et une fois comme son import. Chaque emplacement d'appel n'est marqué qu'une seule fois dans l'IDB.
- Les emplacements d'appel dans du code de bibliothèque reconnu par IDA (par exemple, un runtime lié statiquement reconnu par les signatures FLIRT) sont
étiquetés
- Les fonctions d'API dangereuses connues sont regroupées en niveaux de dangerosité pour aider à prioriser le travail d'audit.
- [BAD 0] Priorité élevée - Fonctions généralement considérées comme non sécurisées.
- [BAD 1] Priorité moyenne - Fonctions intéressantes qui devraient être vérifiées pour des cas d'utilisation non sécurisés.
- [BAD 2] Priorité faible - Les chemins de code impliquant ces fonctions devraient être soigneusement vérifiés.
- La liste des fonctions d'API dangereuses connues est intégrée et peut être facilement personnalisée avec un fichier de configuration basé sur
conf/rhabdomancer.toml. - Les noms de fonctions sont mis en correspondance sans ces décorations : points et underscores initiaux (par exemple,
_strcpy), les préfixes des alias de bibliothèque (par exemple,__o_mallocdans l'Universal CRT,__libc_systemet__GI___snprintfdans glibc), et, pour les stubs et ces alias uniquement, le suffixe numérique qu'IDA ajoute aux noms déjà utilisés (par exemple,memset_0).
[!NOTE] Les fonctions fortifiées (par exemple,
__strcpy_chk, utilisée à la place destrcpylors de la compilation avec_FORTIFY_SOURCE) ne sont délibérément pas mises en correspondance, car ce sont les variantes vérifiées des fonctions listées. Pour aussi marquer leurs appels, ajoutez-les explicitement à une configuration personnalisée (par exemple,"__strcpy_chk"avec la même priorité questrcpy).
Articles
- https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings
- https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust
Voir aussi
- 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
Installation
Le moyen le plus simple d'obtenir la dernière version est via crates.io :
- Téléchargez, installez et configurez IDA (voir https://hex-rays.com/ida-pro).
- Installez LLVM/Clang (voir https://rust-lang.github.io/rust-bindgen/requirements.html).
- Sous Linux/macOS, installez comme suit :
Sous Windows, utilisez plutôt les commandes suivantes :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
Compilation
Alternativement, vous pouvez compiler à partir des sources :
- Téléchargez, installez et configurez IDA (voir https://hex-rays.com/ida-pro).
- Installez LLVM/Clang (voir https://rust-lang.github.io/rust-bindgen/requirements.html).
- Sous Linux/macOS, compilez comme suit :
Sous Windows, utilisez plutôt les commandes suivantes :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
Utilisation
- Assurez-vous qu'IDA est correctement configuré avec une licence valide.
- Personnalisez éventuellement la liste des fonctions API malveillantes connues : copiez
conf/rhabdomancer.toml(choisissez le tag correspondant à votre version installée pour obtenir sa liste intégrée exacte), modifiez la copie, et définissez la variable d'environnementRHABDOMANCER_CONFIGvers son chemin. Le fichier doit définir les tableauxhigh,mediumetlow, et aucune autre clé. Sinon, la liste intégrée est utilisée, laquelle est incorporée dans le binaire au moment de la compilation depuisconf/rhabdomancer.toml(modifier ce fichier nécessite une recompilation). - Assurez-vous que la variable d'environnement
IDADIRest définie si votre installation d'IDA se trouve dans un emplacement non standard. - Exécutez comme suit :
Tout fichier IDBrhabdomancer <binary_file>.i64existant sera mis à jour ; sinon, un nouveau fichier IDB sera créé. - Ouvrez le fichier IDB
.i64résultant avec IDA. - Sélectionnez
View>Open subviews>Bookmarks - Profitez de vos résultats commodément rassemblés dans une fenêtre IDA.
[!NOTE] Rhabdomancer ajoute également des commentaires aux emplacements d'appels marqués. Les signets et les commentaires sont tous deux étiquetés comme
[BAD n] <function_name>, oùnest le niveau de priorité (0 = élevé, 1 = moyen, 2 = faible), afin que les scripts puissent les rechercher dans les IDB. Ce format est stable entre les versions.
Compatibilité
Seule la dernière version d'IDA est officiellement prise en charge, mais les versions antérieures peuvent également fonctionner. Le tableau suivant résume la dernière version compatible pour chaque version d'IDA :