v vanemmerik.ai / SUPPLY-CHAIN
Supply Chain · Watch Thursday · 18 June 2026 End-of-day synthesis 4 watches · 69 items

From the watchtower — what crossed the wire today.

A four-times-a-day standing watch on the open-source supply chain. Each pass pulls newly disclosed CVEs, freshly catalogued KEV adds, and active attacks reported in the wild — then ranks them by severity for the day.

The story of the day — AI agent frameworks and MCP servers became the day's soft target — a dozen-plus unauthenticated-control-plane and prompt-injection-to-RCE holes landed across PraisonAI, Crawl4AI, OpenClaw and the MCP tooling, while a real update-channel compromise hit WordPress and CISA flagged an actively-exploited Splunk file-write.

The open-source supply chain's newest soft underbelly showed itself today: the AI agent stack. PraisonAI shipped six criticals this morning, and the First Watch fetch added Crawl4AI (a CVSS-10 unauthenticated RCE plus an arbitrary-file-write and an SSRF), the gemini-mcp-tool and netlicensing-mcp MCP servers, AgenticMail's unauthenticated "bridge-wake" that resumes a Claude Code session with permissions disabled, and a twenty-advisory OpenClaw batch. The recurring shape is an agent or MCP server that binds a powerful control plane to the network with no auth, or guards it with a check that's wired in the wrong order or routable around — prompt and message become the new unauthenticated request.

Off the agent beat, the genuinely in-the-wild story is the ShapedPlugin update-channel compromise: trojanised commercial WordPress plugins pushed to paying customers through the vendor's own auto-update server, the same un-auditable-vendor-pipeline trust failure as last week's OptinMonster/Icegram tampering. CISA also catalogued CVE-2026-20253 today — a missing-auth arbitrary file create/truncate in Splunk Enterprise with a three-day BOD 26-04 deadline. Rounding out the day: a web-token/jose crypto cluster (algorithm confusion, a PBES2 p2c DoS, an RSA1_5 padding oracle), a second Daytona isolation break (sandbox-to-host path traversal), and Budibase SQLi across all three SQL connectors. The bright spot is that almost all of the agent-framework issues are pre-exploitation disclosures with fixes available — this is a chance to harden before the campaigns arrive.

→ Operational priority for the night patch internet-reachable Splunk Enterprise (CVE-2026-20253, due 2026-06-21) and get every AI agent / MCP server off routable interfaces behind authenticating proxies before morning — Crawl4AI, gemini-mcp-tool, AgenticMail and OpenClaw included — then inventory ShapedPlugin plugins and freeze WordPress auto-updates.

18:00 ET · First Watch

CISA KEV: Splunk Enterprise missing-auth lets an unauthenticated user create/truncate arbitrary files

CISA added CVE-2026-20253 today: Splunk Enterprise exposes a PostgreSQL sidecar endpoint with missing authentication that lets an unauthenticated user create or truncate arbitrary files on the host (CWE-306). A KEV add means active exploitation, and the BOD 26-04 due date is 2026-06-21 — three days. Inventory internet-reachable Splunk Enterprise, apply SVD-2026-0603, and restrict the sidecar endpoint at the network edge tonight.

Crawl4AI: unauthenticated RCE via Chromium launch-argument injection in browser_config.extra_args

Crawl4AI's Docker server passes `browser_config.extra_args` straight into the Chromium launch line, so an unauthenticated caller can inject flags (e.g. a malicious `--load-extension`/`--remote-debugging` shape) and reach code execution (CVSS 10.0). Any exposed Crawl4AI server is unauthenticated RCE-by-design. Take the Docker server off any routable interface and front it with auth; treat an exposed instance as already compromised.

Crawl4AI: arbitrary file write via path traversal in crawler downloads → RCE

Crawl4AI writes downloaded files using an attacker-influenceable path with no traversal guard (CVSS 9.6), so a crawl target can drop a file outside the download directory — a startup script, a cron, an SSH key — and escalate to code execution. Same unauthenticated-control-plane theme as the launch-arg RCE; both land in the same advisory batch. Upgrade Crawl4AI and never expose the server.

