v vanemmerik.ai / SUPPLY-CHAIN
Supply Chain · Watch Tuesday · 21 July 2026 End-of-day synthesis 4 watches · 53 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 single coordinated disclosure dropped 21 Gitea advisories in about two hours — four critical, including a Docker image default that hands any network attacker admin — on top of a KEV day already carrying a live WordPress SQLi-to-RCE chain.

The day opened with CISA's KEV catalog doing the heavy lifting: a two-CVE WordPress Core chain that turns SQL injection into unauthenticated RCE on default installs, Langflow's second RCE-capable KEV entry in two weeks, and a decade-old DD-WRT UPnP overflow getting its first-ever catalog listing. All four landed with three-day due dates — CISA's tell that it has evidence of active exploitation, not just theoretical risk.

Then, starting mid-afternoon, GitHub published 21 new Gitea advisories in about two hours — four critical, seventeen high — the largest single-vendor batch this series has logged for a self-hosted git platform. The sharpest pair: the official Docker image ships REVERSE_PROXY_TRUSTED_PROXIES as a wildcard by default, so any network-reachable attacker can impersonate any user including admin via the X-WEBAUTH-USER header, and a signed-URL HMAC ambiguity in Actions Artifacts v4 lets one repository's Actions runs forge access to another repository's artifacts. The other seventeen cluster into repeating shapes — three separate SSRF findings, three DoS/ReDoS vectors, and a run of stale-permission-cache and access-control leaks across forks, labels, notifications, and LFS objects — that reads like one audit sweep finding the same bug pattern across a dozen features. Separately, GHSA flagged that a prior jackson-core fix for an async-parser number-length DoS was incomplete, closing a gap attackers could exploit by feeding digits in small chunks. The bright spot: Gitea shipped fixes for all 21 issues same-day across three point releases instead of embargoing a slow rollout, and the jackson-core follow-up shows the GHSA ecosystem catching an incomplete fix quickly rather than leaving it quiet.

→ Operational priority for the night patch every internet-facing Gitea instance tonight, starting with the Docker-image trusted-proxy default and the Actions Artifacts HMAC bug, then confirm WordPress is on 7.0.2 before Thursday's KEV due date.

21:00 ET · Last Watch

fast-uri vulnerable to host confusion via literal backslash authority delimiter (CVE-2026-16221)

fast-uri doesn't treat a literal backslash as an authority delimiter, so it extracts a different host than Node's WHATWG URL/fetch() for the same string — http://evil.com\@allowed.com parses as host allowed.com in fast-uri but evil.com in fetch(). Any allowlist, SSRF filter, or redirect check built on fast-uri before handing the URL to fetch() or undici is bypassable, including cloud-metadata and loopback filters. Upgrade to fast-uri 4.1.1 / 3.1.4 / 2.4.3 and audit any code that validates with one URL parser and requests with another.

sharp inherited vulnerabilities in libvips: CVE-2026-33327, CVE-2026-33328, CVE-2026-35590, CVE-2026-35591

sharp's bundled libvips picks up four upstream CVEs, two rated CVSSv4 "High," in image-decoding paths — the classic shape for RCE-via-untrusted-upload in any service that thumbnails or resizes user images. Affects everything prior to sharp 0.35.0. Upgrade sharp and rebuild any container image that vendors the prebuilt binary rather than relying on a cached layer.

fast-xml-parser: Repeated DOCTYPE declarations reset entity expansion limits

fast-xml-parser resets its entity-expansion counters on every DOCTYPE declaration it processes, so a document with many DOCTYPE blocks bypasses maxTotalExpansions/maxExpandedLength entirely — a billion-laughs bypass, not a new primitive. Anything parsing untrusted XML (SOAP endpoints, SAML, RSS ingestion) with this library is exposed to memory-exhaustion DoS; patch and re-test any XML DoS mitigations that assumed the limits held.

gRPC-Go: xDS RBAC and HTTP/2 Vulnerabilities

gRPC-Go's xDS RBAC engine fails open when translating policies that use Metadata or RequestedServerName fields, plus a separate HTTP/2 transport bug adds a DoS vector. If you run gRPC-Go behind an xDS control plane (Istio, Envoy-managed mesh) for authorization, this is a fail-open bug in the authz layer itself, not just a crash — patch before trusting RBAC policies that reference those fields.

