LiteLLM AI Gateway — Unauthenticated Remote Code Execution

CVE-2026-42271 (MCP stdio test-endpoint command injection) chained with CVE-2026-48710 (Starlette "BadHost" host-header bypass) → pre-auth RCE on the proxy host · combined CVSS 10.0 · CISA KEV 2026-06-08
Threat
CVE-2026-42271 + CVE-2026-48710
Severity
EXPLOITED ITW CVSS 10.0
Type
AI Gateway RCE / Command Injection
Access
Unauthenticated (chained)
Version
v0.2 (2026-07-14)
Author
HuntPack
Confidence
High
01

Executive Summary

LiteLLM is a widely deployed open-source AI gateway / proxy that exposes many LLM providers behind one OpenAI-compatible API. Two of its Model Context Protocol (MCP) preview endpoints — POST /mcp-rest/test/connection and POST /mcp-rest/test/tools/list — accept a full stdio server config (command, args, env) and, when invoked, spawn the supplied command as a subprocess under the proxy process user. In vulnerable builds these endpoints have no admin-role gate, so any holder of a proxy API key can run arbitrary commands (CVE-2026-42271, CVSS 8.7).

Horizon3.ai demonstrated that the command injection chains with CVE-2026-48710 — a Host-header validation bypass ("BadHost") in the Starlette web framework (CVSS 6.5) — to reach the admin-scoped endpoints without authentication from any network-reachable host. The combined chain is CVSS 10.0. CISA added CVE-2026-42271 to the KEV catalog on 2026-06-08 citing active in-the-wild exploitation, and public PoCs exist.

Attacker objective: code execution on the gateway host to harvest the crown jewels an AI gateway holds — provider API keys injected as environment variables (OpenAI, Anthropic, Azure, AWS Bedrock), mounted secret files, and the LiteLLM config/database — then pivot outward with a reverse shell or dropped tooling.

Highest-value defensive angle: the gateway is a Python service. A LiteLLM parent (python/uvicorn/gunicorn) spawning a shell, network client, or interpreter is never normal and is the cleanest, lowest-FP detection in this pack (Q1–Q3). Because atomic network IOCs are not published, hunt on this process-lineage behavior rather than IPs/hashes.