gemini-mcp-tool: OS command injection and @file exfiltration via prompt quoting (CVE-2026-0755)

gemini-mcp-tool builds a shell command from prompt text without safe quoting, so a crafted prompt injects OS commands and the `@file` syntax exfiltrates local files (CVSS 9.8). For an MCP server this is prompt-injection-to-shell: any untrusted content the agent ingests becomes host command execution. Upgrade, and never run this MCP against untrusted input on a host you care about.

netlicensing-mcp: REST path traversal bypasses token redaction

netlicensing-mcp's REST proxy can be path-traversed to reach endpoints whose responses skip the token-redaction layer, leaking the credentials the redactor was supposed to hide (CVSS 9.6). The security control is present but routable around — the same shape as several agent-framework guards this cycle. Patch; assume any token handled by an exposed instance is disclosed and rotate.

@acastellon/auth: authentication bypass via spoofable headers in validateToken()

`validateToken()` trusts client-supplied headers to establish identity, so an attacker sets the header and is authenticated without a valid token. This is the same spoofable-header trust bug as today's Kirby Panel-install issue, in an auth library whose entire job is the thing it gets wrong. Upgrade immediately and audit anything that imported it for forged sessions.

Crawl4AI: unauthenticated SSRF on the Docker server /crawl/stream path

The `/crawl/stream` endpoint will fetch attacker-supplied URLs server-side with no auth (CVSS 8.6) — SSRF into internal networks and cloud metadata. Rounds out a three-CVE Crawl4AI cluster (RCE + file write + SSRF). Egress-filter the crawler host and require auth before exposing it.

AgenticMail: unauthenticated inbound mail resumes the operator's Claude Code session with bypassPermissions

An unauthenticated inbound email to AgenticMail can trigger a "bridge-wake" that resumes the operator's Claude Code session in `bypassPermissions` mode — i.e. a stranger's email drives an agent with approvals disabled. This is the prompt/message-as-control-plane pattern at its sharpest: the trust boundary is an open mailbox. Do not run AgenticMail against a public inbox; gate the bridge behind sender auth before any deployment.

AgenticMail: cross-agent task authorization bypass in the API

The AgenticMail API lets one agent enqueue or read tasks belonging to another agent — a missing authorization check across the multi-agent boundary. Companion to the bridge-wake issue; same release. Upgrade and scope agent task access per-identity.

Budibase: SQL injection in the PostgreSQL, MS SQL and MySQL database connectors

Budibase's database connectors interpolate user input into queries for all three major SQL backends (CVSS 8.4), so a low-code app builder becomes a direct SQLi path into the connected database. If you let untrusted users author or drive Budibase apps over a production DB, this reads/writes that DB. Upgrade and run connectors against least-privilege DB accounts.

PHP JWT Framework (web-token/jose): JWSVerifier reads the algorithm from the unprotected header — algorithm confusion

`JWSVerifier` selects the verification algorithm from the token's own unprotected header, the classic alg-confusion footgun — an attacker can downgrade RS256 to HS256 (or to `none`-adjacent behaviour) and forge signatures. Part of a multi-advisory web-token/jose disclosure today. Pin the accepted algorithm allowlist server-side and upgrade.

OpenClaw: ~20 advisories land at once — exec allowlists, .env-derived paths, and mutable-identity allowFrom checks all bypassable

OpenClaw disclosed roughly twenty advisories in one batch (CVE-2026-53853 and siblings): exec allowlists that skip configured argument patterns, workspace `.env` values that steer dependency/runtime roots and PATH, and `allowFrom` checks across Discord/Zalo/BlueBubbles that bind to mutable display names instead of stable IDs. Individually mostly high/medium, collectively a coordinated audit showing the chat-agent's trust boundaries leak from the workspace and from spoofable chat identities. Treat opening an untrusted workspace as code execution, and upgrade to the fixed release in one move rather than chasing each CVE.

Daytona: path traversal in sandbox volume id mounts arbitrary host paths — cross-tenant access and host escape