GitPython: Environment-variable exfiltration via os.path.expandvars() on Repo.clone_from() URL

Repo.clone_from() runs the caller-supplied remote URL through os.path.expandvars() before handing it to git clone, so a URL containing $ENV_VAR syntax gets expanded and can leak host environment variables — credentials, tokens — into the clone. That's exactly the "import repo from URL" pattern used by CI servers, git-hosting mirrors, and dependency scanners. Audit anything that clones attacker-supplied URLs with GitPython and patch now; it's a supply-chain-adjacent primitive sitting right next to tonight's Gitea batch.

Gitea: SSRF via Migration Asset Downloads Bypasses hostmatcher — Reads Internal Files and Cloud Metadata (CVE-2026-59765)

Three Gitea code paths use raw http.Get() instead of the SSRF-protected hostmatcher.NewDialContext() dialer, so migration asset downloads can reach internal services and read local files via file://, undermining Gitea's otherwise-solid SSRF protections. Same disclosure batch as tonight's story-of-the-day — patch alongside the other 21 Gitea advisories rather than triaging separately.

Gitea SSH Key Parser Denial of Service (CVE-2026-56657)

Gitea's RFC 4716 SSH key normalizer runs an O(N²) string-concatenation loop with no input-size cap, so any authenticated user can submit an oversized key and burn CPU quadratically. Low bar to trigger — patch alongside the rest of tonight's Gitea batch rather than waiting.

Gitea: Public-Only Personal access tokens scope bypass in Organization and Permission Endpoints (CVE-2026-58429)

Public-only-scoped personal access tokens can still pull private org membership and permission details through the org-listing endpoints — the scope restriction isn't enforced consistently across every read path. Same root pattern as the day's other Gitea authorization bugs; if you rely on public-only tokens as a privilege boundary, treat them as leaking private org membership until patched.

Gitea: Cross-Repo Information Disclosure via Org-Level Actions Run/Job APIs (CVE-2026-57897)

Org-level Actions run/job API endpoints don't scope results to the requesting user's actual repo access, letting a member of one repo see CI run and job metadata from other repos in the same org. Classic broken object-property-level authorization; audit org Actions logs for anomalous cross-repo access once patched.

Gitea: Public-only API token restriction is not enforced on team API routes (CVE-2026-58431)

Same public-only-token enforcement gap as the org-permission bug above, this time on /api/v1/teams/{id} routes, which return private team repo metadata and activity feeds to a token that should be public-only. Third instance of the same "public-only doesn't mean public-only" bug class in tonight's batch — grep your own Gitea integrations for reliance on that scope as a boundary.

Gitea: ClearRepoWatches fix not applied to API EditRepo path (CVE-2026-58510)

A prior fix for stale repo-watch notifications on public→private transitions was wired into the web UI path but not the API EditRepo path, so users who lost access can still get notified via the API route. Another incomplete-fix sibling from tonight's batch — same lesson as the /members bug above.

TypeORM: migration:generate template-literal code injection

typeorm migration:generate escapes backticks but not ${...} when embedding schema metadata into generated JS/TS template literals, so anyone who can write column comments, defaults, or view definitions gets arbitrary code execution when the generated migration runs. Relevant if you generate migrations against a database where schema metadata isn't fully trusted — multi-tenant DBs, shared dev instances.

jackson-databind: @JsonView bypassed for @JsonUnwrapped container properties on deserialization

jackson-databind's UnwrappedPropertyHandler deserializes @JsonUnwrapped properties without the @JsonView visibility guard that sibling code paths already got in a prior fix (GHSA-rcqc-6cw3-h962), so fields meant to be hidden by view can still be bound from untrusted input. If you use @JsonView as a security boundary on unwrapped properties, treat it as unenforced until patched.

Loofah: SVG href attribute bypasses local-reference restriction

Loofah's SVG sanitizer restricted xlink:href but not the plain href attribute SVG 2 also accepts, so <use> and similar elements can reference arbitrary external documents instead of only local, same-document ones. Rails' html-sanitizer mirrors this exact logic and inherits the bug — patch rails-html-sanitizer alongside Loofah if you use its sanitizer helpers.

