← Back to Feed CACHED · 2026-08-06 03:35:25 · CACHE_KEY CVE-2026-15969
CVE-2026-15969 · CWE-502 · Disclosed 2026-07-30

SGLang contains an unauthenticated RCE in /load_lora_adapter_from_tensors via bypass of SafeUnpickler’s…

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

The bouncer has a list of banned guests, but the attacker just wore a different hat and walked right in

CVE-2026-15969 is an unauthenticated remote code execution vulnerability in SGLang, a high-performance open-source framework for serving large language models that now powers over 400,000 GPUs globally. The flaw lives in the /load_lora_adapter_from_tensors HTTP API endpoint, which accepts base64-encoded pickle data. A SafeUnpickler class was introduced to restrict dangerous deserialization, but its denylist is incomplete — attackers can craft pickle opcodes that bypass the filter entirely and achieve arbitrary command execution on the host. All versions of SGLang with this endpoint are affected. No patch exists as of 2026-08-06.

The vendor-assigned CVSS 9.8 CRITICAL is accurate and, if anything, undersells the operational risk. The attack requires zero authentication, zero user interaction, and low complexity — just a single HTTP POST. SGLang's default launch guidance (--host 0.0.0.0) encourages binding to all interfaces, and authentication is optional and off by default. The SafeUnpickler that was supposed to mitigate earlier pickle CVEs (like CVE-2025-10164) has proven to be security theater for this code path. This is one of six simultaneously disclosed CVEs (CERT/CC VU#281278) with no vendor coordination — the maintainers did not respond. The combination of trivial exploitation, no authentication, no patch, and a rapidly growing install base makes the CRITICAL rating fully justified.

"Unauth RCE with no patch on a rapidly growing AI inference framework. Pickle bypass makes SafeUnpickler theater."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify an exposed SGLang instance

The attacker scans for SGLang instances on the default port 30000 (or custom ports) using Shodan, Censys, or FOFA. SGLang exposes an OpenAI-compatible API surface. The /v1/models or /health endpoints confirm the target. As of mid-2026, ARIAscout Shodan sweeps show 320,000+ exposed AI services, and SGLang's install base is growing rapidly.
Conditions required:
  • SGLang instance reachable over the network (internet or internal)
Where this breaks in practice:
  • Well-configured deployments place SGLang behind a reverse proxy or API gateway (e.g., Bifrost) that strips non-standard endpoints
  • Some deployments bind to localhost only
Detection/coverage: Shodan/Censys dorks for SGLang banner; network IDS signature for /load_lora_adapter_from_tensors POST requests
STEP 02

Craft a SafeUnpickler-bypassing pickle payload

The attacker constructs a Python pickle bytestream that avoids the classes on SafeUnpickler's denylist. Because the denylist is incomplete, standard bypass techniques work — for example, using __reduce_ex__, __setstate__, or importing dangerous callables through allowed module paths. The payload is base64-encoded as the endpoint expects. Multiple SGLang pickle deserialization PoCs exist publicly for adjacent CVEs (CVE-2026-3059, CVE-2026-3060) and the techniques transfer directly.
Conditions required:
  • Knowledge of SafeUnpickler's denylist (source code is public on GitHub)
Where this breaks in practice:
  • None — the source code is open, the bypass is straightforward for anyone familiar with Python pickle exploitation
STEP 03

POST the payload to /load_lora_adapter_from_tensors

The attacker sends a single HTTP POST request to the /load_lora_adapter_from_tensors endpoint with the malicious base64-encoded pickle data in the request body. No API key, no session token, no CSRF token — the endpoint has zero authentication. The server deserializes the pickle payload through the flawed SafeUnpickler, which passes the crafted opcodes through to Python's native unpickler.
Conditions required:
  • HTTP access to the SGLang API port
  • No authentication required
Where this breaks in practice:
  • A WAF inspecting POST body content for pickle magic bytes (\x80\x05) could theoretically flag this, but base64 encoding defeats naive signature matching
Detection/coverage: WAF rules for base64-decoded pickle headers; application-layer logging of requests to /load_lora_adapter_from_tensors (not logged by default)
STEP 04

Achieve arbitrary code execution as the SGLang process user

The pickle deserialization triggers os.system(), subprocess.Popen(), or equivalent via the crafted reduce chain. The attacker now has a shell running as the SGLang process user — typically root in Docker containers, or a GPU-privileged service account on bare-metal deployments. From here, the attacker can exfiltrate model weights (potentially worth millions in IP), install a cryptominer on expensive GPU hardware (LLMjacking), pivot laterally using the node's network position, or access secrets stored in environment variables (HuggingFace tokens, cloud credentials).
Conditions required:
  • Successful deserialization bypass (Step 2)
Where this breaks in practice:
  • Container isolation limits blast radius if properly configured, but many ML containers run privileged for GPU access
