
Un serveur MCP axé sur la sécurité qui permet aux agents d'IA d'effectuer de manière automatisée du rétro-ingénierie, de l'analyse de malwares, de la criminalistique numérique, de la recherche de vulnérabilités et de l'analyse statique de code (SAST) — propulsé par Radare2, YARA, LIEF, Capstone, et plus encore.
Rétro-ingénierie et analyse de sécurité propulsées par l'IA via Model Context Protocol
Un serveur MCP qui permet aux assistants IA comme Claude et Cursor d'effectuer de la rétro-ingénierie, de l'analyse de malwares, de la recherche de vulnérabilités, de la criminalistique numérique et de l'audit de code source en langage naturel.
Reversecore MCP est un serveur Model Context Protocol qui regroupe 120 outils d'analyse dans une interface unique que les assistants IA peuvent appeler en langage naturel.
Au lieu d'apprendre la syntaxe en ligne de commande d'une douzaine d'outils différents, vous décrivez ce que vous voulez :``` "Decompile the main function of this malware sample, extract all network IOCs, map the behavior to MITRE ATT&CK, and generate a triage report."
L'assistant IA décompose cela en appels d'outils :```
r2_decompile("sample.exe", "main")
→ extract_iocs("sample.exe")
→ add_mitre_technique(technique_id="T1071.001", ...)
→ create_analysis_report(template_type="quick_triage")
Chaque outil renvoie un ToolResult structuré (ToolSuccess ou ToolError selon le cas) avec des données typées que l'IA peut analyser, enchaîner dans des requêtes de suivi ou afficher à l'utilisateur.
AI Client (Claude / Cursor / any MCP-compatible client) │ MCP Protocol (stdio or HTTP/SSE) ▼ ┌──────────────────────────────────────────────────────┐ │ FastMCP 3.4.4 Server │ │ 120 registered tools · Fully async │ │ Python 3.10–3.12 │ ├────────────────────┬─────────────────────────────────┤ │ Guided Prompts │ Dynamic Resources │ │ (22 analysis │ (11 URI-based: per-binary │ │ modes) │ strings, IOCs, ASM, CFG, …) │ ├────────────────────┴─────────────────────────────────┤ │ Core Infrastructure │ │ Config · Security · Validators · Exceptions (17) │ │ R2 Pool · Metrics · Memory (SQLite) · Task Queue │ │ MITRE Mapper · Evidence Engine · Resilience Layer │ │ Arch Registry (x86/ARM/MIPS/RISC-V/PPC) │ │ Result Cache (SHA256) · Analysis Cache (Redis+SQL) │ │ SAST (Python AST + C/C++ Regex) · Plugin System │ ├──────────────────────────────────────────────────────┤ │ Analysis Engines │ │ Radare2 6.0.4 │ YARA 4.3.1 · LIEF · Capstone │ │ r2ghidra │ CAPA · angr · Qiling │ │ Volatility3 · Scapy│ DIE · Binwalk · Sleuth Kit │ │ pwntools · ROPgadget│ Keystone (assembler) │ └──────────────────────────────────────────────────────┘
### Core Infrastructure (37 modules)
Le répertoire `reversecore_mcp/core/` contient l'infrastructure partagée sur laquelle tous les outils s'appuient :
| Module | Rôle |
|---|---|
| `config.py` | Pydantic BaseSettings avec 34+ variables d'environnement |
| `security.py` | Assainissement des entrées, validation des arguments de commande |
| `validators.py` | Validation des chemins de fichiers et de binaires avec atténuation TOCTOU, résolution des liens symboliques |
| `r2_pool.py` | Pool de connexions Radare2 thread-safe avec taille configurable |
| `r2_helpers.py` | Analyse structurée des sorties Radare2 |
| `metrics.py` | Temps d'exécution par outil, nombres d'appels, taux d'erreur, statistiques de cache |
| `memory.py` | Stockage de mémoire IA asynchrone basé sur SQLite pour persister les résultats d'analyse entre les sessions |
| `mitre_mapper.py` | Moteur de correspondance des ID de techniques MITRE ATT&CK |
| `evidence.py` | Système de classification des preuves : `OBSERVED`, `INFERRED`, `POSSIBLE` |
| `resilience.py` | Modèles de décorateurs pour la relance (retry), le disjoncteur (circuit-breaker) et le délai d'expiration (timeout) |
| `task_queue.py` | File de tâches en arrière-plan via Redis + arq |
| `extension_registry.py` | Enregistrement des plugins et gestion du cycle de vie |
| `arch_registry.py` | Correspondance multi-architectures (x86, x86_64, ARM32, ARM64, MIPS, RISC-V, PPC → arch/bits/registres r2) |
| `result_cache.py` | Décorateur de mise en cache des résultats d'outils basé sur SHA256 (`@cache_tool_result`) |
| `analysis_cache.py` | Cache de décompilation multi-niveaux (L1 : Redis, L2 : SQLite) |
| `result.py` | Modèles Pydantic `ToolSuccess` / `ToolError` |
| `exceptions.py` | 17 classes d'exceptions avec codes d'erreur `RCMCP-E*` |
| `decorators.py` | `@log_execution`, `@track_metrics` |
| `error_handling.py` | Décorateur `@handle_tool_errors` |
| `error_formatting.py` | Formatage structuré des réponses d'erreur |
| `execution.py` | Exécution sécurisée de sous-processus avec délai d'expiration et limites de sortie |
| `command_spec.py` | Spécification de commande pour les appels de sous-processus |
| `loader.py` | Chargeur dynamique de modules d'outils |
| `plugin.py` | Classe de base des plugins |
| `extension.py` | Classe de base des extensions |
| `container.py` | Prise en charge de l'exécution en conteneur/sandbox |
| `audit.py` | Journalisation d'audit |
| `binary_cache.py` | Mise en cache des fichiers binaires |
| `json_utils.py` | Sérialisation JSON via orjson (3 à 5 fois plus rapide que json de la bibliothèque standard) |
| `logging_config.py` | Journalisation structurée basée sur Loguru |
| `report_generator.py` | Moteur de rendu de rapports (Markdown, PDF via xhtml2pdf) |
| `resource_manager.py` | Gestion du cycle de vie des ressources MCP |
| `sast/python_ast_scanner.py` | Analyseur de vulnérabilités basé sur l'AST Python |
| `sast/regex_scanner.py` | Analyseur de vulnérabilités C/C++ basé sur des expressions régulières |
| `sast/rule_manager.py` | Chargement et gestion des règles SAST |
---
## Catalogue d'outils (120 outils)
Chaque outil renvoie un `ToolResult` structuré — soit un `ToolSuccess` avec des `data` typées, soit un `ToolError` avec un code d'erreur `RCMCP-E*`. Les outils sont organisés en 8 plugins.
---
### 🔍 Plugin d'analyse statique (24 outils)
| # | Outil | Backend | Description |
|---|---|---|---|
| 1 | `run_strings` | `strings` CLI | Extraction de chaînes ASCII/Unicode avec longueur minimale configurable |
| 2 | `run_binwalk` | Binwalk | Analyse approfondie de firmware pour signatures et systèmes de fichiers intégrés |
| 3 | `run_binwalk_extract` | Binwalk | Extraire les fichiers intégrés découverts par binwalk |
| 4 | `parse_binary_with_lief` | LIEF | Analyse complète des en-têtes, sections, importations/exports et TLS des formats PE/ELF/Mach-O |
| 5 | `detect_packer` | DIE | Détection rapide de packer/compilateur |
| 6 | `detect_packer_deep` | DIE (`diec`) | Analyse approfondie de packer/protecteur via Detect It Easy |
| 7 | `run_capa` | CAPA (Mandiant FLARE) | Détection de capacités — « chiffre les données », « crée une persistance », etc. |
| 8 | `run_capa_quick` | CAPA | Analyse rapide des capacités avec un sous-ensemble de règles |
| 9 | `generate_signature` | Radare2 | Générer des signatures binaires pour l'identification |
| 10 | `generate_yara_rule` | Radare2 + YARA | Générer des règles de détection YARA à partir de motifs binaires |
| 11 | `generate_advanced_yara_rule` | Radare2 + YARA | Règles YARA avancées avec indicateurs comportementaux |
| 12 | `scan_for_versions` | LIEF + strings | Analyser le binaire à la recherche de chaînes de version intégrées |
| 13 | `extract_rtti_info` | Radare2 | Extraire les informations RTTI C++ (Run-Time Type Information) |
| 14 | `diff_binaries` | Radare2 | Différence binaire sémantique entre deux versions de fichiers |
| 15 | `analyze_variant_changes` | Radare2 | Analyser les changements entre variantes binaires |
| 16 | `match_libraries` | Radare2 | Identifier les bibliothèques liées statiquement par empreinte de fonction |
| 17 | `patch_diff_1day` | Radare2 + heuristics | Analyse automatisée de diff de patchs pour la recherche de vulnérabilités 1-day |
| 18 | `analyze_patch_diff_auto` | Radare2 + inference | Inférence automatisée de vulnérabilités de patch |
| 19 | `emulate_binary` | Radare2 ESIL | Émulation de code avec suivi des registres/mémoire |
| 20 | `generate_fuzzing_harness` | Qiling + AFL++ | Générer un harnais de fuzzing ciblant une fonction spécifique |
| 21 | `run_fuzzing_campaign` | AFL++ | Exécuter une campagne de fuzzing complète avec collecte des crashes |
| 22 | `triage_crash` | GDB | Analyse de crash et évaluation de l'exploitabilité |
| 23 | `verify_path_and_get_args` | angr | Exécution symbolique — prouver l'accessibilité d'un chemin et calculer des entrées concrètes |
| 24 | `taint_trace` | Radare2 + angr | Analyse de flux de données (taint) des sources vers les puits (sinks) |
---
### 🔐 Plugin d'audit de code source (1 outil)
| # | Outil | Backend | Description |
|---|---|---|---|
| 25 | `audit_source_code` | AST + Regex | Analyse AST Python + analyse par expressions régulières C/C++ pour motifs dangereux |
---
### 🛠️ Plugin d'utilitaires courants (20 outils)
**Opérations sur les fichiers (5 outils)**
| # | Outil | Description |
|---|---|---|
| 26 | `run_file` | Identification du type de fichier, de l'architecture et du compilateur |
| 27 | `copy_to_workspace` | Copier un fichier dans l'espace de travail d'analyse |
| 28 | `create_directory` | Créer un répertoire dans l'espace de travail |
| 29 | `list_workspace` | Lister tous les fichiers de l'espace de travail |
| 30 | `scan_workspace` | Analyse complète de l'espace de travail avec métadonnées de fichiers |
**Explication de patch (1 outil)**
| # | Outil | Description |
|---|---|---|
| 31 | `explain_patch` | Expliquer un patch binaire en langage naturel |
**Assembleur (1 outil)**
| # | Outil | Backend | Description |
|---|---|---|---|
| 32 | `assemble_instructions` | Keystone | Assembler des instructions en code machine (x86, ARM, MIPS, etc.) |
**Gestion de la mémoire IA (11 outils)**
Ces outils permettent à l'IA de persister et de rappeler des résultats entre les sessions d'analyse à l'aide d'une base de données SQLite asynchrone :
| # | Outil | Description |
|---|---|---|
| 33 | `create_memory_session` | Démarrer une nouvelle session mémoire pour une analyse |
| 34 | `store_analysis_finding` | Persister un résultat d'analyse avec des balises |
| 35 | `query_analysis_memories` | Rechercher des résultats antérieurs par requête |
| 36 | `get_binary_analysis_context` | Récupérer tout le contexte d'un binaire spécifique |
| 37 | `tag_analysis_session` | Ajouter des balises à une session pour l'organisation |
| 38 | `search_memories_by_tag` | Trouver des sessions/résultats par balise |
| 39 | `delete_analysis_session` | Supprimer une session et ses résultats |
| 40 | `cleanup_expired_sessions` | Supprimer les sessions plus anciennes qu'un seuil |
| 41 | `list_analysis_sessions` | Lister toutes les sessions actives |
| 42 | `export_memory_store` | Exporter toutes les mémoires dans un format portable |
| 43 | `import_memory_store` | Importer des mémoires depuis un fichier d'exportation |
**Surveillance du serveur (2 outils)**
| # | Outil | Description |
|---|---|---|
| 44 | `get_server_health` | Temps de fonctionnement (uptime), utilisation mémoire, outils chargés, version de Python |
| 45 | `get_tool_metrics` | Nombre d'appels par outil, temps d'exécution moyens, taux d'erreur, succès/échec du cache |
---
### ⚙️ Plugin Radare2 et r2ghidra (30 outils)
Tous les outils Radare2 utilisent un pool de connexions thread-safe (`r2_pool.py`) qui gère automatiquement les sessions r2pipe.
| # | Outil | Description |
|---|---|---|
| 46 | `Radare2_open_file` | Ouvrir un fichier binaire dans Radare2 |
| 47 | `Radare2_close_file` | Fermer une session Radare2 |
| 48 | `Radare2_list_open_files` | Lister les fichiers actuellement ouverts |
| 49 | `Radare2_analyze_binary` | Exécuter l'auto-analyse complète (`aaa`) |
| 50 | `Radare2_list_functions` | Lister toutes les fonctions détectées |
| 51 | `Radare2_disassemble_function` | Désassembler une fonction spécifique |
| 52 | `Radare2_disassemble_address` | Désassembler à une adresse spécifique |
| 53 | `Radare2_decompile_function` | Décompiler via r2ghidra (moteur Ghidra intégré à r2, aucune JVM requise) |
| 54 | `Radare2_list_exports` | Lister les symboles exportés |
| 55 | `Radare2_list_imports` | Lister les fonctions importées |
| 56 | `Radare2_list_sections` | Lister les sections du binaire avec l'entropie |
| 57 | `Radare2_list_strings` | Lister les chaînes trouvées dans le binaire |
| 58 | `Radare2_find_cross_references` | Suivre les appels de fonctions et les références de données |
| 59 | `Radare2_search_bytes` | Rechercher des motifs d'octets dans le binaire |
| 60 | `Radare2_get_binary_info` | Obtenir les métadonnées du binaire (arch, format, endianness) |
| 61 | `Radare2_execute_command` | Exécuter une commande Radare2 brute |
| 62 | `Radare2_esil_emulate` | Émulation ESIL à une adresse spécifique |
| 63 | `Radare2_get_hexdump` | Hex dump à une adresse virtuelle |
| 64 | `Radare2_get_cfg_data` | Extraire les données du graphe de flux de contrôle |
| 65 | `Radare2_generate_cfg_png` | Générer le CFG sous forme d'image PNG |
| 66 | `Radare2_generate_callgraph` | Générer le graphe d'appels de fonctions |
| 67 | `Radare2_recover_structures` | Récupérer automatiquement les structures C et les persister dans la base de données d'annotations |
| 68 | `Radare2_decompile_with_r2ghidra` | Décompilation C de haute qualité avec mise en cache |
| 69 | `Radare2_annotate_binary` | Ajouter des annotations au binaire |
| 70 | `Radare2_get_annotations` | Récupérer les annotations |
| 71 | `Radare2_export_annotations` | Exporter les annotations vers un fichier |
| 72 | `Radare2_import_annotations` | Importer des annotations depuis un fichier |
| 73 | `Radare2_detect_crypto_constants` | Détecter les constantes cryptographiques (S-box AES, etc.) |
| 74 | `Radare2_find_gadgets` | Trouver des gadgets ROP/JOP |
| 75 | `Radare2_calculate_entropy` | Calculer l'entropie par section |
---
### 🦠 Plugin d'analyse de malwares (9 outils)
| # | Outil | Backend | Description |
|---|---|---|---|
| 76 | `dormant_detector` | Radare2 + heuristics | Trouver des portes dérobées cachées, des fonctions orphelines, des bombes à retardement, des bombes logiques |
| 77 | `adaptive_vaccine` | YARA + Radare2 | Générer des règles de détection YARA + des patchs binaires pour neutraliser les menaces |
| 78 | `vulnerability_hunter` | Radare2 + analysis | Détecter les motifs d'API dangereux (strcpy, sprintf) et les chaînes de gadgets ROP |
| 79 | `extract_iocs` | Regex + LIEF | Extraire les IP, URL, domaines, hashs, clés de registre, adresses crypto |
| 80 | `run_yara` | YARA | Analyser avec des fichiers de règles personnalisés et des ensembles de règles intégrés |
| 81 | `generate_poc_exploit` | pwntools | Générer un code d'exploit de preuve de concept |
| 82 | `build_rop_chain` | ROPgadget + pwntools | Construction automatisée de chaînes ROP |
| 83 | `autonomous_vuln_hunt` | Radare2 + angr | Pipeline autonome de chasse aux vulnérabilités |
| 84 | `analyze_heap_exploit` | Radare2 + heuristics | Analyse d'exploitation du tas (UAF, double-free, overflow) |
---
### 🕵️ Plugin de forensique numérique (22 outils)
**Forensique mémoire (6 outils)**
| # | Outil | Backend | Description |
|---|---|---|---|
| 85 | `memory_analyze` | Volatility3 | Analyse complète d'un dump mémoire |
| 86 | `memory_list_processes` | Volatility3 | Lister les processus en cours d'exécution depuis le dump mémoire |
| 87 | `memory_detect_injections` | Volatility3 | Détecter l'injection de code dans la mémoire des processus |
| 88 | `memory_extract_strings` | Volatility3 | Extraire les chaînes de la mémoire des processus |
| 89 | `memory_dump_module` | Volatility3 | Extraire (dumper) un module chargé depuis la mémoire |
| 90 | `memory_list_symbols` | Volatility3 | Lister les symboles depuis la mémoire |
**Forensique disque (6 outils)**
| # | Outil | Backend | Description |
|---|---|---|---|
| 91 | `disk_list_partition` | Sleuth Kit | Lister les partitions du disque |
| 92 | `disk_list_files` | Sleuth Kit | Lister les fichiers d'une image disque |
| 93 | `disk_recover_deleted` | Sleuth Kit | Récupérer les fichiers supprimés |
| 94 | `disk_analyze_mft` | Sleuth Kit | Analyser la Master File Table NTFS |
| 95 | `disk_extract_file` | Sleuth Kit | Extraire un fichier d'une image disque |
| 96 | `disk_hash_verify` | Sleuth Kit | Vérifier l'intégrité des fichiers via hash |
**Forensique réseau (5 outils)**
| # | Outil | Backend | Description |
|---|---|---|---|
| 97 | `pcap_analyze` | Scapy | Analyse PCAP : répartition des protocoles, anomalies |
| 98 | `pcap_list_connections` | Scapy | Lister toutes les connexions réseau |
| 99 | `pcap_extract_dns` | Scapy | Extraire les requêtes et réponses DNS |
| 100 | `pcap_extract_c2` | Scapy | Identifier les communications C2 potentielles |
| 101 | `pcap_reconstruct_stream` | Scapy | Reconstruire les flux TCP |
**Analyse des artefacts (5 outils)**
| # | Outil | Backend | Description |
|---|---|---|---|
| 102 | `artifact_collect` | Custom parsers | Collecter l'historique du navigateur, les ruches de registre, les journaux d'événements, prefetch |
| 103 | `artifact_correlate_ioc` | Custom parsers | Corréler les artefacts avec des IOC connus |
| 104 | `artifact_generate_yara` | YARA | Générer des règles YARA à partir de motifs d'artefacts |
| 105 | `artifact_timeline` | Custom parsers | Construire une chronologie à partir de multiples sources d'artefacts |
| 106 | `artifact_report` | Custom parsers | Générer un rapport d'analyse des artefacts |
---
### 📝 Plugin de génération de rapports (14 outils)
| # | Outil | Description |
|---|---|---|
| 107 | `get_system_time` | Obtenir l'horodatage du serveur (empêche l'IA d'inventer des dates) |
| 108 | `set_timezone` | Définir le fuseau horaire des rapports |
| 109 | `get_timezone_info` | Obtenir les informations du fuseau horaire actuel |
| 110 | `start_report_session` | Démarrer une session d'analyse chronométrée avec un ID unique |
| 111 | `end_report_session` | Finaliser la session : calculer la durée, verrouiller les listes IOC/ATT&CK |
| 112 | `get_report_session_status` | Vérifier l'état de la session |
| 113 | `list_report_sessions` | Lister toutes les sessions actives/terminées |
| 114 | `add_ioc` | Collecter et baliser les IOC pendant une session en direct |
| 115 | `add_analysis_note` | Ajouter des notes catégorisées (résultat, avertissement, comportement) |
| 116 | `add_mitre_technique` | Documenter les ID de techniques MITRE ATT&CK |
| 117 | `set_severity` | Définir la sévérité de la session (faible/moyenne/élevée/critique) |
| 118 | `create_analysis_report` | Générer le rapport en 4 modes : `full_analysis`, `quick_triage`, `ioc_summary`, `executive_brief` |
| 119 | `generate_vex_report` | Générer un rapport VEX (Vulnerability Exploitability eXchange) |
| 120 | `generate_sigma_rule` | Générer des règles de détection SIGMA |
---
## Invites d'analyse guidée (22 modes)
Les invites sont des flux de travail d'analyse préconstruits qui préparent l'IA avec une personnalité structurée, des séquences d'utilisation d'outils étape par étape et des règles de classification des preuves. Vous les activez en référençant le nom de l'invite dans votre client IA.
### Analyse de malwares (9 invites)
| Invite | Cas d'utilisation |
|---|---|
| `full_analysis_mode` | Analyse complète en 6 phases : triage → désassemblage → comportement → réseau → persistance → rapport |
| `malware_analysis_mode` | Analyse de malware ciblée avec classification des menaces |
| `basic_analysis_mode` | Triage rapide pour l'évaluation initiale et des verdicts rapides |
| `apt_hunting_mode` | Chasse spécifique aux APT : mouvement latéral, persistance, exfiltration de données |
| `malware_defense_mode` | Orienté défense : générer des règles de détection et des mesures d'atténuation |
| `unpacking_mode` | Analyser et contourner le packing/l'obfuscation (Themida, VMProtect, UPX) |
| `c2_extraction_mode` | Extraire et analyser l'infrastructure de communication C2 |
| `ransomware_triage_mode` | Triage spécifique aux ransomwares : analyse du chiffrement, évaluation de la récupération des clés |
| `code_similarity_mode` | Comparer les binaires pour la similarité de code et la lignée partagée |
### Recherche en sécurité (6 invites)
| Invite | Cas d'utilisation |
|---|---|
| `vulnerability_research_mode` | Chasse aux bugs : dépassements de tampon, UAF, injection de commandes |
| `crypto_analysis_mode` | Analyse des implémentations cryptographiques et détection de faiblesses |
| `firmware_analysis_mode` | Firmware IoT/embarqué : extraction binwalk, chaînes UART, identifiants codés en dur |
| `patch_analysis_mode` | Analyse de patchs de sécurité et tests de régression |
| `source_code_audit_mode` | Audit de sécurité du code source (Python, C, C++) |
| `autonomous_vuln_hunt_mode` | Pipeline autonome de chasse aux vulnérabilités |
### Recherche CVE et développement d'exploits (5 invites)
| Invite | Cas d'utilisation |
|---|---|
| `taint_analysis_mode` | Analyse de flux de données (taint) : découverte automatisée des chemins source→puits |
| `heap_exploit_mode` | Analyse d'exploitation du tas et génération de PoC |
| `fuzzing_mode` | Configuration de campagne de fuzzing et triage des crashes |
| `patch_diff_auto_mode` | Diff de patch automatisé pour la recherche de vulnérabilités 1-day |
| `cve_discovery_pipeline_mode` | Pipeline complet de découverte de CVE : du diff de patch à l'exploit fonctionnel |
### Autres (2 invites)
| Invite | Cas d'utilisation |
|---|---|
| `game_analysis_mode` | Analyse de client de jeu : détection anti-triche, rétro-ingénierie (RE) de protocole, inspection mémoire |
| `report_generation_mode` | Flux de travail de session structuré avec correspondance des techniques MITRE ATT&CK |
> **Comment fonctionnent les invites :** Chaque invite prépare l'IA avec une personnalité d'analyse structurée. Elle inclut des points de contrôle de raisonnement Chain-of-Thought (où l'IA doit s'arrêter et évaluer avant de continuer) et des règles de classification des preuves qui empêchent l'IA de présenter des spéculations comme des faits. Chaque résultat doit être étiqueté `OBSERVED` (vérifié directement), `INFERRED` (dérivé logiquement de l'analyse statique) ou `POSSIBLE` (nécessite une vérification supplémentaire).
---
## Ressources MCP (11 URI)
Les ressources sont des points de terminaison de données en lecture seule accessibles aux clients IA via des modèles d'URI. Elles complètent les outils en fournissant des données structurées sans nécessiter d'appels d'outils explicites.
### Ressources statiques
| URI | Description |
|---|---|
| `reversecore://guide` | Guide d'utilisation des outils avec règles de chemins de fichiers et bonnes pratiques |
| `reversecore://guide/structures` | Guide technique de récupération de structures et d'analyse de références croisées |
| `reversecore://tools` | Documentation complète des 120 outils enregistrés |
| `reversecore://logs` | Journaux d'application (100 dernières lignes) |
### Ressources dynamiques (Système de fichiers virtuel par binaire)
Ces URI se résolvent par binaire et invoquent les outils d'analyse correspondants à la demande :
| Modèle d'URI | Description |
|---|---|
| `reversecore://{filename}/strings` | Extraire toutes les chaînes d'un binaire |
| `reversecore://{filename}/iocs` | Extraire les IOC (IP, URL, e-mails, hashs) |
| `reversecore://{filename}/func/{address}/code` | Code pseudo-C décompilé pour une fonction |
| `reversecore://{filename}/func/{address}/asm` | Désassemblage pour une fonction |
| `reversecore://{filename}/func/{address}/cfg` | Graphe de flux de contrôle au format Mermaid |
| `reversecore://{filename}/functions` | Liste de toutes les fonctions du binaire |
| `reversecore://{filename}/dormant_detector` | Résultats de l'analyse du dormant detector |
---
## Démarrage rapide
### Option 1 — PyPI (La plus simple)```bash
pip install reversecore-mcp
reversecore-mcp
Prérequis : Radare2 doit être installé sur votre système (
r2 --version). YARA est installé automatiquement viayara-python.
Tous les moteurs d'analyse (Radare2, r2ghidra, YARA, Binwalk, Sleuth Kit, GDB, etc.) sont préinstallés :```bash
docker run -i --rm
-v /path/to/your/samples:/app/workspace
-e REVERSECORE_WORKSPACE=/app/workspace
-e MCP_TRANSPORT=stdio
ghcr.io/sjkim1127/reversecore_mcp:latest
### Option 3 — Compiler depuis les sources (Docker Compose)```bash
git clone https://github.com/sjkim1127/Reversecore_MCP.git
cd Reversecore_MCP
./scripts/run-docker.sh # auto-detects Intel / Apple Silicon
Ou manuellement :```bash docker compose --profile x86 up -d # Intel/AMD docker compose --profile arm64 up -d # Apple Silicon (M1/M2/M3)
### Option 4 — Python (Développement local)```bash
git clone https://github.com/sjkim1127/Reversecore_MCP.git
cd Reversecore_MCP
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python -m reversecore_mcp.server
Prérequis pour le mode local : Radare2 doit être installé sur votre système (
r2 --version). Les backends d'outils individuels (YARA, LIEF, Capstone, etc.) sont installés via pip. Pour un support forensique complet, vous aurez également besoin de Volatility3, Scapy et Sleuth Kit.
Ajoutez la configuration du serveur aux paramètres de votre client IDE (par exemple, ~/.cursor/mcp.json ou claude_desktop_config.json).
Si vous avez le conteneur en cours d'exécution via Docker Compose, ce mode achemine stdio directement dans le conteneur en cours d'exécution. Latence de démarrage nulle, mémoire persistante et disponibilité complète des outils.```json { "mcpServers": { "Reversecore_MCP": { "command": "docker", "args": [ "exec", "-i", "-e", "MCP_TRANSPORT=stdio", "reversecore-mcp-arm64", "python", "-m", "reversecore_mcp.server" ] } } }
> Remplacez `reversecore-mcp-arm64` par `reversecore-mcp` si vous êtes sur Intel/AMD.
---
### 🌐 Option 2 : Mode HTTP SSE
Pour le streaming réseau (Server-Sent Events) :```json
{
"mcpServers": {
"Reversecore_MCP": {
"url": "http://localhost:8000/mcp/sse"
}
}
}
Lance un conteneur neuf et isolé pour chaque session:
⚠️ Important — Chemins de fichiers dans Docker
Votre dossier local est monté sur
/app/workspacedans le conteneur. Référencez toujours les fichiers par nom de fichier uniquement, et non par votre chemin local complet.
❌ Incorrect ✅ Correct r2_decompile("/Users/john/samples/mal.exe")r2_decompile("mal.exe")
Tous les paramètres peuvent être fournis via des variables d'environnement ou un fichier .env (voir .env.example). Les paramètres sont gérés via Pydantic BaseSettings avec le préfixe REVERSECORE_.
| Variable | Défaut | Description |
|---|---|---|
REVERSECORE_PLUGIN_DIRS | "" | Répertoires à analyser pour les plugins d'extension, séparés par des virgules |
REVERSECORE_SAST_RULES_PATH | "" | Chemin vers un fichier de règles SAST YAML personnalisé |
La sécurité est mise en œuvre selon le principe de défense en profondeur, avec des protections à plusieurs niveaux :
| Contrôle | Implémentation |
|---|---|
| Exécution non root | S'exécute en tant que appuser (UID 1000) avec des capacités minimales |
| Limites de ressources | Docker Compose applique des limites de CPU (2.0) et de mémoire (4 Go) |
Les 17 classes d'exception portent des codes d'erreur RCMCP-E* pour une gestion programmatique. Voir Gestion des erreurs pour la hiérarchie complète.
git clone https://github.com/sjkim1127/Reversecore_MCP.git cd Reversecore_MCP python -m venv venv && source venv/bin/activate pip install -r requirements.txt pip install -r requirements-dev.txt pre-commit install # installs Ruff, Bandit, Gitleaks hooks
### Tests```bash
# Full test suite with coverage report
pytest tests/ -v
# Unit tests only (fast, no external dependencies)
pytest tests/unit/ -v
# Integration tests (requires Docker)
pytest tests/integration/ -v
# Run with coverage threshold enforcement
pytest tests/unit/ --cov=reversecore_mcp --cov-fail-under=80
# Run a specific test
pytest tests/unit/test_cli_tools.py::TestRunFile::test_success -v
# Security boundary tests
pytest tests/ -m security -v
# Benchmarks
pytest tests/ -m benchmark -v
Statut des tests :
pytest-asyncioMarqueurs de tests :
ruff check reversecore_mcp/ # Lint (E, W, F, I, B, C4, UP rules) ruff format reversecore_mcp/ # Format mypy reversecore_mcp/ # Type check (0 errors across 108 files) bandit -r reversecore_mcp/ # Security scan (all severities) pip-audit # Dependency CVE scan
### Hooks de pre-commit
Les hooks suivants s'exécutent automatiquement à chaque commit :
1. **Ruff** — lint avec correction automatique + vérification du format
2. **trailing-whitespace** — supprime les espaces en fin de ligne
3. **end-of-file-fixer** — garantit que les fichiers se terminent par un saut de ligne
4. **check-yaml / check-json** — valide la syntaxe YAML/JSON
5. **check-added-large-files** — bloque les fichiers > 1 Mo
6. **check-merge-conflict** — détecte les marqueurs de fusion non résolus
7. **detect-private-key** — empêche les commits accidentels de clés
8. **Bandit** — analyse de sécurité Python
---
## Pipeline CI/CD
Chaque push vers `main` déclenche 11 jobs de pipeline. Tous doivent réussir avant le déploiement.```
Lint & Security Gate Unit Tests (Python Matrix)
├─ Gitleaks (secret scan) ├─ pytest 3.10 --cov-fail-under=80
├─ Hadolint (Dockerfile lint) ├─ pytest 3.11 --cov-fail-under=80
├─ Ruff check + format └─ pytest 3.12 --cov-fail-under=80
├─ Mypy type check (108 files)
├─ Bandit (all severities) Wheel Smoke Test
├─ pip-audit (no CVEs) └─ Build wheel → install in /tmp
└─ Security boundary tests → verify plugin discovery
→ assert __file__ under sys.prefix
CodeQL Analysis
└─ Python SAST Docker Verification
├─ Build reversecore-mcp:ci
Exploit Safety Gate ├─ Trivy container scan
├─ Bandit on POC templates ├─ Image size check (< 5 GB)
├─ Hypothesis DAST fuzzing ├─ CLI tool verification
├─ Performance benchmarks ├─ Integration tests in container
└─ Container isolation test └─ E2E tool invocation
In-Container Smoke Test Build Base Image (amd64 + arm64)
├─ Copy test ELF into container ├─ Compile YARA 4.3.1
└─ Run scripts/smoke_test.py ├─ Compile Radare2 6.0.4
├─ Compile r2ghidra
Deploy (amd64 + arm64) └─ Push to GHCR
├─ Build app image
├─ Push to GHCR Merge Manifests
└─ Trivy rescan on published └─ Multi-arch manifest → :latest
Politique de non-contournement : Les échecs CI/CD ne sont jamais résolus en modifiant la configuration du pipeline. Les causes racines sont toujours corrigées directement dans le code source ou les dépendances.
Le build Docker utilise une approche en deux couches pour maintenir des temps de build raisonnables :
Dockerfile.base)Un build multi-étapes qui compile toutes les dépendances lentes à construire et rarement modifiées à partir du code source :``` compiler-toolchain (python:3.12-slim-bookworm + build tools) ├── compiler-yara (YARA 4.3.1 from source) [parallel] ├── compiler-r2 (Radare2 6.0.4 from source) [parallel] │ └── compiler-r2ghidra (r2ghidra plugin) [sequential] └── compiler-pip (pip install into /opt/venv) [parallel]
base (final runtime: python:3.12-slim-bookworm) ├── Runtime packages: file, binutils, gdb, binwalk, graphviz, nasm, sleuthkit ├── /opt/yara (compiled YARA) ├── /opt/radare2 (compiled r2 + r2ghidra) ├── /opt/venv (Python packages) └── Non-root user: appuser (UID 1000)
Cette image n'est reconstruite que lorsque les versions des outils changent. Durée de construction : ~12 minutes.
### Couche 2 : Image d'application (`Dockerfile`)
Hérite de l'image de base et copie le code de l'application :```
FROM base image
├── COPY reversecore_mcp/ (application code)
├── COPY scripts/ (smoke test, benchmarks)
├── pip install any new requirements
├── Security package upgrades
└── CMD ["python", "-m", "reversecore_mcp.server"]
Build time: ~60 secondes.
Trois services avec des profils spécifiques à l'architecture :
Limites de ressources: 2.0 cœurs CPU, 4 Go de mémoire par conteneur.
reversecore_mcp/ ├── core/ # Infrastructure layer (37 modules) │ ├── config.py # Pydantic BaseSettings (34+ env vars) │ ├── exceptions.py # Exception hierarchy (17 classes, RCMCP-E* codes) │ ├── security.py # Input sanitization & command arg validation │ ├── validators.py # Path validators (TOCTOU-hardened, symlink-safe) │ ├── r2_pool.py # Thread-safe Radare2 connection pool │ ├── r2_helpers.py # Structured Radare2 output parsing │ ├── metrics.py # Per-tool timing, counts, error rates, cache stats │ ├── decorators.py # @log_execution, @track_metrics │ ├── error_handling.py # @handle_tool_errors decorator │ ├── error_formatting.py # Structured error formatting │ ├── execution.py # Safe subprocess with timeout/output limits │ ├── command_spec.py # Command specifications │ ├── memory.py # Async SQLite AI memory store │ ├── mitre_mapper.py # MITRE ATT&CK mapping engine │ ├── evidence.py # Evidence classification (OBSERVED/INFERRED/POSSIBLE) │ ├── resilience.py # Retry, circuit-breaker, timeout patterns │ ├── task_queue.py # Background task queue (Redis + arq) │ ├── extension_registry.py # Plugin registration system │ ├── arch_registry.py # Multi-arch mapping (x86/ARM/MIPS/RISC-V/PPC) │ ├── result_cache.py # SHA256-based tool result caching │ ├── analysis_cache.py # Multi-level decompilation cache (Redis + SQLite) │ ├── result.py # ToolSuccess / ToolError Pydantic models │ ├── loader.py # Dynamic tool module loader │ ├── plugin.py # Plugin base class │ ├── extension.py # Extension base class │ ├── container.py # Container/sandbox execution │ ├── audit.py # Audit logging │ ├── binary_cache.py # Binary file caching │ ├── json_utils.py # orjson-backed JSON (3-5x faster) │ ├── logging_config.py # Loguru logging configuration │ ├── report_generator.py # Report rendering (Markdown, PDF) │ ├── resource_manager.py # MCP resource lifecycle │ └── sast/ # Source code scanners │ ├── python_ast_scanner.py # Python AST vulnerability scanner │ ├── regex_scanner.py # C/C++ regex vulnerability scanner │ ├── rule_manager.py # SAST rule loader │ └── default_rules.yaml # Default scanning rules │ ├── tools/ # MCP tool implementations (120 tools) │ ├── analysis/ # Static analysis (24 tools) │ │ ├── static_analysis.py # file, strings, binwalk │ │ ├── lief_tools.py # LIEF binary parser │ │ ├── capa_tools.py # CAPA capability detection │ │ ├── die_tools.py # Detect It Easy packer detection │ │ ├── diff_tools.py # Binary diffing │ │ ├── emulation_tools.py # ESIL emulation │ │ ├── fuzz_tools.py # Fuzzing harness generator │ │ ├── fuzzing_campaign.py # Full fuzzing campaign runner │ │ ├── symbolic_analysis.py # angr symbolic execution │ │ ├── signature_tools.py # Library signature matching │ │ ├── source_auditor.py # SAST (Python + C/C++) │ │ ├── crash_triage.py # GDB crash triage │ │ ├── taint_analysis.py # Source→sink taint tracing │ │ ├── advanced_yara.py # Advanced YARA generation │ │ ├── patch_vuln_inference.py # Patch vulnerability inference │ │ └── cache_tools.py # Analysis cache management │ │ │ ├── radare2/ # Disassembly & decompilation (30 tools) │ │ ├── radare2_mcp_tools.py # Core Radare2 tool set │ │ ├── r2ghidra_tools.py # r2ghidra decompiler (cached) │ │ ├── r2_analysis.py # Deep function analysis │ │ ├── r2_db.py # SQLite annotation + cache DB │ │ ├── r2_esil_simulator.py # Multi-arch ESIL simulator │ │ └── r2_session.py # Stateful analysis sessions │ │ │ ├── malware/ # Threat detection (9 tools) │ │ ├── dormant_detector.py # Backdoor/logic bomb detection │ │ ├── ioc_tools.py # IOC extraction │ │ ├── yara_tools.py # YARA scanning │ │ ├── adaptive_vaccine.py # YARA rule + patch generation │ │ ├── vulnerability_hunter.py # Dangerous API detection │ │ ├── autonomous_hunter.py # Autonomous vuln hunting pipeline │ │ ├── heap_exploit.py # Heap exploitation analysis │ │ ├── poc_generator.py # PoC exploit generation │ │ └── rop_builder.py # ROP chain construction │ │ │ ├── forensics/ # Digital forensics (22 tools) │ │ ├── memory.py # Volatility3 memory forensics │ │ ├── network.py # Scapy PCAP analysis │ │ ├── disk.py # Sleuth Kit disk forensics │ │ └── artifact.py # Browser/registry/event log analysis │ │ │ ├── report/ # Report generation (14 tools) │ │ ├── report_mcp_tools.py # MCP-registered report tools │ │ ├── report_tools.py # Report rendering logic │ │ ├── session.py # Session state management │ │ ├── converter.py # Format conversion (Markdown → PDF/HTML) │ │ ├── email.py # SMTP report delivery │ │ ├── sigma_generator.py # SIGMA rule generation │ │ └── vex_generator.py # VEX report generation │ │ │ └── common/ # Shared utilities (20 tools) │ ├── file_operations.py # File ops, workspace management │ ├── server_tools.py # Server health, tool metrics │ ├── memory_tools.py # AI memory management (11 tools) │ ├── patch_explainer.py # Binary patch explanation │ └── assembler.py # Keystone assembler │ ├── prompts/ # AI reasoning prompts (22 modes) │ ├── malware.py # 9 malware analysis prompts │ ├── security.py # 6 security research prompts │ ├── cve_research.py # 5 CVE/exploit research prompts │ ├── game.py # Game client analysis prompt │ ├── report.py # Report generation prompt │ ├── server_health.py # Server inspection prompts │ └── common.py # Shared constants (DOCKER_PATH_RULE, LANGUAGE_RULE) │ ├── dashboard/ # Web dashboard (FastAPI + HTMX) │ ├── templates/ # Jinja2 templates with HTMX fragments │ └── static/ # htmx.min.js (local, CSP-compliant) │ ├── web/ # HTTP transport layer │ ├── auth.py # API key authentication middleware │ ├── middleware.py # Security headers, loopback restriction │ └── endpoints.py # /health, file upload, dashboard routes │ ├── resources.py # 11 MCP resources (static + dynamic per-binary) └── server.py # FastMCP server entry point
**Autres répertoires :**```
tests/
├── unit/ # 1,957 unit tests
├── integration/ # Docker-based integration tests
├── fixtures/ # Test binaries, YARA rules, sample data
└── conftest.py # Shared pytest fixtures
scripts/
├── smoke_test.py # Multi-layer in-container smoke test
├── check_release_metadata.py # Version consistency validation
├── fetch_test_binaries.py # Download test fixtures
├── run-docker.sh # Auto-detect architecture and start
└── ... # Benchmarks, analysis scripts
docs/
├── getting-started/ # Installation guide
├── development/ # Architecture, contributing, testing guides
├── api/ # Tool and module reference
└── user-guide/ # Analysis workflows
Toutes les exceptions personnalisées héritent de ReversecoreError et portent des codes d'erreur structurés :
Les clients IA peuvent utiliser le champ error_code pour gérer les échecs par programmation et décider de réessayer, d'essayer un outil alternatif ou de signaler l'erreur à l'utilisateur.
Suivez ce modèle pour ajouter un nouvel outil MCP :```python
from reversecore_mcp.core.decorators import log_execution from reversecore_mcp.core.result import ToolResult, success, failure from reversecore_mcp.core.security import validate_file_path
@log_execution() async def my_analysis_tool( file_path: str, option: str | None = None, ) -> ToolResult: """Analyze a binary for X.
Args:
file_path: Path to the binary file (relative to workspace).
option: Optional analysis option.
Returns:
ToolResult with status='success' and structured content.
"""
try:
safe_path = validate_file_path(file_path)
result = await perform_analysis(safe_path)
return success({"result": result})
except Exception as e:
return failure(
error_code="RCMCP-E100",
message=str(e),
hint="Check that the file exists and is a valid binary.",
)
Ensuite, enregistrez-le dans le `__init__.py` du plugin approprié et ajoutez des tests dans `tests/unit/`.
---
## Contribuer
1. Forkez le dépôt
2. Créez une branche de fonctionnalité : `git checkout -b feat/my-feature`
3. Écrivez des tests en parallèle de votre code — la couverture ne doit pas descendre en dessous de 80 %
4. Assurez-vous que toutes les vérifications passent : `pytest`, `ruff check`, `mypy`, `bandit`
5. Ouvrez une pull request avec une description claire
Veuillez lire le [Guide de contribution](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/development/contributing.md) pour les normes de code, les conventions de docstring (style Google) et la liste de contrôle des pull requests.
---
## Documentation
| Document | Description |
|---|---|
| [Guide d'installation](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/getting-started/installation.md) | Configuration détaillée pour tous les environnements |
| [Guide d'architecture](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/development/architecture.md) | Conception du système et détails des composants |
| [Guide de contribution](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/development/contributing.md) | Normes de code, docstrings, workflow des PR |
| [Guide des tests](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/development/testing.md) | Modèles de test, fixtures et couverture |
| [Référence de l'API](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/api/) | Référence des outils et modules |
| [Guide utilisateur](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/user-guide/) | Workflows d'analyse |
---
## Exemples d'utilisation
### Exemple 1 : Tri de base des malwares```
User: "Analyze this suspicious file sample.exe"
AI calls:
1. run_file("sample.exe") → PE32 executable, x86, MSVC
2. detect_packer("sample.exe") → Not packed
3. extract_iocs("sample.exe") → 3 IPs, 2 URLs, 1 mutex
4. run_capa("sample.exe") → "creates persistence", "encrypts data"
5. dormant_detector("sample.exe") → 2 orphan functions with network calls
6. generate_yara_rule("sample.exe") → Detection rule generated
AI response: "This PE32 binary shows ransomware-like behavior. CAPA detected
encryption and persistence capabilities. I found 2 hidden network functions
that may serve as a backup C2 channel. Here's a YARA rule for detection..."
User: "Find exploitable bugs in this network daemon"
AI activates: taint_analysis_mode
AI calls:
taint_trace("daemon", verify_with_angr=True) → Found 3 source→sink paths: recv() → strcpy() [CWE-120, CONFIRMED by angr] read() → sprintf() [CWE-134, LIKELY] getenv() → system() [CWE-78, POSSIBLE]
vulnerability_hunter("daemon") → 12 dangerous API calls, 4 exploitable patterns
generate_poc_exploit(target="daemon", vuln_type="bof", offset=128) → Python exploit script generated
AI response: "I found a confirmed stack buffer overflow where recv() data flows directly into strcpy() at 0x40123C. angr proved the path is reachable. Here's a working PoC..."
### Exemple 3: Enquête de criminalistique numérique```
User: "Analyze this memory dump from a compromised server"
AI calls:
1. memory_list_processes("memdump.raw")
→ 47 processes, 2 with suspicious names
2. memory_detect_injections("memdump.raw")
→ Code injection detected in PID 1842 (svchost.exe)
3. memory_extract_strings("memdump.raw", pid=1842)
→ C2 domain strings extracted
4. artifact_correlate_ioc(artifacts={"domains": ["evil-c2.com"]})
→ Matches known APT group IOCs
5. create_analysis_report(template_type="full_analysis")
→ PDF report with timeline and MITRE ATT&CK mapping
User: "Compare the patched and unpatched versions to find what was fixed"
AI activates: patch_diff_auto_mode
AI calls:
diff_binaries("libfoo-1.0.so", "libfoo-1.1.so") → 3 functions changed, 1 new function
patch_diff_1day("libfoo-1.0.so", "libfoo-1.1.so") → Automated analysis: bounds check added at parse_header()
r2_decompile("libfoo-1.0.so", "parse_header") → Decompiled vulnerable version (no bounds check)
r2_decompile("libfoo-1.1.so", "parse_header") → Decompiled patched version (memcpy size limited)
AI response: "The patch adds a bounds check in parse_header() at 0x12340. The old version copies user-controlled length bytes via memcpy without validation, creating a heap buffer overflow (CWE-122)."
---
## Prise en charge multi-architecture
Le module `arch_registry.py` fait correspondre les noms d'architectures aux paramètres de configuration de Radare2, permettant ainsi aux outils de fonctionner sur différentes architectures CPU sans configuration manuelle :
| Architecture | Clé | Architecture r2 | Largeurs de bits | Registre PC | Registre SP |
|---|---|---|---|---|---|
| Intel 32-bit | `x86` | `x86` | 32 | `eip` | `esp` |
| Intel/AMD 64-bit | `x86_64` | `x86` | 64 | `rip` | `rsp` |
| ARM 32-bit / Thumb | `arm32` | `arm` | 16, 32 | `r15` | `r13` |
| ARM 64-bit (AArch64) | `arm64` | `arm` | 64 | `pc` | `sp` |
| MIPS | `mips` | `mips` | 32, 64 | `pc` | `sp` |
| RISC-V | `riscv` | `riscv` | 32, 64 | `pc` | `sp` |
| PowerPC | `ppc` | `ppc` | 32, 64 | `pc` | `r1` |
**La résolution d'alias** est gérée automatiquement :
- `amd64` → `x86_64`
- `aarch64` → `arm64`
- `arm` avec `bits=64` → `arm64`
- `arm` avec `bits=16` ou `bits=32` → `arm32`
Des outils comme `Radare2_esil_emulate`, `assemble_instructions` et `r2_simulate_patch` utilisent ce registre pour configurer correctement l'environnement d'analyse pour n'importe quel binaire cible.
---
## Système de cache de résultats
Deux couches de cache minimisent les calculs redondants :
### Cache de résultats d'outil (`result_cache.py`)
Le décorateur `@cache_tool_result` met en cache la sortie de n'importe quel outil en fonction d'un hash SHA256 du fichier binaire et des arguments de mots-clés de l'outil :```
Cache key = SHA256( "<tool_name>::{sorted_json_kwargs}" )
Backend de stockage : base de données SQLite via r2_db.py, accessible via les outils get_cached_result() et set_cached_result().
Métriques : Les succès et les échecs de cache sont suivis via metrics_collector.record_cache_hit() et record_cache_miss(), visibles via l'outil get_tool_metrics.
analysis_cache.py)Un cache multi-niveaux spécifiquement pour les résultats de décompilation (qui sont coûteux à calculer) :
Import/Export : Les outils export_analysis_cache et import_analysis_cache permettent d'enregistrer l'état du cache vers/depuis des fichiers rcpack pour un partage entre environnements.
Le système de mémoire IA (memory_tools.py + core/memory.py) fournit un stockage persistant et interrogeable pour les résultats d'analyse entre les sessions. Cela permet à l'IA de :
create_memory_session("analysis of ransomware sample") │ ├── store_analysis_finding("Found AES-256 encryption at 0x401000", tags=["crypto", "ransomware"]) ├── store_analysis_finding("C2 beacon interval: 30 seconds", tags=["c2", "network"]) └── tag_analysis_session(tags=["ransomware", "financial-sector"])
query_analysis_memories("ransomware encryption") → Returns previous findings about ransomware encryption patterns
get_binary_analysis_context("sample.exe") → Returns all findings ever recorded for this binary
**Stockage :** base de données SQLite asynchrone au chemin configuré par `MEMORY_DB_PATH` (par défaut : `~/.reversecore_mcp/memory.db`).
**Portabilité :** utilisez `export_memory_store` et `import_memory_store` pour transférer l'intégralité de la base de données mémoire entre environnements.
---
## Tableau de bord web
En mode HTTP (`MCP_TRANSPORT=http`), un tableau de bord web est disponible à l'adresse `http://localhost:8000/dashboard`. Il fournit :
- Téléversement de binaires par glisser-déposer
- Statut d'analyse en temps réel
- Liste interactive des fonctions et vue de désassemblage
- Résultats d'extraction des IOC
- Surveillance de l'état du serveur
**Pile technique :** FastAPI + templates Jinja2 + HTMX (chargé localement depuis `dashboard/static/`, aucune dépendance CDN pour la conformité CSP).
**Fonctionnalités de sécurité :**
- Jetons CSRF sur tous les formulaires modifiant l'état
- Échappement automatique de Jinja2 activé
- Toutes les entrées utilisateur sont assainies via `html.escape()` avant affichage
- Protection contre les traversées de chemin via `validate_file_path()`
---
## Déploiement
### Liste de contrôle pour la production
Avant de déployer en production :
| Élément | Comment |
|---|---|
| Définir la clé API | `MCP_API_KEY=<clé-robuste-aléatoire>` |
| Utiliser un utilisateur non root | Intégré : le conteneur s'exécute en tant qu'`appuser` (UID 1000) |
| Définir les limites de ressources | Par défaut : 2 CPU / 4 Go de RAM dans `docker-compose.yml` |
| Activer la journalisation structurée | `LOG_FORMAT=json` pour l'agrégation de journaux |
| Configurer Redis | `REDIS_URL=redis://<host>:6379/0` pour la file de tâches et la mise en cache |
| Définir le chemin de l'espace de travail | `REVERSECORE_WORKSPACE=/path/to/isolated/directory` |
| Réviser les limites de débit | `REVERSECORE_RATE_LIMIT=60` (requêtes/min, ajuster selon les besoins) |
| Activer le sandbox | `REVERSECORE_SANDBOX_ENABLED=true` pour l'isolation de l'analyse dynamique |
### Contrôles de santé
Le serveur fournit des endpoints HTTP de contrôle de santé pour l'orchestration :```bash
# Liveness (always 200 if process is running)
curl http://localhost:8000/health/live
# Readiness (checks tool availability)
curl http://localhost:8000/health/ready
# Full health (requires API key if configured)
curl -H "X-API-Key: <key>" http://localhost:8000/health
These endpoints are exempted from API key authentication so load balancers and container orchestrators can probe them.
L'image Docker inclut une instruction HEALTHCHECK intégrée qui vérifie la connectivité TCP au port 8000 toutes les 30 secondes. Docker et Kubernetes redémarreront automatiquement les conteneurs en mauvaise santé.
L'outil CLI requis n'est pas installé dans l'environnement.
Solution : Si vous utilisez Docker, vérifiez que l'outil est dans l'image de base :```bash docker exec reversecore-mcp-arm64 which r2 yara binwalk tsk_recover gdb
Si vous utilisez une installation Python locale, installez l'outil manquant :```bash
# macOS
brew install radare2 yara binwalk sleuthkit
# Ubuntu/Debian
apt install radare2 yara binwalk sleuthkit
L'analyse a dépassé le délai d'attente configuré.
Solution : Augmentez le délai d'attente :```bash export REVERSECORE_DEFAULT_TOOL_TIMEOUT=300 # 5 minutes
Pour les gros binaires (>100 Mo), envisagez d'utiliser des variantes d'analyse rapide :
- `run_capa_quick` au lieu de `run_capa`
- `detect_packer` au lieu de `detect_packer_deep`
</details>
<details>
<summary><b>Erreur de traversée de chemin (RCMCP-E302)</b></summary>
Vous avez référencé un fichier en dehors du répertoire de l'espace de travail.
**Solution :** Copiez d'abord le fichier dans l'espace de travail :```
copy_to_workspace("/path/to/file.exe")
Ou montez des répertoires supplémentaires en lecture seule :```bash export REVERSECORE_READ_DIRS=/opt/samples,/mnt/evidence
</details>
<details>
<summary><b>Le conteneur Docker ne démarre pas sur Apple Silicon</b></summary>
Assurez-vous d'utiliser le profil ARM64 :```bash
docker compose --profile arm64 up -d
Ou utilisez le script de détection automatique :```bash ./scripts/run-docker.sh
</details>
<details>
<summary><b>Connexion Redis refusée</b></summary>
La file de tâches nécessite une instance Redis en cours d'exécution.
**Solution :** Démarrez Redis en même temps que le service principal :```bash
docker compose --profile arm64 up -d # Starts both reversecore and redis
Ou désactivez les fonctionnalités dépendantes de Redis en ne définissant pas REDIS_URL.
Cela signifie généralement que la fonction n'a pas été analysée au préalable.
Solution : Exécutez l'analyse avant la décompilation :``` Radare2_analyze_binary("sample.exe") Radare2_decompile_function("sample.exe", "main")
</details>
---
## FAQ
<details>
<summary><b>Est-ce que cela remplace Ghidra ou IDA Pro ?</b></summary>
Non. Ce projet est un complément, pas un remplacement. Il utilise r2ghidra (le moteur de décompilation Ghidra intégré dans Radare2) pour la décompilation. Il ne fournit pas d'interface graphique et ne dispose pas du flux de travail d'analyse interactif d'un désassembleur complet. Son objectif est de permettre aux assistants IA d'effectuer des tâches d'analyse par programmation.
</details>
<details>
<summary><b>Une installation séparée de Ghidra ou du JDK est-elle nécessaire ?</b></summary>
Non. Le plugin r2ghidra intègre le moteur de décompilation Ghidra directement dans Radare2. Pas de JDK, pas d'installation de Ghidra, pas de fichiers de projet Ghidra. Juste `r2` avec le plugin `r2ghidra` compilé.
</details>
<details>
<summary><b>Quels clients MCP sont pris en charge ?</b></summary>
Tout client qui implémente la spécification du [Model Context Protocol](https://modelcontextprotocol.io/). Testé avec : Claude Desktop, Cursor, Windsurf et Google Antigravity. Le serveur prend en charge les transports stdio et HTTP/SSE.
</details>
<details>
<summary><b>Puis-je analyser des fichiers PE Windows sous Linux/macOS ?</b></summary>
Oui. L'analyse statique (désassemblage, décompilation, extraction de chaînes, extraction d'IOC, analyse YARA) fonctionne sur tout format de fichier, quel que soit le système d'exploitation hôte. L'analyse dynamique (émulation, fuzzing) peut présenter des limitations selon l'architecture cible.
</details>
<details>
<summary><b>Est-il sûr d'analyser des malwares avec cet outil ?</b></summary>
Le conteneur Docker fournit une isolation : utilisateur non-root, pas de réseau par défaut en CI, limites de ressources. Pour l'analyse de malwares en conditions réelles, nous recommandons d'utiliser une machine virtuelle dédiée ou la fonctionnalité sandbox (`REVERSECORE_SANDBOX_ENABLED=true`). Les outils d'analyse statique (r2, YARA, strings) n'exécutent jamais le binaire cible.
</details>
<details>
<summary><b>Quelle est la taille maximale de fichier ?</b></summary>
Limites par défaut :
- Téléversement : 100 Mo (`MAX_UPLOAD_SIZE`)
- Analyse LIEF : 1 Go (`REVERSECORE_LIEF_MAX_FILE_SIZE`)
- Sortie d'outil : 10 Mo (`REVERSECORE_MAX_OUTPUT_SIZE`)
Toutes les limites sont configurables via des variables d'environnement.
</details>
---
## Remerciements
Ce projet s'appuie sur le travail de nombreux projets open-source :
| Projet | Rôle dans Reversecore MCP |
|---|---|
| [Radare2](https://radare.org/) | Désassemblage, émulation, analyse binaire |
| [r2ghidra](https://github.com/radareorg/r2ghidra) | Moteur de décompilation Ghidra pour Radare2 |
| [FastMCP](https://github.com/jlowin/fastmcp) | Framework de serveur MCP |
| [YARA](https://virustotal.github.io/yara/) | Correspondance de motifs pour la détection de malwares |
| [LIEF](https://lief-project.github.io/) | Analyse des formats binaires (PE, ELF, Mach-O) |
| [CAPA](https://github.com/mandiant/capa) | Détection de capacités Mandiant FLARE |
| [angr](https://angr.io/) | Moteur d'exécution symbolique |
| [Capstone](https://www.capstone-engine.org/) | Framework de désassemblage |
| [Keystone](https://www.keystone-engine.org/) | Framework d'assemblage |
| [pwntools](https://github.com/Gallopsled/pwntools) | Boîte à outils de développement d'exploits |
| [ROPgadget](https://github.com/JonathanSalwan/ROPgadget) | Chercheur de gadgets ROP |
| [Volatility3](https://github.com/volatilityfoundation/volatility3) | Framework de forensique mémoire |
| [Scapy](https://scapy.net/) | Analyse de paquets réseau |
| [Sleuth Kit](https://sleuthkit.org/) | Boîte à outils de forensique disque |
| [Binwalk](https://github.com/ReFirmLabs/binwalk) | Analyse de firmware |
| [Detect It Easy](https://github.com/horsicq/DIE-engine) | Détection de packers/compilateurs |
---
## Licence
MIT — voir [LICENSE](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/LICENSE) pour plus de détails.
---
<div align="center">
**[GitHub](https://github.com/sjkim1127/Reversecore_MCP)** · **[PyPI](https://pypi.org/project/reversecore-mcp/)** · **[FastMCP Docs](https://github.com/jlowin/fastmcp)** · **[MCP Spec](https://modelcontextprotocol.io/)** · **[Radare2](https://radare.org/)** · **[YARA](https://virustotal.github.io/yara/)**
</div>
| Domaine | Ce que vous pouvez faire |
|---|
| Analyse statique | Désassemblage, décompilation (r2ghidra), analyse de binaires (LIEF), détection de packers (DIE), détection de capacités (CAPA), extraction de chaînes, analyse de firmware (binwalk) |
| Dynamique et symbolique | Émulation ESIL, exécution symbolique avec angr, analyse de taint, génération de harnais de fuzzing |
| Analyse de malwares | Extraction d'IOC, analyse YARA, détection de backdoors dormantes, génération adaptative de vaccins, chasse autonome aux vulnérabilités |
| Recherche de vulnérabilités | Détection d'API dangereuses, découverte de gadgets ROP, analyse d'exploitation du tas, triage des crashs, génération de PoC |
| Forensique numérique | Analyse de mémoire volatile (Volatility3), analyse de PCAP (Scapy), forensique de disque (Sleuth Kit), corrélation d'artefacts |
| Audit de code source | Analyse AST Python, analyse par motifs regex C/C++ |
| Rapports | Rapports par session avec cartographie MITRE ATT&CK, génération de règles SIGMA, rapports VEX, envoi par e-mail |
| Variable | Défaut | Description |
|---|
MCP_TRANSPORT | stdio | Mode de transport : stdio ou http |
REVERSECORE_WORKSPACE | ./ (cwd) | Répertoire de l'espace de travail d'analyse |
REVERSECORE_READ_DIRS | "" | Liste de répertoires supplémentaires en lecture seule, séparés par des virgules |
REVERSECORE_STRICT_PATHS | false | Lever des erreurs pour les chemins manquants au lieu d'avertissements |
REVERSECORE_STRUCTURED_ERRORS | false | Activer les réponses d'erreur structurées avec codes d'erreur |
REVERSECORE_DEFAULT_TOOL_TIMEOUT | 120 | Délai d'exécution par défaut des outils en secondes |
REVERSECORE_MAX_OUTPUT_SIZE | 10000000 | Taille de sortie maximale pour les outils (octets) |
| Variable | Défaut | Description |
|---|
MCP_HOST | 0.0.0.0 | Interface hôte à lier (remplacée automatiquement par 127.0.0.1 si aucune clé API) |
MCP_PORT | 8000 | Port pour le serveur HTTP |
MCP_API_KEY | (non défini) | Clé API pour l'authentification HTTP (X-API-Key ou Authorization: Bearer) |
REVERSECORE_RATE_LIMIT | 60 | Nombre maximal de requêtes par minute (mode HTTP uniquement, via slowapi) |
MAX_UPLOAD_SIZE | 100000000 | Taille de téléversement maximale (100 Mo par défaut) |
FILE_RETENTION_MINUTES | 1440 | Durée de conservation des fichiers téléversés (24 h par défaut) |
| Variable | Défaut | Description |
|---|
REVERSECORE_R2_POOL_SIZE | 3 | Nombre de connexions Radare2 dans le pool |
REVERSECORE_R2_POOL_TIMEOUT | 30 | Délai d'attente pour obtenir une connexion du pool |
REVERSECORE_R2_EXTENSIONS | "" | Liste de classes d'extension r2 séparées par des virgules (module:ClassName) |
REVERSECORE_GHIDRA_MAX_PROJECTS | 3 | Nombre maximal de projets de décompilateur r2ghidra mis en cache |
REVERSECORE_GHIDRA_EXTENSIONS | "" | Liste de classes d'extension Ghidra séparées par des virgules |
MAX_EMULATION_INSTRUCTIONS | 1000 | Nombre maximal d'instructions d'émulation ESIL |
| Variable | Défaut | Description |
|---|
REVERSECORE_SANDBOX_ENABLED | false | Activer l'exécution en sandbox pour les outils d'analyse dynamique |
REVERSECORE_SANDBOX_MODE | auto | Mode sandbox : auto, host, container, disabled |
REVERSECORE_SANDBOX_DOCKER_IMAGE | reversecore-sandbox:latest | Image Docker pour l'exécution en sandbox |
REVERSECORE_SANDBOX_CPU_LIMIT | 1.0 | Limite de cœurs CPU pour les conteneurs sandbox |
REVERSECORE_SANDBOX_MEMORY_LIMIT | 512m | Limite de mémoire pour les conteneurs sandbox |
REVERSECORE_SANDBOX_PIDS_LIMIT | 100 | Limite de PID pour les conteneurs sandbox |
REVERSECORE_SANDBOX_USER | nobody | Utilisateur non root pour l'exécution en sandbox |
| Variable | Défaut | Description |
|---|
REDIS_URL | redis://localhost:6379/0 | URL Redis pour la file d'attente des tâches et la mise en cache des résultats |
MEMORY_DB_PATH | ~/.reversecore_mcp/memory.db | Chemin vers la base de données SQLite de mémoire IA |
REVERSECORE_LIEF_MAX_FILE_SIZE | 1000000000 | Taille de fichier maximale pour l'analyse LIEF (1 Go) |
| Variable | Défaut | Description |
|---|
LOG_LEVEL | INFO | Niveau de verbosité des journaux : DEBUG, INFO, WARNING, ERROR |
LOG_FILE | <tempdir>/reversecore/app.log | Chemin vers le fichier journal |
LOG_FORMAT | human | Format des journaux : human (lisible) ou json (structuré) |
| Contrôle | Implémentation |
|---|
| Aucune injection shell | Tous les appels de sous-processus utilisent des arguments sous forme de liste, jamais de chaînes shell (execution.py) |
| Prévention du traversement de chemins | validate_file_path() et validate_binary_path() résolvent les liens symboliques et limitent l'accès à l'espace de travail (validators.py) |
| Atténuation TOCTOU | Le drapeau bypass_cache=True revalide les chemins pour éviter les conditions de concurrence |
| Assainissement des entrées | Tous les paramètres sont assainis avant l'exécution (security.py) |
| Protection CSRF | Les formulaires du tableau de bord exigent une validation CSRF basée sur un jeton (dashboard/__init__.py) |
| Contrôle | Implémentation |
|---|
| Authentification résistante aux attaques temporelles | secrets.compare_digest() pour la comparaison des clés API (web/auth.py) |
| Vecteurs d'authentification restreints | Seuls les en-têtes X-API-Key et Authorization: Bearer sont acceptés ; aucun paramètre de requête ni cookie |
| Repli en boucle locale uniquement | Sans MCP_API_KEY, l'accès HTTP est restreint à 127.0.0.1 (web/middleware.py) |
| Limitation de débit | Limites configurables par minute via slowapi |
| En-têtes de sécurité | HSTS, X-Content-Type-Options, X-Frame-Options, CSP sur toutes les réponses HTTP (web/middleware.py) |
/health minimal | Le point de terminaison public ne renvoie que {"status": "alive"} ; les détails sont protégés par authentification (web/endpoints.py) |
| Isolement sandbox |
| Sandbox optionnelle basée sur des conteneurs pour les outils d'analyse dynamique |
| Contrôle | Implémentation |
|---|
| Analyse des secrets | Gitleaks s'exécute à chaque commit (hook pre-commit + CI) |
| SAST | Bandit analyse tout le code Python à chaque commit |
| CodeQL | Analyse statique CodeQL de GitHub à chaque push vers main |
| Audit des dépendances | pip-audit à chaque push — aucun CVE non examiné |
| Analyse des conteneurs | Trivy analyse les images Docker à la recherche de vulnérabilités (LOW à CRITICAL) |
| Porte de sécurité des exploits | Modèles de POC analysés avec Bandit ; fuzzing DAST avec Hypothesis ; isolement des conteneurs vérifié |
| Marqueur | Objectif |
|---|
@pytest.mark.unit | Tests unitaires rapides |
@pytest.mark.integration | Tests nécessitant Docker ou des outils externes |
@pytest.mark.slow | Tests de longue durée |
@pytest.mark.benchmark | Benchmarks de performance |
@pytest.mark.security | Tests de validation des limites de sécurité |
| Service | Profil | Description |
|---|
reversecore-mcp | default, x86 | Intel/AMD x86_64 |
reversecore-mcp-arm64 | arm64, macos | Apple Silicon ARM64 |
redis | tous les profils | Redis 7 Alpine pour la file de tâches et la mise en cache |
| Composant | Minimum | Recommandé |
|---|
| CPU | 4 cœurs | 8+ cœurs |
| RAM | 8 Go | 16 Go |
| Stockage | 20 Go | 50 Go SSD |
| Système d'exploitation | Linux / macOS | Environnement Docker (n'importe quel OS) |
| Docker | 20.10+ | 24.0+ |
| Python (mode local) | 3.10 | 3.11 ou 3.12 |
| Exception | Code | Type | Quand |
|---|
ReversecoreError | RCMCP-E000 | UNKNOWN_ERROR | Classe de base pour toutes les erreurs |
ValidationError | RCMCP-E001 | VALIDATION_ERROR | Entrée invalide, mauvais paramètres |
ExecutionTimeoutError | RCMCP-E002 | TIMEOUT_ERROR | L'outil a dépassé le délai d'attente |
ToolNotFoundError | RCMCP-E003 | TOOL_ERROR | Outil CLI requis non installé |
OutputLimitExceededError | RCMCP-E004 | OUTPUT_ERROR | Sortie dépassant la taille maximale |
ToolExecutionError | RCMCP-E005 | EXECUTION_ERROR | Sous-processus renvoyé non nul |
BinaryAnalysisError | RCMCP-E100 | BINARY_ANALYSIS_ERROR | Échec général d'analyse binaire |
DecompilationError | RCMCP-E101 | DECOMPILATION_ERROR | La décompilation r2ghidra a échoué |
DisassemblyError | RCMCP-E102 | DISASSEMBLY_ERROR | Le désassemblage Radare2 a échoué |
StructureRecoveryError | RCMCP-E103 | STRUCTURE_RECOVERY_ERROR | La récupération de struct C a échoué |
SignatureGenerationError | RCMCP-E104 | SIGNATURE_GENERATION_ERROR | La génération de signatures YARA a échoué |
EmulationError | RCMCP-E105 | EMULATION_ERROR | L'émulation ESIL a échoué |
ToolTimeoutError | RCMCP-E200 | TOOL_TIMEOUT_ERROR | L'outil externe a expiré |
GhidraConnectionError | RCMCP-E201 | GHIDRA_CONNECTION_ERROR | Problème de connexion r2ghidra |
Radare2Error | RCMCP-E202 | RADARE2_ERROR | La commande Radare2 a échoué |
WorkspaceError | RCMCP-E300 | WORKSPACE_ERROR | Erreur d'accès au fichier de l'espace de travail |
SecurityViolationError | RCMCP-E301 | SECURITY_VIOLATION | Violation de la politique de sécurité |
PathTraversalError | RCMCP-E302 | PATH_TRAVERSAL | Tentative de traversée de chemin détectée |
| Niveau | Backend | Format de clé | TTL | Objectif |
|---|
| L1 | Redis | ghidra:decompile:{file_hash}:{function_address}:{decompiler} | 1 heure (3600s) | Rapide, partagé entre les sessions |
| L2 | SQLite | Table decompilation_cache | Persistant | Survit aux redémarrages de Redis |