Files
felhom.eu/documentation/audits/security-watch-2026-10-26/SPIKE.md
T

66 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.