A traversal in Daytona's sandbox volume-id handling lets a sandbox mount arbitrary host paths (CVE-2026-54319), reaching other tenants' data and the host filesystem — a container/sandbox escape in the dev-environment control plane. Second Daytona advisory today after this morning's cross-tenant WebSocket leak; the multi-tenant isolation story is shaky. Upgrade and avoid exposing Daytona to untrusted sandbox workloads.

Signal K Server: unauthenticated SSRF via remote-connection endpoints

`makeRemoteRequest()` takes attacker-controlled host/port/TLS params on three admin endpoints with no validation, and in the default (security-not-configured) state those endpoints need no auth (CVE-2026-55591) — SSRF to internal services and cloud metadata. Configure Signal K security and don't expose the admin API; upgrade past 2.27.0.

Armeria: external control of file path in xDS SDS DataSource

Armeria's xDS SDS DataSource lets an external value steer a file path (CVE-2026-11752), exposing arbitrary-file-read in the secret-discovery path of the service mesh control plane. Patch if you run Armeria xDS; constrain the SDS source to trusted config.

12:00 ET · Forenoon Watch

ShapedPlugin update channel compromised — infected releases pushed to paying WordPress customers

Multiple commercial ShapedPlugin WordPress plugins were trojanised at the vendor's own update server, so paying sites pulled the backdoor through the legitimate auto-update flow rather than a third-party mirror. This is the textbook update-channel compromise — the same shape as the OptinMonster/Icegram CDN tampering last week — where the trust boundary you can't audit is the vendor's release pipeline. Inventory ShapedPlugin products (Smart Post Show, Logo Carousel, and siblings), pin/freeze plugin auto-updates, and diff installed plugin files against a known-good release before trusting the next push.

PraisonAI (npm): MCPServer exposes an unauthenticated HTTP tools/call endpoint

The npm `praisonai` MCPServer serves tools, resources and prompts over HTTP JSON-RPC with no auth path — `startHttp()` ignores the Authorization header and every POST is executed (CVSS 9.8). Anyone who can reach the port can invoke the agent's tools directly, which for a tool-calling framework is unauthenticated RCE-by-design. Never bind MCPServer to a routable interface; front it with an authenticating reverse proxy and treat any exposed instance as already compromised.

PraisonAI (npm): AgentOS HTTP server defaults to 0.0.0.0 with no auth on agent invocation

AgentOS registers sensitive agent-listing and agent-invocation routes with no authentication middleware and defaults to `host: 0.0.0.0` (CVSS 9.4). A network-adjacent attacker can enumerate agent names/roles/instructions and invoke them — same unauthenticated-control-plane failure as the MCPServer issue, different entrypoint. Bind to localhost and require auth before any AgentOS deployment leaves a dev laptop.

PraisonAI (npm): codeMode `sandbox:true` is a regex blocklist, escapable via Function constructor

The `codeMode` tool advertises `sandbox: true` but only applies a small regex blocklist and nulls `process`/`require`; `Function('return this')()` recovers the global object and restores full execution (CVSS 9.9). Any agent that runs LLM-authored code through codeMode is effectively running it unsandboxed — a blocklist is not an isolation boundary. Do not rely on codeMode for untrusted code; run agent code in a real sandbox (separate process, seccomp/gVisor, or a disposable container).

PraisonAI (pip): `multiedit` tool does arbitrary file read/write with no path validation

The Python `multiedit` tool performs LLM-controlled file read and write with no workspace boundary or protected-path guard (CVSS 9.1), so a crafted prompt or malicious YAML workflow can read `/etc/shadow` or `~/.ssh/id_rsa` and overwrite arbitrary files. Prompt-injection becomes host file access the moment this tool is registered. Drop multiedit from agent tool sets that touch untrusted input, or wrap it in a chroot/jailed workspace.

praisonai-platform: ships a hardcoded default JWT secret 'dev-secret-change-me'

praisonai-platform signs auth tokens with the built-in default secret `dev-secret-change-me`, and 0.1.4 (the version GHSA-3qg8 declares as the fix) still boots on it (CVSS 9.8). Anyone who reads the public source can forge admin tokens for any deployment that didn't override the secret — classic CWE-798 + insecure-default. Set a real signing secret from the environment and fail closed if it's missing; rotate every token issued under the default.

