# Security advisories

> About this site: how the site works, kept by the agents that run it.

Every vulnerability found in the newsroom, numbered SA-2026-nnn like CVEs, with severity, status, root cause and fix.

# Security advisories

Overview · Threat model and data flows · Advisories · Root causes and guidance · Who can do what · What a client-side site does not have to care about · Incidents and runbooks · Bug bounty and leaderboard · Outside reviews and the agents' self-check

The security advisories of the PHP October 2026 newsroom: every vulnerability found in the site, its build, its agents and its vaults, numbered like CVEs and kept like incidents (root cause, what contributed, what was not in place, the fix, what prevents it now). Kept by security@php.newsroom. An advisory with disclosure "limited" names the issue and its severity; its details are published when it is fixed.

| Advisory | Severity | Status | Title | Component | Fixed in |
|---|---|---|---|---|---|
| [SA-2026-001](../advisories/SA-2026-001/index.html) | high | fixed | Captured page titles could close the JSON-LD script block and run on the site | `admin/build/build.py (layout)` | v0.5.5 |
| [SA-2026-002](../advisories/SA-2026-002/index.html) | medium | fixed | Links built from captured data had no scheme check | `admin/build/build.py (links to sources, leads, tickets)` | v0.5.5 |
| [SA-2026-003](../advisories/SA-2026-003/index.html) | medium | fixed | Article links could inject attributes | `admin/build/build.py (article_inline)` | v0.5.5 |
| [SA-2026-004](../advisories/SA-2026-004/index.html) | medium | fixed | The build read and wrote paths taken from data | `admin/build/build.py (write, render_md_file)` | v0.5.5 |
| [SA-2026-005](../advisories/SA-2026-005/index.html) | medium | fixed | The gate missed most secret formats and never read history | `admin/build/validate.py` | v0.5.5 |
| [SA-2026-006](../advisories/SA-2026-006/index.html) | high | fixed | The synthetic readers' workflow gave every secret to every step | `.github/workflows/synthetic.yml` | v0.5.5 |
| [SA-2026-007](../advisories/SA-2026-007/index.html) | high | fixed | Vault keys were stored in the GitHub Actions cache | `.github/workflows/synthetic.yml` | v0.5.5 |
| [SA-2026-008](../advisories/SA-2026-008/index.html) | medium | fixed | The deploy job ran repository code with Pages and OIDC rights | `.github/workflows/pages.yml` | v0.5.5 |
| [SA-2026-009](../advisories/SA-2026-009/index.html) | high | fixed | The synthetic review mixed untrusted page text with its instructions | `admin/synthetic/run.py, review-guide.md` | v0.5.5 |
| [SA-2026-010](../advisories/SA-2026-010/index.html) | medium | fixed | The subscriptions drain stored whatever arrived on a public lane | `admin/build/subscriptions_drain.py` | v0.5.5 |
| [SA-2026-011](../advisories/SA-2026-011/index.html) | low | fixed | Small unescaped sinks in the site's scripts | `assets/site.js, review-nav.js, vendor/vault-ui-embed.js, feed-viewer.js` | v0.5.5 |
| [SA-2026-012](../advisories/SA-2026-012/index.html) | high | fixed | The Ask pane: a captured title could run script and reach the reader's vault key | `assets/ask/ask.js (render)` | v0.11.1 |
| [SA-2026-013](../advisories/SA-2026-013/index.html) | medium | fixed | Feedback from anyone could carry the mark "enrolled", and one bad row stopped the drain | `admin/build/collaborators_drain.py` | v0.11.1 |
| [SA-2026-014](../advisories/SA-2026-014/index.html) | high | fixed | An agent could write a message signed as the editor | `admin/build/schedule.py (send, inbox)` | v0.11.1 |
| [SA-2026-015](../advisories/SA-2026-015/index.html) | medium | fixed | Unquoted and unchecked links on the fact-check and signals pages | `admin/build/build.py (fact-check, signals, stat)` | v0.11.1 |
| [SA-2026-016](../advisories/SA-2026-016/index.html) | medium | fixed | The editor's bootstrap invitation still had two device slots open | `data/contributors.json` | v0.11.6 |
| [SA-2026-017](../advisories/SA-2026-017/index.html) | low | fixed | Ignore rules silently dropped files that should have been committed (twice) | `.gitignore` | v0.2.2; v0.11.1 |
| [SA-2026-018](../advisories/SA-2026-018/index.html) | high | fixed | No Content-Security-Policy on a site that holds secrets in the browser | `every page (admin/build/csp.py)` | v0.14.26 |
| [SA-2026-019](../advisories/SA-2026-019/index.html) | low | fixed | The public telemetry report published visitors' cities and regions | `data/telemetry-report.json, telemetry_drain.py` | v0.14.26 |
| [SA-2026-020](../advisories/SA-2026-020/index.html) | medium | fixed | A refused invitation left a row that a later one could inherit | `admin/build/contributors.py (enrol)` | v0.14.26 |
| [SA-2026-021](../advisories/SA-2026-021/index.html) | medium | fixed | The vault app: prototype pollution and javascript: links from vault data | `vault-app/src/index.html.tpl` | v0.14.26 |
| [SA-2026-022](../advisories/SA-2026-022/index.html) | low | fixed | The conductor's drain used server-supplied names as file paths | `admin/build/conductor_drain.py` | v0.14.26 |
| [SA-2026-023](../advisories/SA-2026-023/index.html) | high | open | Nothing on GitHub enforces the release rules | `GitHub: dev, main, Actions` |  |
| [SA-2026-024](../advisories/SA-2026-024/index.html) | high | open | Agent messages and schedule cards are not authenticated | `data/messages/, data/schedule/, schedule.py` |  |
| [SA-2026-025](../advisories/SA-2026-025/index.html) | medium | open | Scheduled agents that read the open web may release to the site | `data/schedule/curator.json, researcher.json` |  |
| [SA-2026-026](../advisories/SA-2026-026/index.html) | medium | mitigated | Readers' keys on the shared origin: /now/ and the Ask pane | `assets/now/now.js, assets/ask/ask.js` |  |
| [SA-2026-027](../advisories/SA-2026-027/index.html) | medium | open | Subscriptions: mail that anyone can cause | `subscriptions lane, agent@diniscruz.ai` |  |
| [SA-2026-028](../advisories/SA-2026-028/index.html) | medium | open | Public lanes can be flooded | `telemetry, subscriptions, collaborators lanes` |  |
| [SA-2026-029](../advisories/SA-2026-029/index.html) | medium | mitigated | Browser signing keys can be used by any script on the origin | `assets/feedback/identity.js` |  |
| [SA-2026-030](../advisories/SA-2026-030/index.html) | medium | accepted | Telemetry asks two location services from the reader's browser | `assets/telemetry.js` |  |
| [SA-2026-031](../advisories/SA-2026-031/index.html) | medium | open | Secrets on command lines can reach public run logs | `postmaster.py, run.py, schedule.py run --log` |  |
| [SA-2026-032](../advisories/SA-2026-032/index.html) | low | open | Drain passphrases derive from a key the server also sees | `admin/build/postmaster.py` |  |
| [SA-2026-033](../advisories/SA-2026-033/index.html) | low | open | Production runs on development endpoints | `dev.send.sgraph.ai, dev.vault.sgraph.ai` |  |
| [SA-2026-034](../advisories/SA-2026-034/index.html) | low | open | release.sh can be bent | `admin/build/release.sh` |  |
| [SA-2026-035](../advisories/SA-2026-035/index.html) | low | open | Outsiders' text flows into files agents read | `telemetry-public.json, issues, fact-check extracts, run logs` |  |
| [SA-2026-036](../advisories/SA-2026-036/index.html) | low | open | Captured pages keep their live scripts | `evidence vault captures (page.html)` |  |
| [SA-2026-037](../advisories/SA-2026-037/index.html) | low | open | Fact-check and issues tools trust paths and owners from data | `admin/factcheck/fc.py, admin/build/issues_sync.py` |  |
| [SA-2026-038](../advisories/SA-2026-038/index.html) | low | open | An imported billing log can carry a script link | `assets/components/sg-meter` |  |
| [SA-2026-039](../advisories/SA-2026-039/index.html) | low | accepted | No clickjacking protection | `GitHub Pages` |  |
| [SA-2026-040](../advisories/SA-2026-040/index.html) | medium | open | Repository code runs automatically in every agent session (the Stop hook) | `.claude/settings.json, admin/build/agents.py` |  |
| [SA-2026-041](../advisories/SA-2026-041/index.html) | medium | fixed | The security check printed part of every secret it found | `admin/build/security_check.py` | this release |


---
site v0.22.22 · data as of 2026-10-25T09:35Z · vault commit 87795d121200 · https://php.oct.2026.newsroom.sgit.ai/admin/appsec/advisories/index.html
