
Von MCPJam Inspector RCE bis Root — CVE-2026-23744, JupyterLab-Token-Offenlegung, Kernel-Ausführung und OPSMCP-Privilegieneskalation
Dieses Repository ist ausschließlich für autorisierte Sicherheitsforschung, Penetrationstests und Bildungszwecke bestimmt. Verwenden Sie die hier beschriebenen Techniken nicht gegen Systeme ohne ausdrückliche Genehmigung.
Von MCPJam-Inspector-RCE bis root — CVE-2026-23744, JupyterLab-Token-Offenlegung, Kernel-Ausführung und OPSMCP-Privilegienerweiterung.
Dieses Repository dokumentiert eine vollständige Linux-Angriffskette, von einer exponierten MCPJam Inspector-Instanz bis hin zum Root-Zugriff.
Die Kette verknüpft Schwachstellen in Entwicklerwerkzeugen, lokalen Diensten, dem Umgang mit Anmeldedaten und der Anwendungsautorisierung:
MCPJam Inspector
│ CVE-2026-23744
▼
RCE
│
▼
JupyterLab Token
│
▼
Jupyter Kernel
│
▼
User
│
▼
OPSMCP API
│
▼
Hidden Admin Tool
│
▼
Root Credential
│
▼
root
[!WARNING] Dieses Repository ist ausschließlich für autorisierte Sicherheitsforschung, Penetrationstests und Bildungszwecke bestimmt. Zieladressen, Anmeldedaten, Token und andere umgebungsspezifische Werte in diesem Dokument wurden geschwärzt oder durch Labor-Platzhalter ersetzt.
| Schritt | Phase |
|---|---|
| 1 | MCPJam Inspector im Netzwerk exponiert |
| 2 | CVE-2026-23744 ausgenutzt |
| 3 | Erste RCE erreicht |
| 4 | JupyterLab-Token offengelegt |
| 5 | Jupyter-Kernel-Ausführung |
| 6 | Shell auf Benutzerebene |
| 7 | OPSMCP-Quellcode-Analyse |
| 8 | Hartkodierte API-Anmeldedaten entdeckt |
| 9 | Versteckte administrative Funktionalität missbraucht |
| 10 | Root-Anmeldedaten offengelegt |
| 11 | root |
Die erste Aufklärung konzentriert sich auf die Identifizierung extern exponierter Dienste.
nmap -sC -sV -oN nmap_initial.txt TARGET
Anschließend kann ein vollständiger TCP-Scan durchgeführt werden:
nmap -p- --min-rate 5000 -oN nmap_full.txt TARGET
Relevante externe Dienste:
| Port | Service | Rolle |
|---|---|---|
| 22 | SSH | Fernadministration |
| 6274 | MCPJam Inspector | Erste Angriffsfläche |
Nur an localhost gebundene Dienste:
| Port | Service | Privileg |
|---|---|---|
| 8888 | JupyterLab | User |
| 5000 | OPSMCP | root |
Der extern erreichbare MCPJam Inspector auf Port 6274 wird zum ersten Einstiegspunkt.
Die exponierte MCPJam-Inspector-Instanz ist von CVE-2026-23744 betroffen.
MCPJam Inspector ist in erster Linie als Entwicklungs- und Testschnittstelle für MCP-Server gedacht. Die Schwachstelle wird besonders gefährlich, wenn diese Schnittstelle einem nicht vertrauenswürdigen Netzwerk ausgesetzt ist — ein angreifbarer Konfigurationsablauf ermöglicht es, dass vom Angreifer kontrollierte Daten einen Befehlsausführungspfad erreichen.
Remote Request
│
▼
MCP Server Configuration
│
▼
Command Execution
│
▼
Initial Shell
Die Schwachstelle betrifft MCPJam-Inspector-Versionen bis einschließlich 1.4.2. Für autorisierte Tests kann ein öffentlicher Proof of Concept verwendet werden, um die Schwachstelle gegen die Zielumgebung zu validieren.
Nach erfolgreicher Ausnutzung den Ausführungskontext bestätigen:
id
whoami
hostname
Sobald der erste Zugriff erlangt wurde, werden lokale Dienste sichtbar.
ss -tlnp
ps aux | grep -E 'jupyter|python|node'
Network
│
▼
MCPJam Inspector
:6274
│
▼
Initial RCE
│
┌─────────┴─────────┐
▼ ▼
JupyterLab OPSMCP
:8888/local :5000/local
│ │
▼ ▼
User root
Der Privilegienunterschied zwischen den beiden internen Anwendungen ist besonders interessant.
Der JupyterLab-Prozess wurde mit seinem Authentifizierungstoken direkt in der Befehlszeile gestartet:
--ServerApp.token=<JUPYTER_TOKEN>
Die Befehlszeile kann wie folgt eingesehen werden:
ps aux | grep jupyter
# or
cat /proc/<PID>/cmdline
Dies verdeutlicht ein häufiges Problem beim Umgang mit Geheimnissen:
Secret → Command-line argument → Process metadata → Local credential disclosure
Das wiederhergestellte Token gewährt Zugriff auf die lokale Jupyter-API.
Jupyter stellt eine REST-API zur Verwaltung von Kernels bereit. Nach der Authentifizierung mit dem wiederhergestellten Token kann ein Kernel erstellt werden über:
POST /api/kernels
Die Antwort enthält eine Kernel-UUID. Jupyter-Kernels kommunizieren über WebSockets:
/api/kernels/<KERNEL_ID>/channels
Das Jupyter-Nachrichtenprotokoll verwendet eine execute_request-Nachricht zur Ausführung von Python-Code:
{
"header": { "msg_type": "execute_request" },
"content": { "code": "<AUTHORIZED_LAB_CODE>" }
}
Dies ermöglicht die Python-Ausführung unter der Identität des Jupyter-Dienstes — in dieser Umgebung führt der Kernel als User aus.
MCPJam RCE → JupyterLab → User
Mit einer verfügbaren Benutzer-Shell besteht der nächste Schritt darin, lokal installierte Anwendungen zu untersuchen. Die OPSMCP-Anwendung befindet sich unter:
/opt/opsmcp/
Die Analyse des Quellcodes offenbart eine eingebettete API-Anmeldeinformation:
VALID_API_KEY = "<REDACTED_OPSMCP_API_KEY>"
Die Anwendung verwaltet außerdem zwei Tool-Sammlungen:
Sichtbare Tools
ops.system_statusops.list_servicesops.check_diskops.view_logsVersteckte Tools
ops._admin_dumpops._debug_modeDie administrativen Funktionen sind besonders interessant, da sie nicht über die normale Tool-Aufzählung zurückgegeben werden.
Nicht dokumentiert bedeutet nicht unzugänglich.
Das Backend registriert die versteckten Tools weiterhin und akzeptiert ihre Namen über den generischen Mechanismus zur Tool-Ausführung.
Die Anwendung authentifiziert Anfragen mithilfe eines API-Schlüssels:
X-API-Key: <OPSMCP_API_KEY>