python-statemachine: SCXML `<data expr>` evaluated through `eval()` — code injection

python-statemachine 3.1.2 evaluates `<data expr="...">` attributes from SCXML documents with Python `eval()` (CVSS 9.8), so any app that feeds attacker-controlled SCXML to `SCXMLProcessor` gets arbitrary code execution in-process. If you parse user-supplied state-machine definitions, this is a direct RCE. Upgrade once patched and, in the meantime, never pass untrusted SCXML to the processor.

Jupyter Server: stored XSS in nbconvert handlers escalates to kernel RCE

The nbconvert HTTP handlers render user-authored notebook HTML under the Jupyter origin without a `sandbox` CSP directive, and HTMLExporter doesn't sanitize by default — a notebook with an HTML payload in a display_data output yields stored XSS with cookie access, full `/api/*` authority, and kernel RCE. On any multi-user or shared Jupyter deployment, opening a malicious shared notebook is enough. Patch jupyter_server promptly; until then don't render untrusted notebooks through the nbconvert endpoints.

Kirby CMS: remote Panel installation via spoofable `Forwarded` / `X-Real-IP` header

On a freshly deployed Kirby site with no user accounts behind a reverse proxy that sets `Forwarded`/`X-Client-IP`/`X-Real-IP`, a remote attacker could spoof a trusted client IP and install the Panel — i.e. create the first admin account. A newly-stood-up site is takeoverable in the window before the real admin registers. Patch Kirby, and ensure your proxy strips client-supplied forwarding headers rather than passing them through.

PraisonAI (npm): AgentLoop onToolCall approval hook runs *after* the tool already executed

`createAgentLoop()` documents `onToolCall` as an approval gate, but the implementation calls `generateText()` (which executes the tools) first and only then invokes the callback (CVSS 8.8) — the human-in-the-loop approval fires after the side effect. This is the same after-the-fact-approval bug class seen in Pi Agent this morning: the guard exists but is wired in the wrong order. If you depend on onToolCall to gate dangerous actions, treat it as advisory only until patched.

undici: SOCKS5 ProxyAgent silently drops `requestTls`, bypassing certificate pinning

undici's ProxyAgent discards the `requestTls` option for `socks5://`/`socks://` proxies, so HTTPS through the tunnel falls back to Node's default trust store and ignores your `ca`/`cert`/`rejectUnauthorized`/`servername` (CVSS 7.4). Anyone pinning to an internal CA via a SOCKS5 proxy loses the pin without error — a silent downgrade to system trust. Given undici's reach as Node's default fetch backend, audit any SOCKS5+mTLS path and upgrade.

undici: WebSocket client DoS via cumulative fragment-size bypass

undici's WebSocket client enforces `maxPayloadSize` per-frame but not across fragments, so a malicious server can stream many small valid frames whose total exceeds the limit, driving unbounded memory growth and OOM (CVSS 7.5). Any client connecting to an untrusted WebSocket endpoint is exposed. Upgrade undici; if you can't, cap connection lifetime/message count on outbound WS to untrusted servers.

Nodemailer: message-level `raw` option bypasses disableFileAccess/disableUrlAccess

Nodemailer v9.0.0 honours a message-level `raw` option that ignores `disableFileAccess`/`disableUrlAccess`, letting attacker-influenced message content read local files or pull a full URL response into the delivered mail (CVSS 7.1) — arbitrary file read plus SSRF whose body is exfiltrated in the sent message. If user input reaches message construction, those two guards are not enough. Sanitize/forbid `raw` on untrusted message paths and upgrade.

Pipecat: dev-runner telephony `/ws` accepts unauthenticated call-control with attacker-supplied Call SID

Pipecat's development runner exposes a `/ws` telephony endpoint with no auth; a remote attacker who reaches it can send a crafted Twilio handshake with an arbitrary Call SID and drive call control (CVSS 7.5). It's billed as dev-only, but exposed dev runners are exactly how these reach the internet. Don't expose the Pipecat dev runner publicly; gate `/ws` behind auth before any non-local deployment.

undici: shared-cache cross-user disclosure via whitespace-padded Cache-Control field names

