v vanemmerik.ai / SUPPLY-CHAIN
Supply Chain · Watch Tuesday · 01 September 2026 End-of-day synthesis 4 watches · 21 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 — A grind of a disclosure day — pnpm, browserslist, MLflow, and Filament all shipped fixes for install- and load-time supply-chain primitives, but no new active campaign or CISA KEV entry landed to go with them.

Thirty-plus GHSA advisories cleared today, and the useful signal clusters around install-time and load-time primitives rather than one blockbuster CVE. NLTK shipped a second, still-incomplete fix for JVM argument injection in its Stanford wrappers; Kirby CMS picked up a third disclosure in two days (system-path exposure in REST API error messages), continuing the pattern from yesterday's upload and path-traversal bugs.

pnpm took the sharpest hits: an untrusted pnpm-workspace.yaml can exfiltrate environment secrets through proxy env-placeholder expansion, and a trust-lockfile install path can plant dependency symlinks outside the project — both textbook install-time supply-chain vectors that ride in config and lockfiles rather than packages. MLflow's pickle-deserialization killswitch turned out not to cover the statsmodels flavor, the same "safety flag isn't a real allowlist" pattern seen in prior mlflow RCEs, and browserslist — a transitive dependency of nearly every JS build — picked up two memory/crash bugs from untrusted stats files. Filament had a bad day for MFA (recovery-code bypass, TOTP reuse, password-validity leak) and league/commonmark disclosed four DoS/XSS bugs in its Attributes extension at once. On the bright side: Socket, Phylum, and CISA KEV all came back with nothing new for today specifically — every KEV entry in the 30-day window was already covered on the day it was added, and no active malicious-package campaign surfaced.

→ Operational priority for the night if you run pnpm in CI against forked PRs or third-party templates, treat pnpm-workspace.yaml and lockfiles as untrusted until you've upgraded — that's the pair with the clearest exploitation path tonight. Queue MLflow, browserslist, and Filament patches for tomorrow's first window if you run any of the three.

18:00 ET · First Watch

NLTK: JVM argument injection bypass in Stanford wrappers, incomplete fix of a prior CVE (CVE-2026-79675)

The fix for a prior JVM argument-injection bug in NLTK's Stanford NLP wrappers (parser, tagger, NER) didn't close the hole for per-call options — an attacker who controls tagger/parser config or input paths can still inject arbitrary JVM flags and reach code execution on the host running the JVM subprocess. This is the second patch attempt at the same code path, so don't trust the changelog alone; if you invoke Stanford wrappers with any user-influenced options, upgrade now and re-audit for the original CVE-2026-12841 pattern too.

NLTK: uncontrolled search path when invoking the Graphviz `dot` binary (CVE-2026-78680)

Same library, same day: NLTK resolves the `dot` binary via PATH instead of an absolute path when rendering parse trees, so a malicious `dot` earlier in PATH executes with the calling process's privileges. Lower severity than the JVM-injection bug above but the same root cause — NLTK trusting ambient environment state — patch both together.

pnpm: environment secrets exfiltrated via env-placeholder expansion in an untrusted pnpm-workspace.yaml

pnpm expands `${ENV_VAR}` placeholders in proxy settings read from `pnpm-workspace.yaml` before validating who wrote the file — clone a repo with a poisoned workspace config and `pnpm install` beacons your environment secrets to an attacker-controlled proxy host. The payload rides in a config file rather than a package, so registry scanning won't catch it; treat any repo-provided `pnpm-workspace.yaml` as untrusted until patched, and check CI pipelines that run `pnpm install` against forked PRs.

pnpm: pacquet trust-lockfile install can create dependency symlinks outside the project

The pacquet-backed trust-lockfile install path resolves dependency symlinks without confining them to the project directory, so a crafted lockfile can plant a symlink pointing outside the workspace — a second install-time primitive from the same subsystem as the secrets-exfiltration bug above. Audit any CI job running `pnpm install --frozen-lockfile` against untrusted lockfiles until patched.