Rails HTML Sanitizers: Possible XSS vulnerability with certain configurations

rails-html-sanitizer mirrors the same SVG local-reference logic that's broken in Loofah (GHSA-9wjq-cp2p-hrgf), so apps that allow SVG <use> elements through Rails' sanitizer inherit the same external-reference XSS. Patch rails-html-sanitizer alongside Loofah — they share the vulnerable code path.

Node.js Adapter for Hono: Unauthenticated memory-leak DoS via aborted WebSocket handshake

A WebSocket upgrade request with a missing or malformed Sec-WebSocket-Key header leaks memory permanently in @hono/node-server — the IncomingMessage is retained and a pending promise never settles, and the route is reachable pre-handshake with no auth. An unauthenticated attacker can flood this to exhaust memory; patch before exposing WebSocket upgrade routes built on this adapter.

Gitea: Webhook Authorization Header Returned in Plaintext via API (CVE-2026-58511)

Gitea's ToHook() API response decrypts and returns webhook Authorization headers in plaintext, so any repo admin can read Bearer tokens or Basic-auth credentials another admin configured on a webhook. Rotate any webhook credentials configured by other admins on affected instances once patched.

Loofah allowed_uri? does not detect javascript: URIs split by numeric character references without semicolons

allowed_uri? fails to catch javascript: or vbscript: URIs when the scheme is split by a numeric character reference with no trailing semicolon — browsers decode and execute it, Loofah reports it safe. This is a bypass of an earlier fix (GHSA-46fp-8f5p-pf2m) for the same bug class; if you sanitize user HTML with Loofah, re-test XSS payloads against this specific variant.

18:00 ET · First Watch

Gitea Docker image: REVERSE_PROXY_TRUSTED_PROXIES=* default lets any source IP impersonate any user (CVE-2026-20896)

Gitea's official Docker image ships REVERSE_PROXY_TRUSTED_PROXIES set to a wildcard by default, so the reverse-proxy auth header X-WEBAUTH-USER is trusted from any source IP, not just the intended proxy — letting an unauthenticated network attacker log in as any user including admin. This is the worst shape in today's Gitea batch: a container default, not a code bug, so image consumers who never touched the config are exposed. Set REVERSE_PROXY_TRUSTED_PROXIES explicitly and upgrade to 1.26.3; audit auth logs for X-WEBAUTH-USER logins you didn't expect.

Gitea: Incomplete SSRF Protection in Webhook and Migration Allow-list Default Filter (CVE-2026-22874)

Gitea's webhook and repository-migration allow-list filter has gaps that let a crafted target bypass the SSRF block list entirely, giving an authenticated low-privilege user a path to make Gitea's server issue requests to internal-only addresses. Combined with the trusted-proxy bug above, an attacker who lands any account can pivot to internal network reconnaissance. Upgrade to 1.26.3 and re-verify your webhook allow-list config isn't relying on the built-in filter alone.

Gitea Actions Artifacts V4 signed URL HMAC ambiguity allows cross-repository artifact read and cross-task upload-state write (CVE-2026-58426)

An HMAC canonicalization ambiguity in Gitea Actions' v4 artifact signed URLs lets an attacker with access to one repository's Actions runs forge a signature valid for a different repository's artifacts — reading private build outputs cross-repo and writing upload state into someone else's in-progress task. If you run Gitea Actions with private repos on shared infrastructure, this is a real cross-tenant boundary break. Patch to 1.26.2 and rotate any artifact-signing keys if you suspect exposure.

Gitea: Public-only repository tokens can update private PR head branches (CVE-2026-58443)

A token scoped to public-repo access only should not be able to touch a private repository's pull-request head branch, but Gitea's authorization check misses this path — letting a public-scoped token push commits into a private repo's open PR. Treat any narrowly-scoped Gitea access token as effectively broader than documented until you're on 1.27.0; audit PR history on private repos for commits from unexpected token-bound accounts.

Gitea: Permanent Fork PR Workflow Approval Gate Bypass (CVE-2026-58424)

A forked-repo pull request workflow's required-approval gate is checked once and then treated as permanently satisfied even after new commits land, letting an attacker add malicious commits post-approval that Actions then runs with elevated permissions. Re-approve-on-push is a common CI/CD control gap; verify Gitea Actions workflows requiring approval also re-check after push, and patch to 1.26.3.

