🧯 The Staff Safety Desk

Thursday, May 14, 2026

7 stories

Generated with AI from public sources. Verify before relying on for decisions.

🎧 Listen to this briefing or subscribe as a podcast →

Today on the desk: the gap between 'it ran' and 'it worked.' Postgres ships eleven CVEs across every supported branch, Supabase RLS turns successful writes into infinite retry loops, and the Mini Shai-Hulud campaign keeps surfacing fresh failure modes β€” including a Composer bug that leaked GitHub tokens to CI logs because a token format change broke validation.

Django & Python Ecosystem

Fedora's Django 5.2.14 advisory expands the BSI list to nine CVEs β€” admin privilege abuse is the one to read first

The BSI advisory you saw two days ago (three CVEs against Django <6.0.5 and <5.2.14) was the floor, not the ceiling. Fedora's May 14 python-django5 5.2.14-1.fc42 push expands the picture to nine distinct CVEs: session fixation via cached pages (CVE-2026-35192), four ASGI file/memory upload DoS bugs, header spoofing, cache data exposure, and β€” new in this list β€” privilege abuse in GenericInlineModelAdmin and list_editable (CVE-2026-4277, CVE-2026-4292) plus a file-permission bug (CVE-2026-25674). Three different attack surfaces, one release.

The BSI framing was information disclosure and DoS; the Fedora list adds privilege abuse in admin interfaces. For a DAO governance portal with delegated staff/admin roles, the admin privilege CVEs are the load-bearing ones β€” list_editable bulk actions and inline admin are exactly where a lower-tier staff user can mutate state they shouldn't see.

Verified across 1 sources: pro-linux.de / Fedora Project

Postgres & Redis Operations

PostgreSQL ships eleven CVEs across 14–18 β€” binary swap, no dump-reload, do it this week

PostgreSQL released 18.4, 17.10, 16.14, 15.18, and 14.23 on May 11 patching eleven vulnerabilities: memory corruption in refint, SQL injection in pg_createsubscriber and REFRESH PUBLICATION, MD5 password timing leak, integer wraparound crashes, and a foreign-key deferrability bug that silently breaks transaction logic without raising. Updates are fully cumulative β€” binary swap and service restart, no pg_upgrade. Version 14 hits EOL November 2026, so 14.23 is your last comfortable migration window.

The deferrability bug is the dangerous one β€” it's an AI-slop-shaped failure mode where the database silently violates a constraint your app assumes is enforced, and nothing logs an error; patch this week and audit any ON COMMIT DEFERRED foreign keys.

Verified across 2 sources: Linux Compatible · Warp2Search

Two days lost to PGRST116: Supabase upsert wrote the row, RLS hid it, client retried forever

A production LMS lost two days to a write-succeeded-but-read-failed bug: an upsert committed, but the chained .select().single() returned PGRST116 because Row-Level Security filtered the row from the returning user's view. The client treated the empty read as a write failure and retried indefinitely. PGRST116 conflates two distinct states β€” actual failure and successful write with filtered visibility.

This is the exact 'success path that lies when upstream actually succeeded' pattern, just inverted β€” and the same shape will appear in any Django app where post-write reads go through accessible_by(user) and the writing user lacks read scope. ELI15: you mailed the letter, but you can't see your own mailbox, so you keep mailing copies forever.

Verified across 1 sources: Dev.to

AI Slop & Review Patterns

CATS framework: a two-week roadmap for absorbing AI-generated PRs without absorbing the slop

The CATS framework β€” Contracts, Automated Verification, Telemetry, Simplification β€” names the gap between AI code velocity and the codebase's capacity to absorb it without silent data divergence. The piece catalogs concrete failure classes (boundary assumptions, concurrency, domain, security) and proposes a two-week implementation arc that doesn't pause feature work: pin contracts at module boundaries, add property-based tests at integration points, instrument the slop-prone surfaces (transactions wrapping external I/O, success toasts, N+1), and refactor as a multiplier rather than a tax.

This is the operating-manual version of the review heuristics you've been building intuition for β€” the contract-at-boundary plus telemetry-on-side-effects pairing directly catches the 'graceful if repo: branch does nothing' shape and the 'tests only assert 200' shape in the same gate.

Verified across 1 sources: lavx.hu

Web App Security Literacy

PraisonAI auth-bypass exploited 3h44m after disclosure because it shipped with AUTH_ENABLED=False

CVE-2026-44338 (CVSS 7.3) in PraisonAI 2.5.6–4.6.33 is the boring kind: the legacy Flask API server defaults AUTH_ENABLED to False, leaving /agents and /chat unauthenticated. Sysdig watched CVE-Detector/1.0 probe the exact endpoint and confirm exploitation via a 200 OK with agent data within three hours forty-four minutes of public disclosure on May 11. Patched in 4.6.34.