MLflow: MLFLOW_ALLOW_PICKLE_DESERIALIZATION=False bypassed via the statsmodels flavor — RCE from a crafted model artifact

MLflow's pickle-deserialization killswitch doesn't cover the statsmodels model flavor, so loading a crafted model artifact still reaches pickle.load and arbitrary code execution even with the safety flag set. Same shape as prior mlflow.sklearn/mlflow.pytorch pickle CVEs — the flag was never a real allowlist, just a per-flavor patch. If you load models from a registry you don't fully control, pin to the patched release and treat model artifacts as untrusted code.

MySQL2: auth-plugin downgrade to mysql_clear_password leaks plaintext credentials

A malicious or MITM'd MySQL server can force the mysql2 Node.js driver down to the mysql_clear_password auth plugin, sending credentials in plaintext instead of the expected challenge-response exchange — no TLS-stripping required if the client trusts the plugin negotiation. If you connect to MySQL over any untrusted network path, upgrade mysql2 and pin the allowed auth-plugin list explicitly.

nanoid: integer overflow/wraparound weakens ID randomness under certain size inputs (CVE-2026-73086)

nanoid ships in an enormous share of the npm dependency graph as the default random-ID generator; a wraparound bug in the size-calculation path can produce shorter-than-expected or predictable IDs under crafted inputs. Impact depends entirely on what you use nanoid output for — session tokens and password-reset links are the cases that matter. Bump the version and grep for anywhere a nanoid output is treated as unguessable.

browserslist: unbounded memory growth and a crash/prototype-write bug from untrusted stats data (CVE-2026-73089, CVE-2026-73088)

Two browserslist bugs disclosed the same day: unbounded memory growth from a query-result cache with no eviction, and a crash/prototype-write triggered by a malicious browserslist-stats.json custom-stats file. browserslist is a transitive dependency of nearly every JS build — Babel, Autoprefixer, webpack — so the practical exposure is CI/build machines processing a repo-supplied stats file, not runtime. Update the package and treat any repo-provided browserslist-stats.json as untrusted input in shared build infrastructure.

TYPO3 CMS: broken access control in Backend and Install Tool (CVE-2026-19418)

A logic flaw in TYPO3's backend and Install Tool authorization checks lets a lower-privileged or unauthenticated actor reach admin-gated functionality. Patch backend and Install Tool installs promptly — the Install Tool is a well-known post-compromise foothold for CMS attackers.

Filament: a rough day for MFA — recovery-code bypass, reused TOTP codes, and a password-validity leak (CVE-2026-77567, CVE-2026-84306, CVE-2026-84307)

Three Filament (Laravel admin panel) auth advisories landed together: recovery codes can bypass app-based MFA entirely (high), a previously-used TOTP code can still authenticate after a newer one has been submitted (medium), and the login page leaks whether a denied account's password was actually correct (low). None require chaining, but together they meaningfully weaken the MFA guarantee — patch Filament, and if you rely on recovery codes as a fallback, treat them as single-use only after this fix lands.

league/commonmark: four separate DoS/XSS advisories in the Attributes and SmartPunct extensions in one day

GitHub disclosed four league/commonmark bugs at once: two denial-of-service paths via distinctly-named or crafted attributes, a DoS from a SmartPunct/Attributes interaction, and an XSS where the on* event-handler filter is bypassed with a U+000C form-feed character. If you render untrusted Markdown with the Attributes extension enabled anywhere, this is the day to disable it or patch — the XSS bypass is the one that matters if you only fix one.

gRPC-Go: heap memory exhaustion via HTTP/2 DATA frame fragmentation (CVE-2026-84304)

A peer sending HTTP/2 DATA frames in small fragments can force gRPC-Go servers to buffer unbounded memory before the message-size check applies — an OOM-via-slow-drip pattern common to HTTP/2 implementations. gRPC-Go sits under a large share of cloud-native infrastructure; if you terminate gRPC directly from untrusted networks, patch and verify frame-size/flow-control limits exist at the proxy layer too.