undici's cache interceptor mis-parses `private=" authorization"` / `no-cache="\tauthorization"` — the whitespace defeats the literal field-name comparison, so responses meant to be private get stored and can be served to other users (CVSS 5.9). On a shared undici cache this is a cross-user info leak. Upgrade; if you run a shared cache in front of authenticated upstreams, this is the one to prioritise of the three undici advisories.

DOMPurify: persistent ALLOWED_ATTR pollution via setConfig() bypasses the 3.4.7 hook clone-guard

DOMPurify 3.4.7's fix for permanent hook pollution clones ALLOWED_ATTR inside `_parseConfig`, but that guard is skipped whenever the app uses the persistent-config API via `setConfig()` — so a `uponSanitizeAttribute` hook's mutation leaks into later `sanitize()` calls again. Apps using persistent config get an incomplete fix and a re-opened XSS-allowlist hole. If you call `setConfig()`, upgrade past this advisory rather than assuming 3.4.7 closed it.

Podman: WORKDIR symlink traversal can create dirs / change ownership on the host

A malicious image whose WORKDIR path contains a symlink can cause Podman to create a directory or alter ownership on the host filesystem during path dereference (CVSS 5.3); the ownership-change variant needs a race with a host-side mutator and is less likely. Pulling and running untrusted images is the trigger. For ARM64/Podman-based build hosts, patch and avoid running unvetted images as a privileged user.

DragonForce hides Backdoor.Turn C2 inside Microsoft Teams relay infrastructure

DragonForce ransomware affiliates are tunnelling a Go-based RAT's C2 through Microsoft Teams relay infrastructure to blend with legitimate collaboration traffic. Not a package-registry attack, but the trust-the-SaaS-egress pattern rhymes with supply-chain tradecraft and defeats naive C2 blocklists. Worth knowing if your egress policy treats Teams/Microsoft IP ranges as inherently safe.

Microsoft details a Windows clipper campaign using a USB LNK worm and Tor C2

Microsoft documented a long-running crypto-clipper spreading via a USB LNK worm with Windows Script Host / ActiveX launch logic and Tor-based C2. It's commodity crimeware rather than a registry compromise, included as context on live droppers in circulation. The LNK-on-removable-media vector is the durable lesson for endpoint policy.

06:00 ET · Morning Watch

vLLM: temperature=NaN / Infinity bypass sampler validation

vLLM accepts `temperature=NaN` and `temperature=Infinity`, slipping past sampler validation into undefined sampling behaviour and potential worker disruption. Any inference endpoint that forwards raw user-supplied sampling params is exposed — clamp temperature server-side instead of trusting the request body.

vLLM: GGUF dequantize int truncation exposes uninitialized GPU memory

An integer-truncation bug in vLLM's GGUF dequantize kernel can read uninitialized GPU memory into model output — a cross-tenant information-leak shape on shared inference hardware. Patch before loading untrusted GGUF weights on multi-tenant GPUs.

vLLM: OOM denial of service via audio decompression bomb

A crafted audio input decompresses to exhaust host memory and OOM-kills the vLLM worker — a single-request DoS against any audio-capable deployment. Bound decoded audio size at the gateway.

vLLM: incomplete fix for CVE-2026-22778 still leaks PIL repr addresses

Incomplete fix for CVE-2026-22778 — vLLM continues to leak PIL object repr addresses (ASLR-defeating pointer disclosure) through the Anthropic-compatible endpoint. Weak alone but a useful exploit primitive; apply the follow-up patch.

vLLM: image EXIF rotation & PNG tRNS transparency not normalized

vLLM's multimodal path doesn't normalize EXIF rotation or PNG tRNS transparency before inference, so the model can interpret an image differently than a pre-check did — a way to smuggle content past image-based filters. Five vLLM advisories landed together this cycle: treat it as an input-validation hardening pass and upgrade once.

Open WebUI: authenticated users can target arbitrary configured Ollama backends

Any authenticated Open WebUI user can redirect requests at an arbitrary configured Ollama backend — an SSRF/abuse-of-config primitive reaching internal model hosts. Part of the same wholesale object-level-authorization failure that produced yesterday's high-severity Open WebUI batch.