Gitea: Cached Per-Branch Permission Check in Pre-Receive Hook Allows Full Repository Write (CVE-2026-27775)

Gitea's pre-receive hook caches a per-branch permission check that goes stale after a branch protection rule changes, so a user who just lost write access to a specific branch can still push if the cache hasn't expired — effectively full repository write for a window. Restart or clear any long-lived Gitea permission caches after tightening branch protection, and patch to 1.26.3.

Gitea: OAuth2 sign-in reactivates administrator-deactivated account (incomplete fix of #38009) (CVE-2026-55987)

This is an incomplete fix of a prior bug: signing in via OAuth2 on an auth source without refresh tokens still reactivates an account an administrator explicitly deactivated. If you disabled a user for cause, confirm they're actually locked out post-patch — the earlier advisory's fix didn't cover this path. Upgrade to 1.27.0.

Gitea: Two SSRF findings (CVE-2026-58314)

A second, separate pair of SSRF findings in Gitea (distinct from the critical webhook/migration allow-list bug above) lets an authenticated user drive server-side requests to attacker-chosen internal targets. That's the third and fourth SSRF-flavored bug in this single disclosure batch — if Gitea sits inside a network with access to metadata endpoints or internal services, prioritize this alongside the critical SSRF fix. Patch to 1.27.0.

Gitea: LFS authentication bypass via malformed SSH sub-verb allows unauthorized read access to private repositories (CVE-2026-58423)

A malformed SSH sub-verb in Gitea's Git LFS handling skips the normal auth check, letting an unauthenticated or under-privileged SSH client read LFS objects from private repositories. If you serve LFS over SSH, patch to 1.26.3 and check LFS access logs for the sub-verb pattern described in the advisory.

Gitea: Internal API HTTP client hardcodes InsecureSkipVerify:true with no config override (CVE-2026-54481)

Gitea's internal-API HTTP client hardcodes Go's InsecureSkipVerify: true with no way to turn it off, so TLS certificate validation between internal Gitea components is silently disabled regardless of your config. Anyone on the same network segment as that internal API traffic can MITM it; this is a design bug, not a one-line patch, so check the 1.27.0 release notes for how it's actually addressed before assuming a version bump alone fixes it.

Gitea: Fork Synchronization Continues After Parent Repository Changes from Public to Private (CVE-2026-24451)

When a parent repository flips from public to private, Gitea keeps syncing forks anyway, which can leak newly-private commits into forks still owned by users who shouldn't have visibility. If you've ever made a repo private after the fact, check its forks for content added post-privacy-change; patch to 1.26.3.

Gitea: Unauthenticated ReDoS via CODEOWNERS pattern matching allows denial of service (CVE-2026-58421)

A crafted CODEOWNERS file pattern drives Gitea's matching regex into catastrophic backtracking, and the check runs pre-auth on incoming pushes — a classic unauthenticated ReDoS. No exploit sophistication needed beyond a malicious or compromised repo's CODEOWNERS file; patch to a fixed release rather than relying on request timeouts alone.

Gitea: ParseAcceptLanguage quadratic-time DoS via Locale middleware on unauthenticated requests (CVE-2026-58436)

Same ReDoS shape one layer down the stack: Gitea's locale middleware parses the Accept-Language header with quadratic-time behavior, reachable pre-auth on every request. Combined with the CODEOWNERS ReDoS above, that's two independent unauthenticated DoS vectors in one disclosure batch — patch to 1.27.0 rather than trying to filter both headers at a WAF.

Gitea: Unauthorized Access to Labels of Private Organizations (CVE-2026-25038)

Gitea leaks label metadata belonging to private organizations to users who shouldn't have visibility into them. Low-impact information disclosure on its own, but another entry in a pattern of private/public boundary bugs across today's batch — patch to 1.26.3.

Gitea: Notification API leaks private issue metadata after access revocation (CVE-2026-58419)

After a user's access to a repository is revoked, Gitea's notification API keeps surfacing metadata from private issues they can no longer see directly — a stale-cache-shaped access-control gap, same family as the fork-sync and label bugs above. Audit whether removed collaborators retained visibility via notifications; patch to 1.26.3.

Gitea: Repository Visibility Manipulation via Git Push Options (CVE-2026-58437)

Git push options — normally used for things like CI skip flags — can be abused in Gitea to flip a repository's visibility setting, letting a user with push access make a private repo public (or vice versa) without going through the UI's visibility controls. Review recent visibility changes on sensitive repos for ones that didn't originate from an admin action; patch to 1.27.0.

Gitea: Git LFS object reuse allows non-Code access to authorize private source objects (CVE-2026-28740)

Gitea's LFS object storage is content-addressed and shared, so a user with only non-Code access (e.g., Issues-only) to a repo can request an LFS object hash that happens to match a private source file elsewhere and retrieve it without ever holding Code permission. This dedup-vs-authorization tension shows up in most content-addressed storage systems; patch to 1.26.3 and don't assume LFS access implies the same boundary as Code access.

Gitea: TOTP TOCTOU race on web 2FA paths + missing replay check on Basic-Auth X-Gitea-OTP surface (CVE-2026-20779)

Two 2FA weaknesses bundled in one advisory: a time-of-check-to-time-of-use race on the web TOTP verification path, and a missing replay check on the separate Basic-Auth X-Gitea-OTP header surface, meaning a captured or guessed OTP can potentially be reused or raced past the one-time-use guarantee. If you rely on Gitea's 2FA as a hard control for admin accounts, patch to 1.26.3 rather than treating 2FA as sufficient in the interim.

Gitea: Denial of Service (CPU & Memory Exhaustion) via O(N^2) String Concatenation in Debian Package Upload (CVE-2026-56755)

Uploading a crafted Debian package to Gitea's package registry triggers O(n²) string concatenation, exhausting CPU and memory on the server processing it — the third DoS vector in today's batch, this one gated behind package-upload permission rather than fully unauthenticated. If you run Gitea's package registry with Debian package support enabled, patch to 1.27.0 before exposing it broadly.

jackson-core: Async parser maxNumberLength bypass via chunked digit accumulation (incomplete fix for GHSA-72hv-8253-57qq)

jackson-core's async (non-blocking) parser can be fed digits in small chunks that individually stay under maxNumberLength but accumulate past it before the check fires, bypassing the numeric-length DoS guard a previous advisory was supposed to close. If you rely on maxNumberLength to bound untrusted JSON number parsing — anyone accepting attacker-controlled JSON over a streaming/async Jackson parser — this is the second bite at the same bug; confirm you're on a version past 2.18.8/2.21.4/2.22.1 rather than assuming the earlier patch covers you.

Tyro's CISO on developer trust as a finite resource security controls keep spending

Tyro CISO Arun Singh argues that technical correctness matters less than whether developers trust security controls enough not to route around them — timely framing given today's back-to-back Gitea and jackson-core disclosure batches, since patch fatigue from stacked advisories is exactly what erodes that trust. No new incident here, just useful context for how you frame today's patch list internally.

12:00 ET · Forenoon Watch

CISA KEV adds WordPress Core SQL injection (CVE-2026-60137) - chains to RCE

WordPress Core's SQL injection flaw lets untrusted plugin/theme input reach a raw query parameter, and CISA's own advisory flags it as chainable with CVE-2026-63030 below into unauthenticated RCE on default WordPress installations. WordPress 7.0.2 already ships the fix for both halves of the chain. Patch to 7.0.2 now — don't wait for the later 08-04 due date on this half, since the paired bug is due in three days.

CISA KEV adds WordPress Core interpretation-conflict bug (CVE-2026-63030) - the RCE half of the chain

This is the second half of today's WordPress Core KEV pair: an interpretation-conflict (CWE-436) bug that, combined with the SQL injection above, turns a SQLi primitive into remote code execution on unpatched default WordPress sites. CISA gave this half a three-day clock instead of the usual two weeks — the tell that they consider the chain live-exploitable rather than theoretical. Confirm every WordPress install is on 7.0.2 before Thursday's due date.

CISA KEV adds Langflow untrusted-control-sphere RCE (CVE-2026-0770)

Langflow's flow-execution engine pulls in functionality from an untrusted control sphere, letting a remote attacker execute arbitrary code — CISA added it to KEV the same day it was disclosed, with a three-day due date. This is Langflow's second KEV entry this cycle (CVE-2026-55255, an authorization bypass, landed 2026-07-08); two independent unauthenticated-adjacent RCE paths into the same product within two weeks is a pattern, not a one-off. Patch to 1.9.0 and reconsider whether Langflow needs to be internet-facing at all.

CISA KEV adds five-year-old DD-WRT UPnP buffer overflow (CVE-2021-27137)

A 2021-disclosed stack buffer overflow in DD-WRT's UPnP handling — unauthenticated, network-reachable, code execution — just landed in KEV for the first time, which usually signals CISA has evidence of active exploitation despite the age. DD-WRT runs as firmware on a long tail of consumer and SMB routers that rarely get patched proactively; if you or a client has DD-WRT devices with UPnP enabled, disable UPnP or confirm firmware is current rather than waiting on a fresh vendor advisory that may not come.

.NET ASP.NET Core Negotiate authentication elevation-of-privilege (CVE-2026-47303)

Improper parsing in ASP.NET Core's Negotiate authentication handler lets an authenticated caller escalate privileges — the listed weaknesses include LDAP injection, so a crafted negotiate token likely reaches an LDAP bind downstream. Affects .NET 8/9/10 via Microsoft.AspNetCore.Authentication.Negotiate; patched in 8.0.29, 9.0.18, 10.0.10. Self-contained deployments need explicit recompile-and-redeploy, not just a runtime patch.

.NET XML encryption denial-of-service (CVE-2026-50527)

Crafted encrypted XML fed to System.Security.Cryptography.Xml's EncryptedXml triggers a stack-based buffer overflow leading to denial of service — same .NET 8/9/10 patch batch as the two .NET entries alongside it. Any service parsing XML-Encryption payloads (SAML consumers are the common case) should update System.Security.Cryptography.Xml to 8.0.29/9.0.18/10.0.10.

WPF elevation-of-privilege via crafted XAML parsing (CVE-2026-50650)

Specially crafted XAML input parsed by Windows Presentation Foundation triggers code injection leading to local privilege escalation — third item in today's .NET security-advisory batch, sharing the same affected ranges and patched builds as the two above. Requires user interaction (opening a malicious XAML file/app), so the practical exposure is desktop WPF apps that load untrusted XAML rather than server workloads; still worth the same 8.0.29/9.0.18/10.0.10 update pass.

Loofah javascript: URI sanitizer bypass via named HTML entities

Loofah's allowed_uri? helper decodes numeric HTML character references but not the named forms &Tab; and &NewLine;, so java&Tab;script:alert(1) is reported as allowed even though browsers decode and strip those characters, reconstituting a working javascript: URI. Only affects code calling the public allowed_uri? helper directly on HTML-encoded strings (Rails Action Text's markdown link validation is the flagged example) — Loofah's default sanitize() path is unaffected. Upgrade to Loofah >= 2.25.2 if you call allowed_uri? directly.

