66 lines
5.8 KiB
Markdown
66 lines
5.8 KiB
Markdown
# SPIKE — which security-notice sources work (security watch, R-1303), 2026-10-26 evening
|
||
|
||
Measured from DooPlex (the CI runner is a k3s pod on DooPlex with the same egress; its own reach is proven by the live
|
||
run, `LIVE.md`). Raw answers: `raw/`.
|
||
|
||
## The controls
|
||
|
||
| Control | What it is | Our pin |
|
||
|---|---|---|
|
||
| **P1 cloudflared** | Cloudflare's eMudhra notice, 2026-10-20: fixed in 2026.10.2 (image trust store) | was 2026.9.3 (R-1300) |
|
||
| **P2 traefik** | GHSA-fh26-gfpp-7xxx (and 11 more, Oct 2026), fixed v3.7.14–v3.7.16; and the older set, e.g. 81 advisories for v3.1.2 | v3.7.13 |
|
||
| **P3 vaultwarden** | GHSA-wc45-m6pv-rrf9 and five more (2026-10-03), fixed 1.37.0 | 1.37.4 |
|
||
| **P4 immich** | GHSA-q89f-h332-8q2h (2026-09-28, high: SVG upload → RCE), fixed v3.2.4 | v3.2.4 |
|
||
| **P5 nextcloud** | advisories published in `nextcloud/security-advisories` (not in `nextcloud/server`) | 34.0.4 |
|
||
| **P6 Go builder** | GO-2026-6809 (R-972), fixed in Go 1.27.3 | golang 1.27.3 |
|
||
| **N negative** | vaultwarden 1.37.4 vs its advisories; traefik v3.7.16 vs GHSA-hrpp (≤ v3.7.15); Go 1.27.3 | — |
|
||
|
||
## The table
|
||
|
||
| Source | P1 cloudflared | P2 traefik | P3 vaultwarden | P4 immich | P5 nextcloud | P6 Go | Negative | Cost per night | Key |
|
||
|---|---|---|---|---|---|---|---|---|---|
|
||
| **GitHub per-repo security advisories** (`/repos/O/R/security-advisories`) | **no** (only 2 old Windows advisories) | **yes** — 12 affect v3.7.13 | **yes** (6, range ≤ 1.36.0) | **yes** | **yes**, from `nextcloud/security-advisories` (100+, paged) | n/a | **correct** (1.37.4 and v3.7.16 not affected) | 1 request per repo (+1 per 100 more) ≈ 85–90 | 60/hour without a key, **shared by every DooPlex client**; a 304 still counts (measured: 51 → 50). 5000/hour with a key |
|
||
| **OSV.dev** `query` | no (`github.com/cloudflare/cloudflared` at 2026.9.3: 0) | **old only** (v3.1.2: 81; v3.7.13: 0 — none of October's) | no (not a package) | no | no (Packagist `nextcloud/server`: 0) | **yes** (Go 1.27.2 → GO-2026-6809) | **correct** (Go 1.27.3: 0) | 1 POST per Go builder | none |
|
||
| **GitHub global advisories** (`/advisories?affects=`) | no | no (reviewed only; October's are not) | no | no | no | — | — | 1 per item | same as above |
|
||
| **GitHub release feed** (`/O/R/releases.atom`, newest 10, full notes) | no (cloudflared's release body is checksums only) | — | **yes** (1.37.0, 1.37.4 name GHSA ids) | **partly** (v3.3.5 says „security"; v3.2.4 is older than the 10 in the feed) | — | — | — | 1 per repo, **no API quota** (measured: core count unchanged) | none |
|
||
| **cloudflared `RELEASE_NOTES`** (raw file) | **no** for 2026.10.2 (no marker) — but Cloudflare marks security fixes `VULN-` (12 so far, e.g. 2026.10.4 VULN-176088) | — | — | — | — | — | — | 1 | none |
|
||
| **Cloudflare blog feed** (`blog.cloudflare.com/rss/`, full text, ~2 weeks) | **YES** — „8 eMudhra certificates are compromised" (2026-10-20) names cloudflared | — | — | — | — | — | — | 1 | none |
|
||
| **Registry tags** (Docker Hub, ghcr.io anonymous token, `lscr.io` = Docker Hub `linuxserver/*`) | BEHIND only (2026.10.2 existed) | BEHIND only | — | — | — | — | — | 1–3 per image | none |
|
||
|
||
## The choice (the smallest set that catches every positive control)
|
||
|
||
1. **GitHub per-repo security advisories** — catches P2, P3, P4, P5. The primary source.
|
||
2. **Cloudflare blog feed + cloudflared `RELEASE_NOTES` `VULN-` markers** — the only automated way to P1 (the blog);
|
||
`VULN-` catches Cloudflare's other security releases (2026.10.0, 2026.10.4).
|
||
3. **OSV, Go stdlib only** — P6, for the Go builder pins of the controller and the hub.
|
||
4. **GitHub release feeds** — no quota; catches apps that write „security"/CVE/GHSA in their notes but publish no
|
||
advisories (a second net, not a primary).
|
||
5. **Registry tags** — BEHIND, as `check-infra-pins.py` does, for every pin.
|
||
|
||
Dropped: OSV for apps (it found nothing the per-repo advisories did not, and nothing from October), GitHub's global
|
||
advisory search (reviewed advisories only).
|
||
|
||
## What the watch CANNOT see
|
||
|
||
- **A fix announced only by mail, or on a blog we do not read.** P1 is caught only because Cloudflare's blog names
|
||
cloudflared in full text; a vendor that announces in a mail or a forum is invisible.
|
||
- **A security fix nobody calls one** (a base-image or trust-store bump with plain release notes, like cloudflared
|
||
2026.10.2's „bump distroless image"). It shows only as BEHIND (weekly).
|
||
- **Packages inside our own images:** the Alpine/Debian packages in the controller, hub and Samba images (Samba's
|
||
version is whatever Alpine 3.24 ships; Debian's and Alpine's security trackers are not read). BEHIND on the base image's
|
||
point release is the only signal.
|
||
- **Floating tags** (`redis:7-alpine`, `postgres:16-…`, `mariadb:12.3`): there is no exact version to match a range
|
||
against; they are listed as FLOATING, and a pull at install takes the line's newest.
|
||
- **Apps with no GitHub home or no notice practice** (PostgreSQL, MariaDB, Plex, Emby, OnlyOffice's server, the
|
||
linuxserver wrappers): only BEHIND, plus release-feed words where a feed exists.
|
||
- **Without a key:** the advisory lists of the apps are read every second night (about 40 a night), the box programs
|
||
every night. The operator said yes to a key (2026-10-26); until it exists the watch runs in this mode and says so.
|
||
|
||
## Facts measured on the way
|
||
|
||
- Our traefik pin **v3.7.13** is inside 12 advisories of October 2026 (fixed v3.7.14–v3.7.16). Our config uses the
|
||
docker and file providers, no Kubernetes ingress, no FastProxy, no NTLM/Negotiate backend; ForwardAuth goes to the
|
||
controller. None of the 12 seem to apply → **FILED: R-1304** (raise in the next controller release).
|
||
- A Gitea Actions secret cannot be named `GITHUB_…` (Gitea reserves the `GITHUB_` and `GITEA_` prefixes), so the CI
|
||
secret is **`GH_ADVISORY_TOKEN`**, and the same name in CC's store.
|