A locksmith accidentally leaves a master key in the mail slot, and burglars use it to copy the building's entire keyring
CVE-2026-42018 is an improper-authentication flaw in JFrog Artifactory's Access API. An unauthenticated attacker sends a POST to /access/api/v1/aws/token/ — note the trailing slash — and receives a valid JWT for Artifactory's internal anonymous-user identity, even on instances where anonymous access has been explicitly disabled. Affected versions span every supported branch: < 7.111.20, 7.117.0–7.117.27, 7.125.0–7.125.19, 7.133.0–7.133.28, and 7.146.0–7.146.8. JFrog Cloud instances were patched silently; self-hosted instances require a manual upgrade.
JFrog rated this HIGH 7.5 with a confidentiality-only vector (C:H/I:N/A:N). That score is technically accurate *if you evaluate the CVE in isolation* — the leaked anonymous token only reads what the anonymous identity can reach. In practice, however, virtually every instance vulnerable to CVE-2026-42018 is also vulnerable to CVE-2026-42016 (scope-validation bypass, fixed in 7.133.11), because the affected version ranges overlap almost completely. The chain converts the anonymous token into an admin-scoped access token in a single follow-up POST request, and real-world attackers executed this end-to-end in under five minutes. With admin control of an artifact repository, the blast radius is supply-chain-scale: poisoned packages, exfiltrated secrets, and persistent Rust backdoors that survive patching. The vendor score of 7.5 dramatically understates the real-world risk.
5 steps from start to impact.
Trailing-slash token leak
POST /access/api/v1/aws/token/ (trailing slash) to the target Artifactory instance. The trailing slash bypasses the route-matching logic that would normally reject this request when anonymous access is disabled. The server responds HTTP 200 with a JWT bound to the internal anonymous-user identity.- Network reachability to the Artifactory Access API (typically same port as web UI, default 8082 or reverse-proxied on 443)
- None — the endpoint is pre-authentication; disabling anonymous access does not block it
CVE-2026-42018 (projectdiscovery/nuclei-templates PR #17262). Google Tsunami scanner plugin available. Log signature: 401 on the bare path followed by 200 on the trailing-slash variant from the same source IP.Token scope escalation via CVE-2026-42016
POST /access/api/v1/tokens requesting an admin-scoped token. Artifactory validates the token's signature and issuer but does not validate its scope, so it mints a new token with admin authority while retaining the anonymous username. This is CVE-2026-42016 (CWE-863), present on all instances < 7.133.11 — which overlaps almost entirely with CVE-2026-42018's affected range.- A valid Artifactory JWT (obtained in step 1)
- Target instance also vulnerable to CVE-2026-42016 (< 7.133.11)
- Requires both CVEs to be present, but version overlap makes co-presence the default condition, not the exception
token:anonymous. SIEM rule: any token-creation event with scope escalation from a non-admin principal.Persistent admin account creation
PUT /api/security/users/<username> to create a new administrator account (observed naming patterns: svc_[a-zA-Z0-9]{8}, Nxploited_[a-zA-z0-9]{3}, 0xTerror, jfrog-distribution). This survives token revocation and provides a stable re-entry point.- Admin-scoped access token (obtained in step 2)
- None — this is a normal Artifactory admin API call
Groovy plugin deployment and RCE
- Persistent admin account (step 3)
- Artifactory plugin framework enabled (default on self-hosted)
- Plugin framework can be disabled, but very few organizations do so as it breaks legitimate workflows
/api/plugins/execute/ from newly created accounts.Rust backdoor deployment and supply-chain pivot
64.207.232[.]6:8443, payload hosts: log.gitclone[.]org:45678, 3.88.162[.]79:36789). These backdoors persist across Artifactory upgrades and provide ongoing access. From this position, attackers can poison artifacts consumed by downstream CI/CD pipelines, achieving supply-chain-scale compromise.- OS-level command execution (step 4)
- Outbound connectivity to C2 infrastructure
- Egress filtering may block C2 callbacks, but many Artifactory hosts require broad outbound access to pull remote repositories
/access/api/v1/aws/token regardless of trailing characters. This breaks the chain at step 1. Deploy within hours — this is a KEV-listed, actively exploited vulnerability; the noisgate mitigation SLA for CRITICAL is ≤ 3 days, but active exploitation warrants same-day action.token:anonymous performing admin operations. Enumerate all admin accounts and compare against your known-good list. Check for Groovy plugins you did not deploy. Search the filesystem for unsigned Rust binaries. Check for connections to known C2 IOCs (64.207.232[.]6:8443, log.gitclone[.]org:45678, 3.88.162[.]79:36789). If ANY IOC is found, treat the instance as compromised: rotate all secrets, revoke all tokens, rebuild from a known-good backup.- Disabling anonymous access — this is precisely the control CVE-2026-42018 bypasses. The trailing-slash variant returns the anonymous token regardless of this setting. Many defenders assume their 'anonymous access disabled' configuration protects them; it does not.
- MFA on Artifactory user accounts — the exploit is pre-authentication. It obtains a token via an API endpoint that never triggers an authentication flow, so MFA is never invoked.
- Patching without IOC review — upgrading closes the vulnerability but does NOT revoke tokens already issued, remove admin accounts already created, or delete Rust backdoors already deployed. Attackers were observed maintaining persistence that survives patching.
The supporting signals.
| In-the-wild exploitation | Confirmed. Wiz Research documented active exploitation from Aug 15 – Sep 8, 2026 across multiple self-hosted Artifactory instances. Attackers achieved admin takeover in under 5 minutes. Fastly counted ~406,000 exploitation attempts on Sep 2 alone (across the CVE chain). OpenInfra Europe's Artifactory instance was publicly confirmed breached. |
|---|---|
| CISA KEV | Listed Sep 11, 2026. CVE-2026-42018 was added alongside CVE-2026-42016 and CVE-2026-82329. Federal agencies required to remediate per BOD 22-01 deadlines. |
| EPSS | 0.098 (9.8th percentile) — places this in the top 10% of CVEs by predicted exploitation probability, consistent with confirmed active exploitation. |
| PoC availability | Multiple public PoCs. Nuclei template by theamanrawat, Google Tsunami scanner plugin (PR #908), and standalone exploit toolkits on GitHub (SecureWithUmer/CVE-2026-PoCs). The exploit is a single curl command. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N — Network-accessible, zero complexity, no auth, no user interaction. Vendor scoped to confidentiality-only. The chain with CVE-2026-42016 would push I and A to High if scored holistically. |
| Affected versions | Artifactory < 7.111.20, 7.117.0–7.117.27, 7.125.0–7.125.19, 7.133.0–7.133.28, 7.146.0–7.146.8. Virtually all of these also fall below the CVE-2026-42016 fix threshold (7.133.11), making the admin-takeover chain the default condition. |
| Fixed versions | 7.111.20, 7.117.27, 7.125.19, 7.133.28, 7.146.8 (for CVE-2026-42018). To address the full chain including CVE-2026-42016, you need ≥ 7.133.11. JFrog Cloud was pre-patched; only self-hosted instances require action. |
| Internet exposure | ~17,877 Artifactory instances observable on the internet per ZoomEye/Shodan scans (Sep 2026). Wiz and watchTowr found 49–62% of internet-reachable instances were vulnerable to at least one of the three chained flaws. |
| Disclosure timeline | Disclosed Aug 12, 2026. Active exploitation began Aug 15 (3 days later). CISA KEV listing Sep 11. OpenInfra Europe breach confirmed Sep 30. |
| Reporting researcher | Original reporter not publicly credited by JFrog. In-the-wild exploitation analysis published by Wiz Research. Detection content contributed by SOC Prime, watchTowr, and Fastly. |
Sources.
- Wiz Research — Artifactory Under Attack
- The Hacker News — Attackers Chain JFrog Artifactory Flaws
- CISA KEV Catalog — CVE-2026-42018
- JFrog Security Advisories
- Nuclei Template PR #17262 — CVE-2026-42018
- SOC Prime — Artifactory CVEs Exploited in the Wild
- ZoomEye / DEV.to — 17,881 Artifactory Instances Observable Online
- CSO Online — Exploited JFrog Artifactory Bug Puts Supply Chain on Alert
Why this verdict
- Zero-friction entry point: The exploit requires no authentication, no user interaction, and no special privileges. A single unauthenticated POST with a trailing slash returns a valid JWT. The CVSS attack-complexity and privileges-required ratings are both None — there is literally nothing between the attacker and the token.
- Near-certain chain completion to admin takeover: CVE-2026-42016's affected range (< 7.133.11) encompasses virtually the entire CVE-2026-42018 affected population. The version overlap means the admin-escalation chain is the *default* condition, not an edge case. Treating CVE-2026-42018 as a standalone 7.5 information-disclosure bug misrepresents the risk defenders actually face.
- Active, weaponized, multi-actor exploitation: This is not theoretical. Wiz documented real intrusions from Aug 15–Sep 8 with Rust backdoors. Fastly logged ~406K exploitation attempts in a single day. Multiple threat groups are exploiting this simultaneously. OpenInfra Europe's instance was publicly breached.
- Role multiplier: JFrog Artifactory is a canonical supply-chain infrastructure component — it IS the artifact store. 100% of Artifactory installations serve this role by definition. Admin takeover of Artifactory enables artifact poisoning, secret exfiltration, CI/CD pipeline compromise, and lateral movement to every system that pulls packages from it. The blast radius is supply-chain-scale. Per the high-value role catalog (CI/CD + artifact stores), the verdict floor for a chainable unauthenticated-to-admin flaw in this component is CRITICAL.
- Massive attack surface: ~17,877 instances are internet-facing. 49–62% were found vulnerable. This is not a niche product with limited exposure — Artifactory is the dominant enterprise binary repository manager. Self-hosted instances are the target, and most enterprises running Artifactory have at least one.
Why not higher?
A 9.4 rather than 10.0 because CVE-2026-42018 *alone* only yields an anonymous-identity token with limited read access — the critical impact requires co-exploitation of CVE-2026-42016. While the version overlap makes co-presence near-certain, it is not architecturally guaranteed (an instance could theoretically be on a version that patches one but not the other). The scope remains Unchanged per the CVSS vector.
Why not lower?
Downgrading below CRITICAL is not defensible. The affected component is a supply-chain trust root by definition — every artifact it serves is implicitly trusted by downstream build and deployment pipelines. The chain is actively exploited in the wild with confirmed breaches. The exploit is trivial (one curl command), PoCs are public, and the internet-facing attack surface is measured in the tens of thousands. KEV listing reinforces that this demands immediate action. Friction is effectively zero at every step of the chain.
Crowdsourced verification payload.
Run this script from any host with curl and network access to your Artifactory instance. Pass the base URL as the first argument: bash check_cve_2026_42018.sh https://artifactory.corp.example.com. No authentication is required — the script tests the unauthenticated endpoint. It also attempts a version check via the system health endpoint.
#!/usr/bin/env bash
# check_cve_2026_42018.sh — CVE-2026-42018 JFrog Artifactory anonymous token leak checker
# Usage: bash check_cve_2026_42018.sh <ARTIFACTORY_BASE_URL>
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
BASE_URL="${1:?Usage: $0 <ARTIFACTORY_BASE_URL>}"
BASE_URL="${BASE_URL%/}" # strip trailing slash
echo "[*] Testing CVE-2026-42018 against: ${BASE_URL}"
echo
# Step 1: Probe the trailing-slash endpoint
echo "[*] Step 1: Probing POST ${BASE_URL}/access/api/v1/aws/token/ ..."
HTTP_CODE=$(curl -sk -o /tmp/cve_2026_42018_resp.json -w '%{http_code}' \
-X POST "${BASE_URL}/access/api/v1/aws/token/" \
-H 'Content-Type: application/json' \
-d '{}' \
--connect-timeout 10 --max-time 15 2>/dev/null || echo "000")
echo " HTTP response code: ${HTTP_CODE}"
if [[ "${HTTP_CODE}" == "200" ]]; then
# Check if response contains a token
if grep -qi '"access_token"\|"token_type"\|"jwt"' /tmp/cve_2026_42018_resp.json 2>/dev/null; then
echo
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo " RESULT: VULNERABLE"
echo " The endpoint returned a token to an unauthenticated caller."
echo " This instance is exploitable via CVE-2026-42018."
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo
echo "[!] Response preview (first 200 chars):"
head -c 200 /tmp/cve_2026_42018_resp.json 2>/dev/null
echo
rm -f /tmp/cve_2026_42018_resp.json
exit 1
fi
fi
if [[ "${HTTP_CODE}" == "401" || "${HTTP_CODE}" == "403" || "${HTTP_CODE}" == "404" || "${HTTP_CODE}" == "405" ]]; then
echo
echo " RESULT: PATCHED"
echo " The endpoint correctly rejected the unauthenticated request (HTTP ${HTTP_CODE})."
rm -f /tmp/cve_2026_42018_resp.json
exit 0
fi
# Step 2: Fallback — try to determine version from system info
echo
echo "[*] Step 2: Attempting version check via /api/system/version ..."
VER_RESP=$(curl -sk --connect-timeout 10 --max-time 10 "${BASE_URL}/api/system/version" 2>/dev/null || true)
VERSION=$(echo "${VER_RESP}" | grep -oP '"version"\s*:\s*"\K[0-9.]+' 2>/dev/null || true)
if [[ -n "${VERSION}" ]]; then
echo " Detected Artifactory version: ${VERSION}"
# Parse major.minor.patch
IFS='.' read -r MAJOR MINOR PATCH <<< "${VERSION}"
MINOR=${MINOR:-0}
PATCH=${PATCH:-0}
VULN=0
if (( MAJOR < 7 )); then
VULN=1
elif (( MAJOR == 7 )); then
if (( MINOR < 111 )); then
VULN=1
elif (( MINOR == 111 && PATCH < 20 )); then
VULN=1
elif (( MINOR >= 117 && MINOR <= 117 && PATCH < 27 )); then
VULN=1
elif (( MINOR >= 125 && MINOR <= 125 && PATCH < 19 )); then
VULN=1
elif (( MINOR >= 133 && MINOR <= 133 && PATCH < 28 )); then
VULN=1
elif (( MINOR >= 146 && MINOR <= 146 && PATCH < 8 )); then
VULN=1
fi
fi
if (( VULN == 1 )); then
echo
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo " RESULT: VULNERABLE (by version)"
echo " Artifactory ${VERSION} is in the affected range."
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
rm -f /tmp/cve_2026_42018_resp.json
exit 1
else
echo
echo " RESULT: PATCHED (by version)"
echo " Artifactory ${VERSION} is at or above the fix level."
rm -f /tmp/cve_2026_42018_resp.json
exit 0
fi
fi
echo
echo " RESULT: UNKNOWN"
echo " Could not determine vulnerability status. HTTP code: ${HTTP_CODE}"
echo " Verify manually or check the Artifactory version in the admin console."
rm -f /tmp/cve_2026_42018_resp.json
exit 2