06:00 ET · Morning Watch

SimpleHelp OIDC Authentication Bypass Vulnerability

SimpleHelp's OIDC login flow accepts identity tokens without verifying their cryptographic signature, so a remote unauthenticated attacker can forge a token with arbitrary claims and land a fully authenticated technician session — in some configurations this also skips MFA. This is a backfilled KEV catalog add from 2026-06-29 that the pipeline missed at the time; SimpleHelp's RMM stack has a history of being a ransomware-precursor foothold, so treat exposed instances as already compromised until you confirm patch level and audit technician session logs back to late June.

PTC Windchill and FlexPLM Improper Input Validation Vulnerability

Improper input validation in PTC Windchill and FlexPLM lets an unauthenticated remote attacker execute arbitrary code with a single crafted request. Backfilled KEV add from 2026-06-25 (due date already passed on 06-28) — if you run either PLM product internet-facing, confirm you're on a patched build now rather than waiting for a fresher-dated headline.

Cisco Unified Communications Manager Server-Side Request Forgery Vulnerability

An SSRF in Cisco Unified CM and Unified CM SME lets an unauthenticated remote attacker write files to the underlying OS, which chains to root. Another backfilled catalog add (date_added 2026-06-25, due 06-28) that never made a prior watch — UC clusters are rarely patched off-cycle, so check yours explicitly rather than assuming it rode a routine maintenance window.