Detection/coverage: EDR/runtime security on the host (Falco, Sysdig, CrowdStrike Falcon for Linux) detecting unexpected child processes from the Python SGLang process
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNo confirmed in-the-wild exploitation yet. Not on CISA KEV. However, adjacent SGLang pickle CVEs (CVE-2026-3059, CVE-2026-3060) have public PoCs, and LLMjacking campaigns actively target exposed AI inference servers.
Proof-of-conceptNo public PoC specific to CVE-2026-15969, but pickle deserialization bypass techniques are well-documented and PoCs for related SGLang pickle CVEs (e.g., Chocapikk's blog, Stuub/SGLang-0.5.9-RCE) are directly transferable. Weaponization is trivial.
EPSS0.00981 (approximately 98th percentile). Moderate probability of exploitation in the next 30 days.
KEV statusNot listed on CISA KEV as of 2026-08-06.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — Network-accessible, no privileges required, no user interaction, full CIA impact. This is the maximum base score possible without scope change.
Affected versionsAll current versions of SGLang with the /load_lora_adapter_from_tensors endpoint. Advisory does not specify a version range floor. The endpoint exists in the mainline codebase.
Fixed versionNo patch available. CERT/CC notes maintainers did not respond to coordination attempts. The project is considering migration from pickle to msgpack but this has not shipped.
Scanning/exposure dataSGLang powers 400,000+ GPUs (per project claims). ARIAscout June 2026 Shodan sweep found 320,000+ exposed AI services across frameworks. SGLang's default --host 0.0.0.0 guidance and lack of default auth increase exposure.
Disclosure date2026-07-30 via CERT/CC VU#281278, alongside five other SGLang CVEs.
ReporterCERT/CC coordination (VU#281278). Researchers from multiple organizations including Orca Security have published related SGLang pickle research.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to CRITICAL (9.8/10)

The decisive factor is unauthenticated network-accessible RCE with no vendor patch available against a rapidly growing AI infrastructure component. The SafeUnpickler bypass is trivial to replicate from public research on adjacent CVEs, and SGLang's default configuration exposes the vulnerable endpoint without authentication on all interfaces.

HIGH Vulnerability existence and exploitability (CERT/CC confirmed, source code is public)
MEDIUM Installed-base exposure (400K+ GPUs claimed, but unknown fraction directly reachable)
LOW Active exploitation status (no confirmed ITW, but LLMjacking campaigns are scanning for AI infra)

Why this verdict

  • Trivial exploitation, zero auth: The attack is a single HTTP POST with a base64-encoded pickle payload. No credentials, no user interaction, no complex race condition. This is as low-friction as network RCE gets.
  • No patch available: As of 2026-08-06, the SGLang maintainers have not responded to CERT/CC coordination and no fix has been released. Defenders cannot remediate — only mitigate. This is effectively a disclosed 0-day.
  • SafeUnpickler is broken by design: The denylist approach to pickle deserialization is a known anti-pattern. Pickle's opcode flexibility means denylists are always incomplete. The 'fix' for the prior CVE-2025-10164 created a false sense of security.
  • Role multiplier: SGLang is canonically deployed on GPU nodes serving AI inference workloads. These nodes frequently (a) run containers with elevated/privileged access for GPU passthrough, (b) hold proprietary model weights worth significant IP value, (c) store cloud credentials and HuggingFace tokens in environment variables, and (d) sit on internal networks with lateral movement potential. While SGLang is not in the identity/hypervisor/PAM high-value catalog, compromise of an AI serving tier enables model IP theft, compute hijacking (LLMjacking at $10K+/day GPU cost), and pivot into the broader network. For organizations deploying SGLang, these nodes ARE high-value infrastructure by definition — the blast radius is host-to-tier, not host-only.
  • Growing attack surface: The AI inference ecosystem is under active reconnaissance by threat actors. 320K+ exposed AI services were found in June 2026 Shodan sweeps, with LLMjacking campaigns documented by CSA and Sysdig. SGLang's install base is growing rapidly.

Why not higher?

A CVSS 9.8 is already near the theoretical maximum. The only reason this isn't 10.0 is the Scope remains Unchanged (S:U) — the vulnerability compromises the SGLang host but doesn't automatically grant cross-boundary access (e.g., hypervisor escape). The blast radius, while severe for the AI tier, requires additional lateral movement to reach domain-level or fleet-level compromise.

Why not lower?

Downgrading would require evidence that the vulnerable endpoint is unreachable in real deployments, but SGLang's default configuration binds to all interfaces without authentication. The lack of any vendor patch eliminates the standard 'just patch it' mitigation path. The pickle denylist bypass is a fundamental design flaw, not a narrow edge case. Even if most SGLang instances sit behind a gateway, the ones that don't are fully exposed to trivial, unauthenticated RCE.

05 · Compensating Control

What to do — in priority order.

  1. Block /load_lora_adapter_from_tensors at the reverse proxy or WAF immediately — Add a deny rule for any request to this endpoint path in your reverse proxy (nginx, Envoy, Traefik) or WAF. This is the single most effective mitigation — it removes the attack surface entirely without affecting normal inference operations. Deploy within the noisgate CRITICAL mitigation SLA of 3 days.
  2. Place SGLang behind an authenticating API gateway — Deploy an API gateway (Kong, Bifrost, AWS API Gateway) in front of SGLang that enforces API key or mTLS authentication on all endpoints. SGLang should never be directly exposed. This should be a permanent architectural control, not just a mitigation. Deploy within 3 days.
  3. Set SGLANG_USE_PICKLE_IPC=false — This environment variable disables pickle-based IPC in SGLang. While the advisory specifically targets the HTTP endpoint (not the IPC path), disabling pickle wherever possible reduces the overall attack surface from the other five CVEs in this batch. Deploy within 3 days.
  4. Bind SGLang to localhost or internal-only interfaces — Launch SGLang with --host 127.0.0.1 instead of --host 0.0.0.0. Use a reverse proxy for any necessary external access. This prevents direct network access to vulnerable endpoints. Deploy within 3 days.
  5. Deploy runtime security monitoring on GPU nodes — Install Falco, Sysdig Secure, or CrowdStrike Falcon for Linux on SGLang hosts. Alert on unexpected child processes spawned by the Python SGLang process (e.g., sh, bash, curl, wget). This provides detection-in-depth while waiting for a vendor patch.
What doesn't work
  • Network-level ACLs alone — while restricting source IPs helps, any authorized user or compromised internal host can still exploit the endpoint. The vuln is in the application layer, not the network layer.
  • Upgrading SGLang — no patched version exists as of 2026-08-06. Upgrading to the latest release does NOT fix this vulnerability.
  • The SafeUnpickler itself — this is the control that was supposed to prevent pickle RCE, and it has been bypassed. Do not rely on it.
06 · Verification

Crowdsourced verification payload.

Run this script on each host where SGLang is deployed, or from an auditor workstation with network access to the SGLang API port. No special privileges required. Example: bash check_cve_2026_15969.sh 10.0.1.50:30000

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check_cve_2026_15969.sh — Detect SGLang instances vulnerable to CVE-2026-15969
# Usage: bash check_cve_2026_15969.sh <host:port>
# Exit codes: 0=VULNERABLE, 1=PATCHED, 2=UNKNOWN

set -euo pipefail

if [ $# -lt 1 ]; then
  echo "Usage: $0 <host:port>"
  exit 2
fi

TARGET="$1"
BASE_URL="http://${TARGET}"

# Step 1: Check if the SGLang server is reachable
if ! curl -sf --max-time 5 "${BASE_URL}/health" > /dev/null 2>&1; then
  echo "UNKNOWN — Cannot reach SGLang at ${TARGET} (health endpoint unreachable)"
  exit 2
fi

# Step 2: Check if the vulnerable endpoint exists and accepts requests
# We send an intentionally malformed (non-pickle) payload to see if the endpoint is present
HTTP_CODE=$(curl -sf --max-time 10 -o /dev/null -w '%{http_code}' \
  -X POST "${BASE_URL}/load_lora_adapter_from_tensors" \
  -H 'Content-Type: application/json' \
  -d '{"test": "probe"}' 2>/dev/null || echo "000")

if [ "$HTTP_CODE" = "000" ] || [ "$HTTP_CODE" = "404" ]; then
  echo "PATCHED — Endpoint /load_lora_adapter_from_tensors not found at ${TARGET} (HTTP ${HTTP_CODE})"
  exit 1
elif [ "$HTTP_CODE" = "405" ]; then
  echo "UNKNOWN — Endpoint exists but returned Method Not Allowed (HTTP 405). Manual review needed."
  exit 2
else
  # Endpoint exists (returned 400, 422, 500, or 200) — server accepted the route
  echo "VULNERABLE — Endpoint /load_lora_adapter_from_tensors is active at ${TARGET} (HTTP ${HTTP_CODE}). No patch exists for CVE-2026-15969. Apply compensating controls immediately."
  exit 0
fi
07 · Bottom Line

If you remember one thing.

TL;DR
This is an unpatched, unauthenticated RCE in production AI infrastructure — treat it as a disclosed 0-day. Monday morning, enumerate every SGLang instance in your environment (check for processes listening on port 30000 or running sglang.launch_server). Within the noisgate CRITICAL mitigation SLA of 3 days, block the /load_lora_adapter_from_tensors endpoint at your reverse proxy or WAF, ensure no SGLang instance binds to 0.0.0.0 without an authenticating gateway in front, and set SGLANG_USE_PICKLE_IPC=false. There is no vendor patch to apply — the noisgate remediation SLA of 90 days starts when a fix ships, which has not happened. Monitor the SGLang GitHub repository and CERT/CC VU#281278 for patch availability. If you have internet-facing SGLang instances with no gateway, pull them offline today.

Sources

  1. CERT/CC VU#281278 — SGLang six vulnerabilities advisory
  2. Vista Net — VU#281278 coverage with CVE details
  3. Orca Security — Pickle in the Pipeline: SGLang RCE research
  4. Chocapikk — SGLang Pickle RCE via ZMQ Transport
  5. Security Online — Poisoned Pickle: Critical Unpatched SGLang Flaws
  6. OpenA2A Research — State of AI Agent Security (exposure data)
  7. SGLang GitHub repository
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.