The disclosure-to-exploitation window is now measured in single-digit hours for unauthenticated endpoints in AI tooling β€” any internal-facing AI orchestration service you stood up 'just for staff' needs the same scrutiny as a public Django view, including a hard fail on missing auth config rather than a default-permissive fallback.

Verified across 1 sources: The Hacker News

NGINX CVE-2026-42945: 18-year-old heap overflow in rewrite module, CVSS 9.2, public PoC, patch to 1.31.0

A deterministic heap buffer overflow in NGINX's ngx_http_rewrite_module β€” triggered by unnamed PCRE captures combined with question-mark replacement strings β€” enables unauthenticated RCE against versions 0.6.27–1.30.0 and Plus R32–R36. Working PoC is public. The interim mitigation is to replace unnamed captures ($1, $2) with named captures in your nginx config; the real fix is 1.31.0 / 1.30.1. A separate Security Boulevard writeup pairs this with two kernel LPEs to demonstrate an internet-to-root chain with no on-disk forensic trace.

If NGINX sits in front of your Django deployment β€” and it almost certainly does β€” this is a same-week patch with an actively shared exploit, and the named-capture mitigation is a 60-second config edit you can ship before the upgrade window.

Verified across 3 sources: Orca Security · Security Online · Security Boulevard

GitHub Actions & Supply Chain

Composer leaked GitHub tokens to CI logs because a token format change broke validation β€” 2.9.8 patches it

GitHub rolled out a new longer, variable-length token format on April 27. Composer versions before 2.9.8 (and 2.2.28 LTS) rejected the new tokens and printed them verbatim in exception messages to stderr β€” which GitHub Actions then captured in job logs visible to all repository collaborators. GitHub's secret masker didn't catch them because the new format wasn't yet in its pattern set. Fixed within hours of disclosure on May 12. This is a distinct failure mode from the Mini Shai-Hulud pull_request_target cache-poisoning chain: no malicious package required, just a format change and a noisy error handler.

The Mini Shai-Hulud campaign already demonstrated how OIDC tokens and secrets leak through pull_request_target misconfigurations; this is the same category of credential exposure via a completely separate vector β€” a format-assumption in a dependency manager rather than a workflow misconfiguration. The one-line if-guard from yesterday's mitigation writeup doesn't help here: secret masking is a last-resort control, not a primary one, and any tool that hardcodes assumptions about credential format is a future log-leak waiting for upstream to change shape.

Verified across 2 sources: CyberKendra · GBHackers


The Big Picture

The 200 OK lie keeps showing up in different stacks Three independent stories today land on the same failure shape: Supabase RLS returns PGRST116 after a successful write (client retries forever), Composer prints rejected GitHub tokens to stderr (CI logs them), and PraisonAI's /agents endpoint returns 200 with agent data to unauthenticated probes. The HTTP status code is no longer load-bearing β€” explicit attestation after the side effect is.

Patch Tuesday for the dependency tree, not just the OS Postgres ships eleven CVEs across 14–18, Fedora's Django 5.2.14 advisory expands to nine CVEs (session fixation, ASGI DoS, admin privilege abuse), NGINX rewrite module hits CVSS 9.2 with public PoC, and Exim 4.97–4.99.2 has unauthenticated RCE on GnuTLS builds. None of these are exotic β€” they're the boring middle of a Django + Postgres + nginx + SMTP stack.

AI velocity is now a review-and-evidence problem, not a generation problem The CATS framework (Contracts, Automated Verification, Telemetry, Simplification) and the 258-pattern AI security checklist both make the same argument from different angles: the bottleneck isn't writing code, it's absorbing it without silent data divergence. Separately, Akmon's split between observability (dashboards) and evidence (tamper-evident audit records) names a gap that matters for any regulated portal.

What to Expect

2026-05-15 Arbitrum DAO binding vote on transferring 30,765 ETH ($71M) to Aave under Judge Garnett's modified restraining notice
2026-06-01 Cursor admin model/provider blocklist migration deadline
2026-11-01 PostgreSQL 14 end-of-life β€” migration planning window for teams still on 14.x
Ongoing Mini Shai-Hulud worm source code is public with MIT license; expect copycat campaigns weaponizing the pull_request_target + cache poisoning + OIDC memory extraction chain

β€” The Staff Safety Desk

πŸŽ™ Listen as a podcast

Subscribe in your favorite podcast app to get each new briefing delivered automatically as audio.

Apple Podcasts
Library tab β†’ β€’β€’β€’ menu β†’ Follow a Show by URL β†’ paste
Overcast
+ button β†’ Add URL β†’ paste
Pocket Casts
Search bar β†’ paste URL
Castro, AntennaPod, Podcast Addict, Castbox, Podverse, Fountain
Look for Add by URL or paste into search

Spotify isn’t supported yet β€” it only lists shows from its own directory. Let us know if you need it there.