pypdf: three resource-exhaustion bugs — outline retrieval, XForm extraction, and tree-object insertion

Three separate pypdf DoS bugs disclosed together, all the same shape: crafted PDF structures (outlines, XForm objects, tree nodes) drive pypdf into long runtimes, large memory use, or an infinite loop. If you parse user-uploaded PDFs server-side, patch synchronously rather than waiting for the next dependency bump — untrusted PDF ingestion is a classic DoS vector and now has three confirmed triggers.

sqlparse: reindentation of tuple lists causes near-quadratic CPU consumption (CVE-2026-84305)

Formatting a crafted SQL statement with sqlparse's reindent option can drive CPU usage close to quadratic in input size. sqlparse sits underneath Django's admin SQL display and various SQL-linting tools, so anywhere you format user-supplied SQL text is a potential DoS surface — patch if you expose SQL reindenting to untrusted input.

Tornado: multipart-parsing memory amplification, plus a reopened cookie-injection fix (CVE-2026-35536 regression)

Tornado's multipart parser builds a full temporary list before checking the max-parts limit, so a crafted multipart body can amplify memory well past the intended cap. Separately, the fix for the earlier cookie-attribute-injection bug (CVE-2026-35536) only covered the primary code path — the legacy case-insensitive **kwargs route into set_cookie reopens it. Patch to the latest point release, not the one that shipped the original CVE-2026-35536 fix; that one's incomplete.

Django REST framework: DATA_UPLOAD_MAX_MEMORY_SIZE bypass and an AdminRenderer data-disclosure bug (CVE-2026-73228, CVE-2026-73229)

DRF's request.data parsing can exceed Django's configured DATA_UPLOAD_MAX_MEMORY_SIZE when handling oversized JSON or urlencoded bodies, undercutting a control teams rely on to cap request-body memory. Separately, AdminRenderer can disclose GET-protected fields when rendering an invalid write request. Patch DRF and re-verify your memory-size ceiling actually holds under the browsable API renderer.

Smarty: SSRF via redirect bypass of trusted_uri using {fetch} (CVE-2026-62993)

Smarty's {fetch} tag validates the initial URL against trusted_uri but doesn't re-validate after a redirect, so a trusted-looking URL that 302s to an internal address slips past the allowlist — classic SSRF-via-redirect. If templates render user-influenced URLs through {fetch}, patch and consider blocking redirects entirely rather than trusting an allowlist that doesn't survive them.

ApostropheCMS: stored XSS via SVG SMIL URI-list scheme-policy bypass in sanitize-html (CVE-2026-84371)

A crafted SVG using SMIL animation attributes bypasses sanitize-html's URI-scheme allowlist inside ApostropheCMS, giving stored XSS in any content field that accepts SVG uploads. Patch sanitize-html and, if you can, drop SVG from allowed upload types until you've confirmed the fix covers your configuration — SVG sanitization bypasses are a recurring bug class for this library.

Kirby CMS: system path exposure from error messages in the REST API (CVE-2026-69127)

Kirby's REST API leaks server filesystem paths in error responses — its third disclosure in two days, after yesterday's chunked-upload permission bypass and media-handler path traversal. None of the three chain together yet, but the pattern (upload handling, path handling, now error handling) suggests Kirby's request-handling layer is under hard scrutiny right now; patch promptly and expect more.

Aikido: 'The dark figure of supply chain detection' — string-based rules miss what behavioral detection catches

Aikido argues signature-based scanners only catch malware that's already been fingerprinted, and that behavioral (execution-time) detection is what actually surfaces novel supply-chain attacks. No new incident here, just a methodology argument — but it's the same detection gap the Socket/Phylum campaigns keep exposing in practice, and a reasonable frame for why those vendors lead on same-day writeups.

12:00 ET · Forenoon Watch