Files
felhom.eu/documentation/audits/security-app-updates-2026-10-27/TRIAGE.md
T

10 KiB
Raw Blame History

Security app updates — the triage (2026-10-27)

Input: the security watch run WITH the GitHub key (local dry run 2026-10-27 ~07:50 UTC, the same code as CI job 2415): 38 pins with open notices — 3 box programs and 35 app pins in 32 apps (the seed's 30 pins were a no-key half; the key read every repo). Each app was read by hand: every GHSA in full, every release body between our pin and the fix, our template's gates and env. Per-app notes, with the tags and ids read: triage-notes/<app>.md (four read-only helper sessions, brief triage-notes/_HELPER-BRIEF.md, the fences in full; checked and merged by CC).

Fleet today (hub /apps, 24 h): four controllers report — Tester 1, demo-hp, demo-felhom, Tester4 — no household. Of the 32 apps only BookStack, Paperless-ngx, PrivateBin, BentoPDF, Docmost, Home Assistant and RomM run on any box.

How a box is exposed: every app has a public HTTPS name through the tunnel. setup_gate closes it to strangers only until the first admin exists; family_gate keeps it behind the household door for good; signup_block refuses the public sign-up path. „Main version" = the first number (the project's major_of); a step inside it goes by the lane only when the notes between pin and target show no file conversion, no new required setting and no removed option.

Lane A — same main version: a security_fix step (Part 2)

# App Pin → TARGET Real / total Worst real (login?) Reachable on a box Id(s) the step carries Fixture State
1 rallly 4.15.3 → 4.16.3 1+3 rel / 1+4 critical RCE (none) yes, after setup GHSA-gmq4-f8j5-8w8q yes pending
2 romm 5.3.1 → 5.4.1 6 / 6 high: unauth WebSocket scan deletes media (none) yes GHSA-722m-w9p2-xv2j, -q7fg-…, -7jw3-…, -9q83-… yes pending
3 code-server 4.129.0 → 4.143.1 (lscr.io) 1 / 1 high: Node Brotli before sign-in (none, inferred) yes, no gate CVE-2026-111497 (Node Oct 2026) no (seed none) pending
4 outline 1.10.1 → 1.12.0 8 / 13 high: unpublished doc keeps its share (none) yes GHSA-rq53-m97j-f2pg, -97vv-…, -w8vg-… yes pending
5 vikunja 2.6.0 → 2.7.1 42 / 45 high (any user; m687 needs the victim's browser) own login (setup+signup gates) GHSA-m687-p538-r5hp, -hq66-…, -5q33-… yes pending
6 homebox 0.26.2 → 0.27.1 14 / 15 high: group takeover (any user) own login; unauth register notices blocked by signup_block GHSA-jm28-2xm3-m6m5 … yes pending
7 n8n 2.42.1 → 2.44.7 12 / 13 high (a workflow builder) own login GHSA-m7gv-…, -mp7q-…, -wvjj-… yes pending
8 privatebin 2.0.6 → 2.1.0 2 / 2 medium: fake pop-up (none) yes, public by design GHSA-w873-3ghv-hmh6 yes pending
9 docmost 0.96.0 → 0.97.0 1 rel / 1 unsure: Node 26 + fastify/socket.io (pre-auth surfaces) yes, after setup CVE-2026-111497 (Node Oct 2026) yes pending
10 grafana 13.2.3 → 13.2.4 1 rel / 5 medium: CVE-2026-15577 (read-only user) own login CVE-2026-15577 yes pending
11 mealie v3.28.0 → v3.29.0 1 / 1 medium (any user, 2+ groups) own login GHSA-99wf-32rc-2767 yes pending
12 audiobookshelf 2.37.1 → 2.37.2 1 rel / 1 Node runtime; low in practice own login CVE-2026-111497 (Node Oct 2026) yes pending
13 bentopdf v2.8.6 → v2.8.10 1+2 rel / 3+2 low known (cx8x, a crafted workflow file); v2.8.10's two GHSAs still private yes, no login by design GHSA-cx8x-7rrr-r9x8, -v77x-…, -qch9-… no (seed none) pending
14 uptime-kuma 2.5.5 → 2.5.8 1 rel / 2+3 admin-only code execution (GHSA-v2p3, unpublished) admin login GHSA-v2p3-6f5h-6hhf yes pending — CAVEAT: 2.5.8 drops TLS on the TCP-port monitor
15 immich v3.2.4 → v3.3.5 (server + ml) 0 GHSA + 1 rel Node + CA bundle runtime only own login CVE-2026-111497 (Node Oct 2026) yes optional — lowest

Lane A′ — same main version but NOT the lane

App Pin → TARGET Why not the lane Path
wishlist v0.67.1 → v0.69.0 critical, no login: /forgot-password returns the reset token in its own response, SMTP or not (PR #818) — but no GHSA/CVE is published, and the lane's authority is a public notice id a NORMAL proven step: bench (fixture exists) + box walk, --write-ladder
bookstack 26.09.1 → 26.09.2 (lscr.io) a real security release (two authorisation leaks between signed-in users) with no CVE/GHSA id a normal proven step (fixture exists), after the lane batch

Lane B — a new main version, or a breaking change inside it (Part 3)

App Pin → TARGET Worst real (login?) Why big Runs on a box today
wanderer v0.20.0 → v0.21.2 (web + db) critical: any remote ActivityPub server overwrites records (none); federation has no off switch new REQUIRED POCKETBASE_PROXY_SECRET on both services; 0.21.1 migration shortens rich text, no downgrade no
jellyfin 10.11.11 → 12.4 critical 6828 (admin after setup); hw73 file read with no login (medium) 10 → 12; DB conversion with no rollback; /emby + legacy auth removed no
gokapi v1.9.6 → v2.2.4 high 3c22 is self-XSS for the only account 1 → 2; user system, no downgrade; our first-boot config seed must be re-captured no
seerr jellyseerr 2.7.3 → ghcr.io/seerr-team/seerr:v3.5.1 high rc4w (stranger registers, Plex setups only), mc6w path traversal → RCE (needs a hostile media server) 2 → 3; new image name; runs as UID 1000 → /app/config chown; config migration no
karakeep 0.33.2 + chrome 151 → 0.34.1 + chrome 154.0.8037.57-r1 high: two CISA-KEV V8 bugs in the crawler's Chromium (--no-sandbox), via content the household saves auth library swap (everyone signed out, e-mails lowercased); chrome rebuilt on full Chrome — memory limit and healthcheck to re-measure no
gitea 1.27.3 → 28.2.0 critical 7cq7 / 6pv5 (any user); c3cr, hf55 need no login 1.28 renamed 28.0.0 — no 1.27.4 exists; 28.0 routes git traffic through a new proxy with egress settings no
paperless-ngx 2.20.15 → 3.3.4 low (2jhj, needs a setting we do not set) — not reachable 2 → 3: encryption + API v1 removed, search index rebuilt YES (4 test boxes) — not urgent
homepage v1.13.2 → v2.7.0 medium; family_gate, only with a hand-written credentialed widget 1 → 2: auth rework no
termix 2.8.0 → 2.9.2 → 26.10.5 high; 7j7m: the login rate limit is bypassed by a spoofed X-Forwarded-For (no login) two hops (2.9 must start once); calendar versions; guacd dropped no
tandoor 2.6.15 → 2.7.2 high: 5f74 XXE file read, 69q3 (any user) 2.7.0 removes settings and an endpoint and rewrites the login pages (our probe path, unsure); 2.7.0/2.7.1 break invite links with sign-up off → straight to 2.7.2 no
sparkyfitness v0.17.3 (both images) medium p8cf (any user), cmmf (a leaked photo URL) no fix named in any release; 0.17 → 1.x is R-785's big step anyway no

No fix exists (Part 4)

App Notice What blocks it in our template Pick
sparkyfitness GHSA-p8cf-g8rv-gvrq (a user overwrites another user's Withings link), GHSA-cmmf-53wf-r5gv (owner-only photos readable by URL) own login (any household account); cmmf needs the full photo URL see PICKS.md
gitea GHSA-rqhx-647v-wx32 (SSRF through a redirect in repository migration; the upstream patch was reverted) own login; migrations are on by default see PICKS.md
karakeep, bentopdf — the watch said „no fixed version"; fixes exist (karakeep-chrome 154/156; bentopdf's two are in the Cloudflare CORS-proxy worker we neither ship nor deploy) none needed

NOT-A-FINDING

App / notice Reason
calcom GHSA-p3f6-52gv-cj7m the project's own GitHub workflow (2024), not the product
calcom GHSA-cpf2-q635-xrwx range is the hosted service / ≤ 3.1.4 (2023); our pin v6.2.0
home-assistant GHSA-jff5-5j3g-vhqc a GitHub Actions advisory (ecosystem actions) of the project's CI, fixed 2023
glance GHSA-r225-jhr6-68cc only when Glance's own login is configured; our seeded config sets none, and family_gate stands in front
dawarich release 1.17.0 the hit is „Node 20 … no longer receives security fixes" — a maintenance swap, not a fix (1.16.0 carries two hardening fixes the watch missed — optional)
immich GHSA-8244-8vpr-vp9c the range is untagged main@<sha> builds; the fix commit is already inside v3.2.4
grafana four GHSAs of 2022/2023 fixed in Grafana 7.5 / 8.x / 9.x years ago; malformed ranges
uptime-kuma GHSA-98hr, GHSA-qjxc rootless image only (we run the normal one); a cloud-metadata issue the project closed as won't-fix
outline 5 SSO / GitLab / cross-team notices our template configures no SSO and no GitLab integration (e-mail link + passkey)
vikunja 3 notices the xgo release toolchain; the Trello/Todoist/MS To Do migrators (off)
gitea GHSA-x4q3-gcj3-m6cf the package is the Actions runner, which we do not ship
termix GHSA-frx8, GHSA-r9gw the Electron desktop client, which we do not ship
paperless-ngx GHSA-c8f3 range 3.0–3.3.2; we run 2.20.15
n8n GHSA-365g-vjw2-grx8 Execute Command is left out by default in 2.x, and our compose keeps that default
wishlist v0.68.0 nodemailer (GHSA-6vj9-mwq6-2f5v) needs several SMTPS transports in one process; one transport, and we set no SMTP

Box programs (Part 5)

Program Pin → TARGET Real Breaking (notes read)
traefik v3.7.13 → v3.7.16 12 notices; none reaches our config (docker + file providers, no FastProxy, no NTLM backend, no k8s) — R-1304 migration guide v3.7.14–16: k8s providers' names, OTel histograms, CONNECT rejected with 501; none touches us
file manager 1.5.6-stable → 1.5.8-stable GHSA-qx86-4v5r-26g5 (TOTP re-enrol), GHSA-3846-gh75-gp3m (upload share) — R-1305 1.5.7-stable is superseded: it broke existing TOTP logins; 1.5.8-stable supersedes it
cloudflared 2026.10.3 → 2026.10.4 VULN-176088 „Allowlist debug endpoints on the metrics server"; our metrics port is not reachable from outside — low none