
Assistant de recherche de vulnérabilités qui localise les appels à des fonctions API potentiellement non sécurisées dans un fichier binaire.
# 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 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 `.plt` des 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 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_malloc` dans l'Universal CRT, `__libc_system` et `__GI___snprintf` dans 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 de `strcpy` lors 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é que `strcpy`). ## 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](https://crates.io/crates/rhabdomancer) : 1. Téléchargez, installez et configurez IDA (voir <https://hex-rays.com/ida-pro>). 2. Installez LLVM/Clang (voir <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. Sous Linux/macOS, installez comme suit : ```sh export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked ``` Sous Windows, utilisez plutôt les commandes suivantes : ```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 ``` ## Compilation Alternativement, vous pouvez compiler à partir des [sources](https://github.com/0xdea/rhabdomancer) : 1. Téléchargez, installez et configurez IDA (voir <https://hex-rays.com/ida-pro>). 2. Installez LLVM/Clang (voir <https://rust-lang.github.io/rust-bindgen/requirements.html>). 3. Sous Linux/macOS, compilez comme suit : ```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 ``` Sous Windows, utilisez plutôt les commandes suivantes : ```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 ``` ## Utilisation 1. Assurez-vous qu'IDA est correctement configuré avec une licence valide. 2. Personnalisez éventuellement la liste des fonctions API malveillantes connues : copiez [`conf/rhabdomancer.toml`](https://github.com/0xdea/rhabdomancer/blob/master/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'environnement `RHABDOMANCER_CONFIG` vers son chemin. Le fichier doit définir les tableaux `high`, `medium` et `low`, 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 depuis `conf/rhabdomancer.toml` (modifier ce fichier nécessite une recompilation). 3. Assurez-vous que la variable d'environnement `IDADIR` est définie si votre installation d'IDA se trouve dans un emplacement non standard. 4. Exécutez comme suit : ```sh rhabdomancer <binary_file> ``` Tout fichier IDB `.i64` existant sera mis à jour ; sinon, un nouveau fichier IDB sera créé. 5. Ouvrez le fichier IDB `.i64` résultant avec IDA. 6. Sélectionnez `View` > `Open subviews` > `Bookmarks` 7. 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ù `n` est 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 : | Version IDA | Dernière version compatible | | ----------- | ------------------------- | | 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 | version actuelle | | v9.4.260915 | version actuelle | > [!NOTE] > Consultez la documentation d'[idalib-rs](https://github.com/idalib-rs/idalib) pour plus d'informations. ## Crédits Le développement de ce projet a été soutenu par les organisations suivantes : - [HN Security](https://hnsecurity.it) - [Hex-Rays](https://hex-rays.com) via leur [Contributor Program](https://hex-rays.com/contributor-program) ## Journal des modifications - [CHANGELOG.md](https://github.com/0xdea/rhabdomancer/blob/master/CHANGELOG.md) ## À faire - Enrichir davantage la liste des fonctions API malveillantes connues (voir <https://github.com/0xdea/semgrep-rules>). - Suivre les appels à travers les thunks en dehors des segments `.plt` (par exemple, les thunks `j_` de l'édition de liens incrémentielle MSVC). - Envisager d'ignorer le marquage des emplacements d'appels dans le code de bibliothèque reconnu par IDA (actuellement seulement étiqueté `(lib)`). - Implémenter une sortie sérialisée pour faciliter l'analyse et le traitement automatisés. - Implémenter un ensemble de règles de base dans le style de [VulFi](https://github.com/Accenture/VulFi) et [VulnFanatic](https://github.com/Martyx00/VulnFanatic).