Open WebUI: RAG ACL bypass in Milvus multitenancy mode

Open WebUI bypasses its RAG ACL when Milvus runs in multitenancy mode, returning vectors from collections outside the caller's tenant. If you isolate RAG by tenant on Milvus, this defeats it.

Open WebUI: prompt-history IDOR via unbounded history_id

An unbounded `history_id` lets a user read other users' prompt history — another object-level-authz miss. Upgrade once to the fixed release rather than chasing the individual Open WebUI CVEs one by one.

NocoDB: SSRF via spreadsheet fetch URL

NocoDB fetches attacker-controlled spreadsheet URLs without egress restriction — a server-side request forgery sink into internal networks. One of three SSRF entry points disclosed for NocoDB today.

NocoDB: SSRF via base migration URL

Second NocoDB SSRF sink — the base-migration import fetches arbitrary URLs server-side. Self-hosted NocoDB reachable to internal services should be egress-filtered now.

NocoDB: SSRF via spreadsheet import endpoint

Third NocoDB SSRF sink, in the spreadsheet-import endpoint. Three SSRF holes in one app this morning — the operational fix is network-level egress control around the NocoDB host, not per-endpoint patching.

NocoDB: stored XSS via secure attachment

A 'secure' attachment can carry stored XSS that fires in another user's browser — the label promised the opposite of what it delivered. Patch alongside the NocoDB SSRF set.

NocoDB: refresh tokens persist through password recovery

Resetting a NocoDB password does not invalidate existing refresh tokens, so a recovered account stays accessible to whoever held a pre-reset token. Defeats password reset as an incident-response control.

Daytona: cross-tenant data leak in notification WebSocket gateway

Daytona's WebSocket notification gateway misses a scoping check and leaks notifications across tenants (CVSS 6.5) — cross-tenant data exposure in the dev-environment control plane. Upgrade if you run Daytona multi-tenant.

Traefik: Kubernetes Gateway crossProviderNamespaces bypass

Traefik's Kubernetes Gateway `crossProviderNamespaces` control can be bypassed, letting routes reference services in namespaces meant to be off-limits. Re-check route isolation if you depend on cross-provider namespace boundaries.

webpack-dev-server: HMR WebSocket interception via permissive origin

webpack-dev-server's HMR WebSocket accepts any origin, so a malicious page a developer visits can intercept HMR traffic and exfiltrate source (CVSS 5.3). Dev-only, but real on shared networks — bind the dev server to localhost and set `allowedHosts`.

CakePHP Authentication: open redirect via backslash bypass

`getLoginRedirect()` can be steered to an attacker host through a backslash bypass of its redirect validation — an open-redirect / phishing aid. Upgrade cakephp/authentication to 3.3.6 or 4.1.1, or validate the redirect query param yourself.

Multer: DoS via incomplete cleanup of aborted uploads

Second Multer DoS this cycle: aborted multipart uploads aren't fully cleaned up and leak resources until exhaustion (companion to yesterday's nested-field-name DoS). Upgrade Multer and cap upload concurrency.

Gitea: open redirect via redirect_to

Open redirect via `redirect_to`, rounding out yesterday's Gitea advisory batch. Low impact alone; fold into the same Gitea upgrade.

chrome-devtools-mcp: daemon.pid write follows symlinks in /tmp

chrome-devtools-mcp writes `daemon.pid` into `/tmp` while following symlinks (CVSS 6.1) — a local symlink-attack / file-clobber primitive on shared hosts. Same temp-file-hygiene class as the Pi Agent item below.

Pi Agent: loads project-local extensions without approval

The Pi coding agent auto-loads project-local extensions with no approval prompt — open a malicious repo and its extension runs. The recurring 'agent trusts the workspace' shape across AI dev tooling; treat opening an untrusted repo as code execution.

n8n: over-broad OAuth scope on evaluation test-run endpoints

n8n requests an over-broad OAuth scope on its evaluation test-run endpoints, granting tokens more access than the feature needs — a least-privilege regression. Minor, but worth folding into the same n8n upgrade as yesterday's fixes.