v vanemmerik.ai / SUPPLY-CHAIN
Supply Chain · Watch Wednesday · 17 June 2026 End-of-day synthesis 4 watches · 29 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 — The AI development toolchain became the supply chain: two live npm and IDE credential-theft campaigns landed alongside a flood of fresh advisories against the self-hosted LLM stack.

Today the attack surface and the disclosure surface pointed at the same thing — the tools developers use to build and run AI. The morning opened with the Mastra npm compromise (144 packages in the @mastra/* AI-framework namespace mass-published with an install-time infostealer) and a parallel JetBrains Marketplace campaign shipping fifteen fake AI-coding plugins that steal the provider keys developers paste into them.

Then the advisory feed caught up. A late-afternoon GHSA wave hit the self-hosted LLM stack from every side: Langflow with an unauthenticated file upload (CVSS 9.3), the Open WebUI cluster grew again with two redirect-based SSRF bypasses, LangChain4j with SQL injection through vector-store metadata filters, OpenClaw leaking configured MCP headers across cross-origin redirects, and Claude Code's own WebFetch allow-list turned into a HuggingFace exfiltration channel. Outside the AI lane the day was just as loud — Avo's Rails admin framework with a 9.6 authorization bypass, an XXE in the HAPI FHIR healthcare libraries, and a Gitea trio that lets a read-only org member fork a repo via the API and walk out with every organization CI/CD secret.

The bright spot is speed: the Mastra compromise was corroborated within hours by five independent detection vendors, and every advisory below shipped with a fix and concrete indicators.

→ Operational priority for the night grep CI and developer machines for any @mastra/* install since June 16 and rotate every AI-provider, npm, and cloud key reachable from a host that pulled one — then patch self-hosted Langflow, Open WebUI, and Gitea before re-exposing them.

18:00 ET · First Watch

Avo (Ruby on Rails admin framework): missing authorization in association-attach endpoint allows privilege escalation (CVSS 9.6)

Avo — the Ruby on Rails admin-panel framework — ships a missing-authorization flaw (CVSS 9.6): the UI and `GET .../:related/new` path check `attach_<association>?`, but the write endpoint `POST /resources/:resource/:id/:related` skips the check, so any authenticated low-privilege user can attach arbitrary related records with a crafted POST. Where associations encode teams, tenants, roles, ownership, or memberships, that is direct privilege escalation inside the admin plane. Upgrade Avo (≤ 3.32.0 and the 4.0 betas before beta.51 are affected) and audit attach authorization on custom Avo resources.

Langflow: unauthenticated unlimited file upload leads to disk exhaustion and path-disclosure info leak (CVSS 9.3)

Langflow — the popular visual builder for LangChain flows — lets unauthenticated users upload unlimited data with only network access, exhausting server disk and returning the uploaded file's absolute path in the response as a recon primitive for chaining (CVSS 9.3). Any internet-reachable Langflow instance is a free DoS and an information leak. Upgrade to 1.9.1 and get Langflow behind authentication, off the public internet.

Gitea: API fork missing CanCreateOrgRepo check lets read-only org members exfiltrate all org CI/CD secrets (CVSS 8.1)

Gitea's API fork endpoint checks `IsOrgMember()` but not `CanCreateOrgRepo()`, so a read-only org member can fork a repo into the org namespace via the API, receive admin on the fork, enable Actions, push a workflow, and exfiltrate every organization-level CI/CD secret — deploy keys, cloud credentials, API tokens (CVSS 8.1). This is the cleanest supply-chain shape of the day: read-only access to source becomes full control of the build secrets. Upgrade to 1.26.0 and rotate org-level Actions secrets if untrusted members had API access.

Gitea: stored XSS via crafted glTF in the built-in 3D file viewer (CVSS 8.7)

Also in the Gitea batch: a crafted `.gltf` pushed to any repository triggers stored XSS in the built-in 3D file viewer — Online3DViewer builds an unsupported-extension error from the file and Gitea inserts it via `innerHTML` without sanitization, running attacker JavaScript for anyone who views the file (CVSS 8.7). Push access to any repo is enough. Same upgrade as the rest of the Gitea cluster.

HAPI FHIR: XXE in XsltUtilities.saxonTransform via an unhardened Saxon TransformerFactory

The HAPI FHIR utilities library exposes `XsltUtilities.saxonTransform()` overloads that build a bare Saxon `TransformerFactoryImpl` with no XXE hardening — unlike the sibling `transform()` helpers, which use the project's `newXXEProtectedTransformerFactory()` — so any XML run through the Saxon path is parsed with external DTDs and entities enabled. An attacker who controls or can MITM a transformed FHIR document gets file disclosure and SSRF, and healthcare-data infrastructure is the worst place to ship an XXE. Upgrade `org.hl7.fhir.utilities` past 6.9.9.

HAPI FHIR: incomplete fix for CVE-2026-45367 leaves DSTU2 FHIRPathEngine.matches() open to ReDoS (CVSS 7.5)

Companion HAPI FHIR advisory: the CVE-2026-45367 ReDoS fix added `RegexTimeout` to DSTU2016MAY/DSTU3/R4/R4B/R5, but the DSTU2 module's `matches()` still calls raw `String.matches()` with no timeout, leaving unauthenticated catastrophic-backtracking CPU exhaustion (CVSS 7.5). Classic incomplete-fix shape — confirm your upgrade actually closed DSTU2, not just the other modules.

LangChain4j: SQL injection via metadata filters in langchain4j-mariadb and langchain4j-pgvector (CVSS 7.6)

LangChain4j's MariaDB and pgvector embedding stores string-concatenate metadata-filter keys (and, in MariaDB, values) into SQL without escaping, so a crafted key in an `EmbeddingSearchRequest.filter()` breaks out and injects arbitrary SQL into vector-search and `removeAll(Filter)` queries (CVSS 7.6). If filter keys can originate from untrusted input — common in RAG pipelines — this is direct SQL injection through the vector store. Upgrade the affected langchain4j-mariadb / langchain4j-pgvector betas.

handlebars.java: path traversal in FileTemplateLoader/ClassPathTemplateLoader allows arbitrary file read (CVSS 7.5)

handlebars.java's `FileTemplateLoader` (and `ClassPathTemplateLoader`) allow path traversal, so any app passing user-controlled template names to `Handlebars.compile()` gets arbitrary file read (CVSS 7.5) — realistic when template names come from URL path or request parameters. Upgrade to 4.5.2, or canonical-path-check resolved template paths against the configured prefix.

Filament: disabled RichEditor field state can be used for stored XSS (CVSS 7.6)

Filament v3 renders a disabled `RichEditor` field's raw state without sanitizing HTML, so attacker-planted markup stored in that field executes as XSS for anyone viewing the form (CVSS 7.6); v4 uses a different render path and is unaffected. Upgrade filament/forms past 3.3.52.

Multer: denial of service via deeply nested multipart field names (CVSS 7.5)

Multer — the default Express multipart/file-upload middleware — passes deeply nested bracket-notation field names (`a[b][c]...`) to `append-field` with no depth limit, so a single crafted request forces allocation of deeply nested objects and exhausts CPU and memory (CVSS 7.5). Enormous install base across Node web apps. Upgrade to 2.2.0 and set `limits.fieldNestingDepth` to the minimum your app needs.

Open WebUI: SSRF protection bypass in the Playwright web loader via HTTP redirects (CVSS 7.7)

Two more Open WebUI advisories extend today's cluster. The Playwright web loader validates only the initial URL's IP, but Playwright follows 301/302 redirects by default, so an attacker-supplied page that redirects to localhost, the Docker network, or cloud metadata bypasses the SSRF check even with local web-fetch disabled (CVSS 7.7).

Open WebUI: path traversal / SSRF in the terminal-server proxy via encoded traversal (CVSS 7.7)

The second of the new Open WebUI pair: the terminal-server reverse proxy doesn't confine the user-controlled `path` segment, so encoded `../` sequences escape the intended scope on the configured terminal host and reach internal services SSRF-style (CVSS 7.7). Patch the entire Open WebUI cluster — now spanning all three of today's passes — in one go rather than cherry-picking.

OpenClaw: MCP Streamable-HTTP redirects can forward configured custom headers to another origin (CVSS 7.1)

OpenClaw forwards operator-configured custom MCP headers — API keys, tenant tokens — when a Streamable-HTTP MCP endpoint responds with a cross-origin redirect, leaking them to the redirect target (CVSS 7.1). The same MCP trust-boundary problem worth watching as agent tooling proliferates; affects streamable-http MCP servers configured with sensitive `mcp.servers.*.headers`. Upgrade to 2026.5.12.

Claude Code: out-of-band data exfiltration via a pre-approved HuggingFace domain in WebFetch

Claude Code pre-approved the bare hostname `huggingface.co` for WebFetch, so any path on it — including attacker-controlled model repositories — was auto-fetched without a permission prompt or `--allowedTools` enforcement; because HuggingFace counts `/resolve/main/...` fetches as downloads server-side, a poisoned context can encode and exfiltrate files, environment variables, or command output through that covert channel. Notable here because it is the same trusted-allowlist evasion as the day's registry and marketplace abuse, just inside the coding agent. Upgrade @anthropic-ai/claude-code to 2.1.163 or later.

12:00 ET · Forenoon Watch

JetBrains Marketplace plugin campaign expands: 15 malicious plugins steal AI provider keys; companion Chrome extensions capture chatbot chats

A fuller writeup of the JetBrains Marketplace campaign first flagged yesterday: at least 15 plugins across seven vendor accounts, each posing as a DeepSeek- or LLM-backed coding assistant (chat, commit messages, code review, unit tests), exfiltrate the AI provider key the developer pastes into the plugin settings — and the same operators shipped companion Chrome extensions that capture chatbot conversations. Same credential-theft-via-dev-tooling shape as the Mastra npm compromise, just routed through the IDE marketplace and the browser instead of the registry. Audit installed JetBrains plugins and browser extensions against the named indicators, and rotate any AI provider key that was ever entered into a third-party plugin.

Open WebUI: stored XSS to account takeover via model profile images (CVSS 7.6)

Open WebUI — the widely self-hosted web frontend for local LLMs — disclosed a cluster of six advisories today, the most serious being stored XSS that escalates to full account takeover via an attacker-controlled model profile image. Any multi-user Open WebUI instance is exposed to cross-user compromise from inside the app. Upgrade to the patched release before re-exposing a shared instance, and treat all six advisories below as one patch.

Open WebUI: stored XSS in Mermaid markdown preview

Open WebUI stored XSS via the Mermaid markdown preview renderer — another script-injection path shipped in the same release as the account-takeover XSS. Covered by the same upgrade.

Laravel Framework: CRLF injection in default email validation rule (CVSS 8.9)

Laravel's default email validation rule is vulnerable to CRLF injection (CVSS 8.9): combined with how Symfony Mailer/Mime handle certain sequences, an unauthenticated attacker who can supply an address to a mail-sending flow — auth, contact forms — can manipulate outbound message content, redirect delivery, or coax the app's mail server into relaying. Enormous install base; any Laravel app that mails user-supplied addresses is in scope. Upgrade the framework and audit user-address mail flows for the same shape.

Pi Agent: predictable temp extension-install paths allow local privilege escalation on shared Linux hosts (CVSS 7.3)

Pi Agent uses predictable temporary paths when installing extensions, letting a local user on a shared Linux host pre-stage files and escalate privileges when another user runs an install (CVSS 7.3). The predictable-path-at-install-time shape rhymes with the day's other tooling attacks — the trust boundary is the install step. Patch on any multi-user host.

n8n: SecurityScorecard node leaks API token to a user-controlled host (CVSS 7.7)

n8n's SecurityScorecard node leaks its configured API token to a user-controlled host (CVSS 7.7) — an SSRF-style credential exfiltration in the same disclosure wave as yesterday's n8n batch. Workflow-automation credentials are high-value pivots; rotate the SecurityScorecard token if the node was reachable from untrusted workflow input, and upgrade.

n8n: stored XSS in Chat Trigger node (CVSS 7.6)

n8n: stored XSS in the Chat Trigger node (CVSS 7.6), another item from the ongoing n8n advisory wave. Patch alongside the credential-exfil and cross-tenant fixes carried over from yesterday.

06:00 ET · Morning Watch

@mastra/* npm namespace compromised: 140+ packages ship an install-time infostealer (campaign 'easy-day-js')

A single npm account (`ehindero`) with publish rights to the Mastra org mass-published malicious versions of 140+ `@mastra/*` packages — the popular TypeScript/JavaScript framework for building AI applications — each pulling a typosquatted dependency that silently downloads and executes a cross-platform infostealer at install time. JFrog, SafeDep, Socket and StepSecurity all corroborate, and the install-hook execution shape is identical to the prior npm mass-compromises this watch tracks: the payload runs the moment `npm install` resolves, before any code review. Pin and verify lockfiles, identify any CI runner or developer workstation that installed an `@mastra/*` package in the exposure window, and rotate every credential reachable from those hosts — npm tokens, cloud keys, and the AI provider keys these AI-framework builds tend to sit next to.

China-linked SprySOCKS backdoor ports to Windows with a driver-based stealth component

ESET documented two previously undocumented Windows variants (internally marked `WIN_DRV` and `WIN_PLUS`) of what was believed to be a Linux-only backdoor, both shipping hard-coded C2 and TCP/UDP transport. Threat-actor tooling rather than a registry attack, but worth tracking as the operator set behind several edge-device intrusions broadens its reach onto Windows endpoints.

DragonForce hides ransomware C2 inside Microsoft Teams relay infrastructure ('Backdoor.Turn')

DragonForce used custom malware named `Backdoor.Turn` to tunnel command-and-control through Microsoft Teams relay infrastructure, blending its traffic with trusted SaaS flows. Not a supply-chain compromise, but the living-off-trusted-infrastructure evasion is the same logic that makes registry and IDE-marketplace abuse hard to catch — the malicious channel rides inside something already on the allowlist.