Defender priority: Patch LiteLLM to 1.83.7+ and Starlette to 1.0.1+, block the two /mcp-rest/test/* endpoints at the ingress today, then hunt Q1–Q3 for any python/uvicorn process that has already spawned a shell — and rotate every provider key the proxy could read.

02

Source Review & Web Hunter Notes

TierSourceKey findingCarry fwd
1NVD — CVE-2026-42271Command injection via MCP stdio test endpoints; affected 1.74.2–1.83.6; CVSS 8.7Yes
1GitHub Advisory GHSA-v4p8-mg3p-g94gAuthenticated command execution via MCP stdio test endpoints; fixed 1.83.7 (endpoints now require PROXY_ADMIN)Yes
1CISA KEV (added 2026-06-08)Confirmed active exploitation of CVE-2026-42271Yes
1Horizon3.ai attack researchChains CVE-2026-42271 with Starlette CVE-2026-48710 host-header bypass → unauthenticated RCE (combined CVSS 10.0); PoC publishedYes
2The Hacker News (2026-06-09)Endpoints accept command/args/env for stdio transport; subprocess spawned under proxy user; env holds provider keysYes
2Cloud Security Alliance / RescanaImpact: read env keys, mounted credential files, config & DB; mitigation = block test endpoints at reverse proxy if unable to patchPartial

Intel gap: No public campaign has released atomic network IOCs (C2 IPs, payload hashes). This pack therefore leads with behavioral/process-lineage detection and configuration indicators, and uses REPLACE_WITH_… placeholders in the IOC CSV rather than fabricated values.

03

Hunt Brief & Attack Chain

Hunt hypotheses (fidelity-ordered)

#HypothesisMITRETelemetryConf
H1A LiteLLM parent (python/uvicorn/gunicorn) spawned a shell or network client — the direct RCE signalT1190, T1059.004ProcessRollup2High
H2A gateway subprocess ran discovery / secret-access commands (id, env, /proc/self/environ, read secrets)T1552.001, T1082ProcessRollup2High
H3Reverse-shell / interactive-shell patterns launched from the gateway hostT1059.004, T1071ProcessRollup2High
H4Egress from the proxy or its child shell to unexpected infrastructure (C2 / exfil)T1041, T1071.001NetworkConnectIP4Med
H5A gateway subprocess wrote a script / executable to disk (staged tool, webshell, dropper)T1105, T1505.003PeFileWritten / FileCreateInfoMed
H6HTTP requests to /mcp-rest/test/* and anomalous Host headers at the ingress (bypass + injection)T1190Proxy / WAF / ingress logsMed

Attack chain

StepActionTelemetry / hunt angle
1 · ReconLocate an internet-exposed LiteLLM proxy (commonly TCP 4000)External scan logs; ingress access logs
2 · Auth bypassCVE-2026-48710 — crafted Host header defeats Starlette host validation, reaching admin-only MCP test endpoints unauthenticatedIngress HTTP logs: Host header not matching expected FQDN; requests to /mcp-rest/test/*
3 · InjectionCVE-2026-42271 — POST stdio config {command,args,env}; LiteLLM spawns it as a subprocess under the proxy userProcessRollup2: python/uvicorn parent → sh/bash/curl child (Q1)
4 · DiscoveryChild runs id/whoami/uname/env, reads /proc/self/environProcessRollup2 CommandLine (Q2)
5 · Cred accessRead provider API keys from env; read mounted secret files, LiteLLM config & DBCommandLine referencing environ/secrets/.env (Q2)
6 · C2 / exfilReverse shell or curl/wget to attacker infra; stage toolingReverse-shell CommandLine (Q3); egress (Q4); file write (Q5)
04

Consolidated IOC Table

No atomic network IOCs (C2 IPs, payload hashes) have been published for this activity. The indicators below are exploit-path, configuration, and behavioral signals — use them as hunts, not blocklist entries, until campaign-specific atomics are sourced.

TypeValueConfActionContext
URI path/mcp-rest/test/connectionhighhuntCVE-2026-42271 injection endpoint (POST)
URI path/mcp-rest/test/tools/listhighhuntCVE-2026-42271 injection endpoint (POST)
HTTP headerHost header not matching served FQDNmediumhuntCVE-2026-48710 "BadHost" bypass attempt
Behaviorpython/uvicorn/gunicorn → sh/bash/curl childhighdetectCommand injection execution (Q1)
BehaviorGateway child reads /proc/self/environ or mounted secretshighhuntProvider-key theft (Q2)
ConfigLiteLLM 1.74.2 – 1.83.6highenrichVulnerable version range (fixed 1.83.7)
ConfigStarlette 1.0.0 or earlierhighenrichHost-header bypass dependency (fixed 1.0.1)
ConfigLiteLLM admin/proxy exposed to the internetmediumenrichReachability precondition for the chain
05

Affected Surface & Telemetry Matrix

SurfaceRequired telemetryPriorityGap risk
Linux container/host running LiteLLM (typical)Falcon Linux sensor — ProcessRollup2, NetworkConnectIP4, file-write eventsCriticalSensor often absent inside minimal/distroless AI containers
Windows host running LiteLLMProcessRollup2 (python.exe → cmd/powershell)HighLess common deployment
Reverse proxy / API gateway / K8s ingressHTTP access logs (URI path + Host header) in NGSIEMHighIngress logs frequently not onboarded to Falcon
Provider secrets (env / mounted files)N/A — preventive (secrets manager, key rotation)CriticalEnv-var keys invisible to EDR once read

Telemetry note: the strongest detections here need the Falcon Linux sensor running inside the LiteLLM container (or on the host with container visibility). Confirm sensor coverage on AI/ML infrastructure before trusting Q1–Q5.

06

ATT&CK Mapping

TacticTechniqueObserved behaviorQuery / Control
Initial AccessT1190 Exploit Public-Facing ApplicationMCP test endpoints reached via Starlette host-header bypassQ6 (native) · patch/ingress block
ExecutionT1059.004 Unix ShellProxy spawns sh/bash from injected stdio commandQ1, Q3
ExecutionT1059.006 Python / T1059.001 PowerShellpython -c / cmd / powershell child on Windows hostsQ6
DiscoveryT1082 System Information · T1033 Owner/Userid, whoami, uname, hostname under gateway parentQ2
Credential AccessT1552.001 Credentials In Files / EnvRead /proc/self/environ, .env, mounted secrets, provider keysQ2 · secrets-manager control
Command & ControlT1071.001 Web Protocols · T1105 Ingress Tool TransferReverse shell / curl-wget egress; staged toolingQ3, Q4, Q5
PersistenceT1505.003 Web ShellScript/webshell written by a gateway subprocessQ5
ExfiltrationT1041 Exfil Over C2 ChannelStolen keys/config sent to attacker infraQ4
07

Native Audit-Log Hunts (non-CQL)

Where the Falcon sensor is not inside the container, the exploit still leaves a trail at the ingress / reverse proxy and in LiteLLM's own logs. Run these against whatever platform holds those logs (NGSIEM, ELK, cloud LB logs, WAF).

Reverse-proxy / ingress access log — exploit endpoints & host-header bypass

// Any HTTP method to the MCP test endpoints is suspicious in production:
request.path in ("/mcp-rest/test/connection", "/mcp-rest/test/tools/list")

// Host-header bypass (CVE-2026-48710): Host value not matching your served FQDN(s)
http.host NOT IN ("gateway.example-allowed-fqdn") AND status_code < 500

// Triage: source IP, count, first/last seen, request body size (large body = stdio config payload)

LiteLLM application log

// Look for MCP "test connection" / "tools list" invocations and any subprocess-spawn log lines.
// Correlate their timestamps against the ProcessRollup2 hits from Q1-Q3 on the same host.

Kubernetes / container runtime

// If runtime audit is enabled, alert on 'exec into' or process creation inside the
// litellm pod where the exec'd binary is a shell (sh, bash) - the pod should never run one.

These native hunts are the primary coverage for Step 2 (host-header bypass), which produces no endpoint process telemetry. Treat any hit here as a trigger to pull Q1–Q3 for the same host/timeframe.

08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Q1 · LiteLLM parent spawns a shell / net client (core RCE)
CONF HIGHFP LOWCOST LOW

Looks for: a LiteLLM/Python gateway process directly spawning a shell, interpreter, or network client — the exact signature of CVE-2026-42271 command injection. An AI gateway has no legitimate reason to fork sh/curl.

// HUNT: LiteLLM proxy process spawning a shell / net client (CVE-2026-42271)
// CONF: high  FP: low  COST: low | REQUIRES: Linux/Windows process telemetry (ProcessRollup2)
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(python[0-9.]*|uvicorn|gunicorn|litellm|hypercorn)$/i
| FileName=/^(sh|bash|dash|zsh|curl|wget|nc|ncat|socat|perl|ruby)$/i
| table([ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, aid, ProcessStartTime], limit=200)
Q2 · Discovery / secret-access under a gateway subprocess
CONF HIGHFP LOWCOST LOW

Looks for: post-exploit discovery and provider-key theft — reads of /proc/self/environ, id/whoami/env, or cat of .env/secrets/config under a gateway parent.

// HUNT: Post-exploit discovery / secret access under a LiteLLM subprocess
// CONF: high  FP: low  COST: low | REQUIRES: process telemetry with CommandLine
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(python[0-9.]*|uvicorn|gunicorn|litellm|sh|bash|dash)$/i
| CommandLine=/(proc\/self\/environ|proc\/1\/environ|run\/secrets|(^|\s)(id|whoami|uname|hostname|env|printenv)(\s|$)|cat\s+.*(\.env|environ|secrets|config\.yaml))/i
| table([ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, aid], limit=200)
Q3 · Reverse-shell / interactive-shell patterns
CONF HIGHFP LOWCOST LOW

Looks for: classic reverse-shell one-liners (bash -i, /dev/tcp, nc -e, python socket, perl/ruby socket) launched from the gateway host after injection.

// HUNT: Reverse-shell / interactive-shell one-liners from a LiteLLM host
// CONF: high  FP: low  COST: low | REQUIRES: process telemetry with CommandLine
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(python[0-9.]*|uvicorn|gunicorn|litellm|sh|bash|dash)$/i
| CommandLine=/(bash\s+-i|sh\s+-i|dev\/tcp\/|(nc|ncat|socat)\s+.*(-e|exec|EXEC:)|python[0-9.]*\s+-c\s+.*(socket|pty\.spawn|subprocess)|(perl|ruby)\s+-e\s+.*socket)/i
| table([ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, aid], limit=200)
Q4 · Unexpected egress from the gateway or its child
CONF MEDFP MEDCOST MED

Looks for: network connections initiated by the proxy or a child shell to common C2/exfil ports. FP: the proxy legitimately dials LLM providers on 443/80 — allow-list known provider CIDRs and focus first on 4444/1337/9001 and any 443 egress made by sh/curl children (not the python parent).

// HUNT: Egress from a LiteLLM proxy / child shell to unexpected infra (C2 / exfil)
// CONF: medium  FP: medium  COST: medium | REQUIRES: NetworkConnectIP4 with process context
// TUNING: allowlist known LLM-provider CIDRs and exclude the python parent's own 443 egress; focus first on 4444/1337/9001
#event_simpleName=NetworkConnectIP4
| ContextBaseFileName=/^(python[0-9.]*|uvicorn|gunicorn|litellm|sh|bash|dash|curl|wget|nc|ncat|socat)$/i
| RemotePort=/^(4444|1337|9001|8080|8443|53)$/
| table([ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, aid], limit=200)
Q5 · File / script written by a gateway subprocess
CONF MEDFP MEDCOST LOW

Looks for: a staged tool, webshell, or dropper written to disk by a gateway subprocess. FP: build/CI containers legitimately write .py/.sh — scope to production gateway hosts and exclude known package-install paths (site-packages, pip cache).

// HUNT: File written to disk by a LiteLLM subprocess (staged tool / webshell / dropper)
// CONF: medium  FP: medium  COST: low | REQUIRES: file-write telemetry with process context
// TUNING: exclude package-install paths (site-packages, pip cache) and CI/build hosts that legitimately write scripts
#event_simpleName=/PeFileWritten|NewExecutableWritten|FileCreateInfo/
| ContextBaseFileName=/^(python[0-9.]*|uvicorn|gunicorn|litellm|sh|bash|dash|curl|wget)$/i
| TargetFileName=/\.(sh|py|elf|bin|out|so|php|jsp)$/i
| table([ComputerName, UserName, ContextBaseFileName, TargetFileName, aid], limit=200)
Q6 · Windows LiteLLM host — python spawns cmd / PowerShell
CONF HIGHFP LOWCOST LOW

Looks for: the Windows equivalent of Q1 — a Python/uvicorn gateway parent spawning cmd, PowerShell, or a LOLBin download client. Rare deployment but a very high-fidelity signal where it applies.

// HUNT: Windows LiteLLM host - python/uvicorn spawning cmd or PowerShell (CVE-2026-42271)
// CONF: high  FP: low  COST: low | REQUIRES: Windows process telemetry
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(python[0-9.]*\.exe|uvicorn\.exe|gunicorn\.exe|litellm\.exe|py\.exe)$/i
| FileName=/^(cmd\.exe|powershell\.exe|pwsh\.exe|curl\.exe|certutil\.exe|bitsadmin\.exe)$/i
| table([ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, aid], limit=200)
09

CrowdStrike Custom IOA Recommendations

IOA namePatternExclusionsAction
AI Gateway Shell SpawnParent image = python/uvicorn/gunicorn/litellm; Child image = sh/bash/dash/zshSanctioned entrypoint wrappers that legitimately exec a shell (allowlist by full path)Detect → Block on prod gateway host groups
AI Gateway Net ClientParent = python/uvicorn/gunicorn; Child = curl/wget/nc/ncat/socatHealth-check sidecars using curl (allowlist container)Detect (high severity)
Gateway Reverse ShellCommandLine contains /dev/tcp, bash -i, nc -e, python -c socket on a gateway host groupNone expectedBlock

Deployment path: promote Q1/Q3 first — they are low-FP and map cleanly to a parent/child image-name IOA. Scope IOAs to a host group tagged for AI/ML infrastructure so the (rare) legitimate shell-spawning services elsewhere aren't affected.

10

Machine-Readable IOC Appendix

No campaign atomics are published. The CSV uses REPLACE_WITH_… placeholders — populate only from IOCs you source and cite. Ship the behavioral and audit blocks now; they need no atomics.

Falcon IOC Management CSVbulk import
type,value,action,severity,expiration,description,tags
sha256,REPLACE_WITH_SHA256,prevent,critical,2027-01-14,LiteLLM RCE payload,campaign:LiteLLM-RCE
ipv4,REPLACE_WITH_C2_IP,detect,high,2026-10-14,LiteLLM RCE C2,campaign:LiteLLM-RCE
domain,REPLACE_WITH_C2_DOMAIN,detect,high,2026-10-14,LiteLLM RCE C2,campaign:LiteLLM-RCE
Behavioral Signaturesprocess lineage
# Parent -> Child image (all high fidelity on a gateway host):
python|uvicorn|gunicorn|litellm  ->  sh|bash|dash|zsh
python|uvicorn|gunicorn|litellm  ->  curl|wget|nc|ncat|socat
# CommandLine markers:
/dev/tcp/    bash -i    nc -e    python -c ...socket
/proc/self/environ    printenv    cat *.env    /run/secrets
Vulnerable-Version / Patch Auditexposure
# Flag any host where:
LiteLLM version in [1.74.2 .. 1.83.6]      # fixed in 1.83.7
Starlette version 1.0.0 or earlier         # fixed in 1.0.1
AND /mcp-rest/test/connection reachable pre-auth
# Confirm patched:
pip show litellm | grep -i version
python -c "import starlette,sys; sys.stdout.write(starlette.__version__)"
Ingress Endpoint Blockstop-gap
# nginx / reverse-proxy stop-gap if you cannot patch immediately:
location = /mcp-rest/test/connection { return 403; }
location = /mcp-rest/test/tools/list { return 403; }
# Enforce a Host allow-list to blunt CVE-2026-48710:
if ($host != "gateway.your-fqdn.example") { return 421; }
11

Detection Validation Gates

GateCheckPass criteria
Telemetry readyFalcon Linux sensor reporting ProcessRollup2 from inside the LiteLLM container/hostSample process events visible for the gateway host in the last 24h
Benign baselineRun Q1 over 7 days pre-incidentUnderstand/allowlist any legitimate shell-spawning entrypoint before alerting
Positive testIn a lab, POST a benign stdio config (command=id) to the test endpoint on a vulnerable buildQ1 & Q2 fire on the resulting python→id lineage
Bypass testSend the same request with a spoofed Host header on an unpatched StarletteNative ingress hunt (s7) flags the Host anomaly + endpoint path
PromotionQ1/Q3 clean over baseline windowPromote to Custom IOA (Block) on the AI-infra host group
12

Hardening — Tiered

Immediate (this week)
  • Patch LiteLLM to 1.83.7 or later — the fix restricts both MCP test endpoints to the PROXY_ADMIN role. (MITRE M1051 Update Software)
  • Upgrade Starlette to 1.0.1 or later — closes the CVE-2026-48710 host-header bypass that makes the chain unauthenticated. (M1051)
  • Block /mcp-rest/test/connection and /mcp-rest/test/tools/list at the reverse proxy / ingress if you cannot patch instantly. (M1037 Filter Network Traffic)
  • Remove the gateway admin/proxy from direct internet exposure — front it with an authenticated gateway or VPN. (M1030 Network Segmentation)
  • Rotate every provider API key reachable from the proxy environment (assume exposure if you were unpatched and internet-facing). (M1027 Password Policies / key hygiene)
Near term (1–4 weeks)
  • Run the proxy as a non-root, least-privilege user in a read-only container with no shell in the image; drop unnecessary Linux capabilities. (M1026 Priv Account Mgmt · M1038 Execution Prevention)
  • Move provider keys out of process env into a secrets manager issuing short-lived tokens; stop baking long-lived keys into env/config. (M1041 Encrypt Sensitive Information)
  • Enforce a Host allow-list at the ingress (only the served FQDN) to defeat host-header spoofing defensively. (M1037)
  • Egress-filter the gateway to only the known LLM provider endpoints, so a reverse shell or exfil attempt has nowhere to go. (M1030 / M1037)
Strategic (1–3 months)
  • Network-segment AI gateways and broker all provider calls through an allow-listed egress proxy. (M1030)
  • Apply pod policy — seccomp RuntimeDefault, AppArmor, and admission control that forbids shell exec in gateway pods. (M1038) best-practice
  • Gate AI-infra dependencies in CI with SBOM + automated CVE checks so a vulnerable LiteLLM/Starlette can't reach production unnoticed. (M1051)
13

Deployable Playbooks

1 · Patch & verify (Python / container)

# Pin the fixed versions and rebuild the image:
pip install "litellm==1.83.7" "starlette>=1.0.1"     # or a later release
# Verify at runtime:
pip show litellm | grep -i version         # expect 1.83.7 or later
python -c "import starlette,sys; sys.stdout.write(starlette.__version__)"
# Confirm the test endpoints now require admin (expect 401/403 unauth):
curl -s -o /dev/null -w "%{http_code}\n" -X POST http://127.0.0.1:4000/mcp-rest/test/connection

2 · Reverse-proxy stop-gap (nginx) — until patched

location = /mcp-rest/test/connection { return 403; }
location = /mcp-rest/test/tools/list { return 403; }
# Host allow-list to blunt CVE-2026-48710:
map $host $bad_host { default 1; "gateway.your-fqdn.example" 0; }
if ($bad_host) { return 421; }

3 · Kubernetes hardening (gateway Deployment)

securityContext:
  runAsNonRoot: true
  runAsUser: 10001
  readOnlyRootFilesystem: true
  allowPrivilegeEscalation: false
  capabilities: { drop: ["ALL"] }
  seccompProfile: { type: RuntimeDefault }
---
# NetworkPolicy: egress only to known provider endpoints (example — tune to your providers)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: { name: litellm-egress-allowlist }
spec:
  podSelector: { matchLabels: { app: litellm } }
  policyTypes: ["Egress"]
  egress:
    - to: [{ ipBlock: { cidr: 0.0.0.0/0 } }]   # REPLACE with provider CIDRs
      ports: [{ protocol: TCP, port: 443 }]

4 · Provider key rotation checklist

# For each provider whose key was in the gateway env/config:
#  1. Issue a new key in the provider console.
#  2. Update the secrets manager entry (NOT the container env).
#  3. Revoke the old key.
#  4. Review provider usage/billing logs for anomalous calls since the exposure window.
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-contain the gateway host via Falcon; block the two test endpoints at ingress; pull the host from the LB poolSOC / PlatformContainment ticket; ingress rule change
ScopeRun Q1–Q6 + native ingress hunt across all LiteLLM hosts for the exposure window; identify which keys/files were reachableThreat HuntQuery exports; process trees
EradicatePatch LiteLLM 1.83.7+ / Starlette 1.0.1+; rebuild the container from a clean image; remove any dropped tooling/webshell found by Q5PlatformImage digest; file-removal log
RotateRotate ALL provider API keys and any secret reachable from the proxy; invalidate LiteLLM proxy keys/DB credsIAM / PlatformKey-rotation record; provider billing review
RecoverRedeploy hardened (non-root, read-only, egress-limited); re-expose only behind auth; monitor Q1/Q3 as IOAsPlatform / SOCDeployment manifest; IOA status
ReportDocument exposure window, keys rotated, provider-side abuse (if any), lessons learnedIR LeadIncident report
15

Detection Coverage Map

TechniqueBehaviorCQLIOACoverage
T1190Exploit MCP endpoints via host-header bypassnative (s7)Partial (ingress logs needed)
T1059.004Gateway spawns shellQ1, Q3YesGood
T1059.001/.006Windows cmd/powershell/python childQ6YesGood
T1552.001Env / secret / key theftQ2PartialGood
T1082 / T1033Discovery commandsQ2Good
T1071 / T1041C2 / exfil egressQ4Partial (provider-egress FP)
T1105 / T1505.003Dropped tool / webshellQ5Partial

Known gaps: (1) Step 2 (host-header bypass) has no endpoint process telemetry — coverage depends on ingress/WAF logs being onboarded (s7). (2) Minimal/distroless AI containers frequently lack the Falcon sensor, blinding Q1–Q5 — confirm sensor coverage first (see Validation Gates). (3) Egress detection (Q4) is FP-prone because the proxy legitimately calls providers on 443; allow-list provider CIDRs to sharpen it.

16

Hunt Summary Ticket

TITLE:      LiteLLM AI Gateway Unauthenticated RCE — CVE-2026-42271 + CVE-2026-48710
SEVERITY:   Critical (combined CVSS 10.0 · CISA KEV 2026-06-08 · exploited ITW)
SCOPE:      All hosts/containers running LiteLLM 1.74.2–1.83.6 (esp. internet-facing)
HYPOTHESIS: A LiteLLM parent (python/uvicorn/gunicorn) spawned a shell/net client
            or read env secrets after MCP stdio test-endpoint command injection.
QUERIES:    Q1 shell-spawn · Q2 secret access · Q3 reverse shell · Q4 egress
            Q5 file-write · Q6 Windows · native ingress hunt (s7)
DO FIRST:   1) Inventory LiteLLM + Starlette versions and internet exposure
            2) Run Q1 & Q3 over 14 days across AI-infra hosts
            3) Block /mcp-rest/test/* at ingress; patch 1.83.7+ / 1.0.1+
FINDINGS:   ____________________________________________________________
GAPS:       Ingress logs not onboarded? Sensor inside container? Provider-egress FP
ACTIONS:    Patch · block endpoints · rotate provider keys · promote Q1/Q3 to IOA
OWNER:      ____________________          VERSION: v0.2 (2026-07-14)
17

Changelog

v0.22026-07-24CQL correctness pass. All table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.
v0.12026-07-14Initial HuntPack — 6 CQL queries, native ingress hunts, IOA recs, tiered hardening, containment runbook. Behavioral-lead pack (no published atomics).
18

References

TierSourceUsed forAccessed
1NVD — CVE-2026-42271Affected versions, CVSS, mechanism2026-07-14
1GitHub Advisory GHSA-v4p8-mg3p-g94gEndpoint detail, fix (PROXY_ADMIN in 1.83.7)2026-07-14
1CISA KEV CatalogActive-exploitation confirmation (added 2026-06-08)2026-07-14
1Horizon3.ai — CVE-2026-42271 chained with CVE-2026-48710Unauth-RCE chain, PoC, detection indicators2026-07-14
2The Hacker News — LiteLLM flaw exploited in the wildSubprocess-spawn detail, impact summary2026-07-14
2Rescana — Active exploitation alertStarlette bypass context, mitigation2026-07-14

Generated 2026-07-14 · HuntPack · Defensive detection & hardening content only.