Build1 distinct publisher3 min readPublished
Microsoft Security Research says intruders who reached exposed LiteLLM, RAGFlow and Kestra deployments went for provider keys and database URLs first. It can name a confident initial vector in only one of the three cases.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
One file read carries the LiteLLM case. PID 1 inside the container is the service process, so `/proc/1/environ` is the gateway's configuration exactly as it was handed over at startup: provider API keys, master keys, and `DATABASE_URL` in one blob [2]. That last string is what turns a credential read into a credential inventory. With it, the attacker connected to LiteLLM's PostgreSQL and harvested and exfiltrated model configurations and virtual keys [5]. The keys your teams were issued through the gateway are in scope, not only the upstream keys the gateway holds for itself [22].
Read the confidence gradient before the mitigations. Microsoft evaluates the LiteLLM initial access as consistent with a chain of CVE-2026-42271 and CVE-2026-48710, while saying it is not definitively confirmed [1]. For RAGFlow it declines to name a CVE at all, even at low confidence [10]. Only Kestra gets a high-confidence vector, the authentication bypass CVE-2026-49869 [11]. That is one confident entry point across three platforms [25].
The RAGFlow tradecraft is the part worth studying. A hidden Python hook is placed under the application path to alter startup and import routes [8], and the TenantLLM configuration handling is wrapped so that any LLM provider registered after infection leaks its key [9]. Nothing visibly breaks; configuration operations keep working normally while new keys are stolen [15]. The detection signal there is outbound traffic that follows a key registration, not a file hash [16].
Kestra fails in a different direction. A malicious workflow spawns a shell in a worker [12], and a mounted Docker socket lets the attacker enumerate `Config.Env` of other containers for cloud keys, database passwords and API tokens [13]. Persistence, meanwhile, went to the service account's `authorized_keys`, cron, hidden files, and immutable attributes [6]. Immutable attributes mean your cleanup script exits zero and deletes nothing.
Microsoft's control list is four separate deployment decisions. Each lands on a specific step. Keeping the management plane private with authentication, patching and source IP restrictions removes the reach [19]. Moving secrets into a dedicated store instead of the process environment devalues the `/proc/1/environ` read [20][2]. Mounting `/tmp` with `noexec` breaks the drop of an ELF binary executed under a service-like name [21][3], but not the Python hook, which needs no temp file because it runs inside an interpreter that is already up [8]. Not mounting the Docker socket contains the Kestra pivot [21][13]. Default-deny egress is the expensive one, and also the one that stops mining pool and OAST traffic [21][24].
These observations only transfer to your deployment if the management plane is reachable from outside, keys sit in the process environment, `/tmp` is executable, the Docker socket is mounted, and outbound traffic is unrestricted [18]. The mining payload itself is the cheap part; an XMRig-based miner was deployed and competing miners removed [4], and in the Kestra case script output was parked in the platform's own KV API [14]. I would fix reach first and the environment block second, because `/proc/1/environ` and `Config.Env` are the same weakness read from two sides [2][13].
Ranked by verification strength, evidence, and original report placement.
Command execution was achieved through an externally exposed LiteLLM gateway; Microsoft evaluates this as consistent with a chain of CVE-2026-42271 and CVE-2026-48710, though it is not definitively confirmed.
The attacker reads /proc/1/environ, which holds the environment variables of the PID 1 process inside the container, to gather model provider API keys, master keys, and DATABASE_URL.
Python, curl, and wget are used as alternatives to place an ELF binary in /tmp and execute it with a service-like name.
An XMRig-based miner is deployed, and competing miners are removed.
The attacker connects to the LiteLLM PostgreSQL database using the retrieved DATABASE_URL to harvest and exfiltrate model configurations and virtual keys.
Persistence is established using the service account's authorized_keys, cron, hidden files, and immutable attributes.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 27, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
security
Microsoft's own incident data says the AI gateway is now the credential store1 distinct publisher
security
Attackers hid a cryptominer inside a LiteLLM MCP config test that reported success1 distinct publisher
security
A misconfigured GitHub Actions workflow handed TeamPCP the token that poisoned five ecosystems1 distinct publisher
build
Your test grid is an RCE surface: SeleniumGreed turns exposed Selenium hubs into miners2 distinct publishers
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Detailed but single-sourced and secondhand
The technical detail is unusually specific for a summary - named files, APIs, persistence mechanisms and per-telemetry detection guidance - which raises credibility. But the entire cluster is one dev.to restatement of a Microsoft Security Research report with no link to or excerpt from the primary publication, no IOCs, no victim counts and no independent corroboration, and the report itself declines to attribute two of three initial vectors.
Three named platform intrusions, no scale data
Real-world occurrence is evidenced qualitatively: three distinct intrusions on named, widely deployed AI infrastructure components with platform-specific tradecraft. Nothing in the cluster quantifies how many deployments were hit, how exposed the install base is, or whether campaigns are ongoing, so breadth cannot be scored higher.
Mildly overstated by framing, hedged in substance
The report is self-limiting where it matters: it labels the LiteLLM CVE chain as merely consistent and unconfirmed, and admits it cannot name a CVE for one initial breach. Against that, a High severity rating and a broad impact list are presented without victim counts, exposure estimates or IOCs, and the supplied bullets do not clearly bind CVE-2026-49869 to a specific product - so the packaging is slightly ahead of what the evidence pins down.
Vendor research with generic-but-aligned advice
The underlying findings come from a commercial security vendor's research arm, which has an interest in framing AI infrastructure as a growth attack surface, and the telemetry taxonomy mirrors a vendor product portfolio (EDR, identity, SaaS/cloud, network). Offsetting this, the mitigations are vendor-neutral hardening steps - private management planes, secret stores, default-deny egress, no Docker socket mounts - and the report volunteers the limits of its own attribution. The republishing platform adds a distribution incentive but no evident commercial stake.
Moderate-low: coherent account, one unverified channel
Internal consistency is high - tradecraft, preconditions, indicators and mitigations all line up - so the pattern is likely real in outline. Confidence is held down by full dependence on one secondhand summary, absent primary-source verification, missing IOCs and scale, and ambiguity about which platform each CVE assessment belongs to.