diff --git a/omp-docs/index.md b/omp-docs/index.md index 9949b1b..3aed2d5 100644 --- a/omp-docs/index.md +++ b/omp-docs/index.md @@ -65,6 +65,12 @@ dotfiles pruning/adoption session. Architecture decision records — the choices that are no longer up for debate, with what was rejected and why. Currently empty; the format rule is in its index. +## [Reports](reports/index.md) + +Audits and vulnerability passes kept as dated artifacts — the 2026-10-21 fleet +security audit with its per-host vuln pages, and the 2026-09-28 sleep/wake +investigation. + ## [Change history](log.md) Chronological update history of this bundle — incident lessons land here first, diff --git a/omp-docs/log.md b/omp-docs/log.md index fee0472..31cf628 100644 --- a/omp-docs/log.md +++ b/omp-docs/log.md @@ -24,6 +24,23 @@ long form. ## 2026-10-21 +### the audit grows an advisory table, and corrects three of its own numbers + +`omp-docs/reports/fleet-security-audit-2026-10-21.html` folds in the two per-host vulnerability +passes ([reports/vuln-dankclaw.md](reports/vuln-dankclaw.md), +[reports/vuln-dankserver.md](reports/vuln-dankserver.md)): the "Advisory cross-reference (in +progress)" section is now the full matrix and the header links the working files. Three figures +fell to re-probing — the mutable-tag census (17 → **19** Dankclaw manifests / 17 unique +references, +4 on Dankserver; the vuln pass's 24 also counts rolling release tags as mutable), +the OpenSSH advisory count (0 → **5** unpatched CVEs; the first query omitted the version epoch, +`10.2p1` for `1:10.2p1`, and OSV answers `0 vulns` rather than "unknown"), and the Plex version +("12.1.0" is Jellyfin's — `podman exec plex cat /build_version` reports +`1.43.5.11029-6bf8af3f0-ls329`). + +Laws: **an empty OSV response is not a clean bill** — verify the query shape against the distro +tracker before writing "0 advisories"; and **a version quoted from a subagent gets re-probed +before it enters a report**, this being the second mis-attribution the audit caught. + ### reviewing a day of work, and finding checks that lie Two-axis review (Standards / Spec) of 51 commits, 30 findings, on `fix/60-review-findings`. diff --git a/omp-docs/reports/fleet-security-audit-2026-10-21.html b/omp-docs/reports/fleet-security-audit-2026-10-21.html new file mode 100644 index 0000000..0731ce0 --- /dev/null +++ b/omp-docs/reports/fleet-security-audit-2026-10-21.html @@ -0,0 +1,500 @@ + + +
+ + +Coverage. Three boxes audited with credentials (blankpad, Dankclaw, Dankserver);
+ four more observed without access (router .1, .40/.215 =
+ danklivingroom, .75 = Apple device). Every claim below carries the command that produced
+ it; three claims inherited from an earlier survey were refuted and are listed in
+ Caveats rather than repeated.
| Instrument | Version | What it proved |
|---|---|---|
| nmap (NSE) | 7.98 | TCP/UDP service and banner census, TLS certs, ssh2-enum-algos, sshvulns.nse on every reachable address; -sn sweep of 192.168.0.0/24. |
| masscan | 1.3.2 | Full 1–65535 sweep of all live hosts (source-pinned to the Wi-Fi NIC), 65 535 ports per host, 78 open TCP ports total. |
| fping | 5.3 | 27 live addresses from ARP+ICMP; reconciled against the KB network page. |
| lynis | 3.1.5 | Host audit on blankpad (71 warnings, see blankpad). |
| checksec | 2.7.1 | Binary hardening of sshd, ssh, sudo on blankpad. |
| OSV API | — | Advisory lookup for pinned versions (distro ecosystems + Go/npm/PyPI for containers). In progress, see Cross-reference. |
| direct inspection | — | sshd -T, authorized_keys counts, host-key dates, quadlet manifests, live service configs, package/update state, and ss -tlnp as root on every box (root-owned sockets are invisible to an unprivileged ss). |
.40/.215 (danklivingroom, Ubuntu 24.04.4 — no key installed, banner-level only), .75 (Apple device), router .1 (ARRIS admin UI)./etc edits anywhere — this pass is read-only; fixes are proposed in Remediation and land as their own changes.| Sev | Where | Finding | Evidence | Fix |
|---|---|---|---|---|
| critical | +all 3 boxes | +One SSH/sudo password for the whole fleet, and it is in plaintext in shell history, agent transcripts and command lines. All three boxes still accept it as an authentication factor (PasswordAuthentication yes), so a leaked transcript downgrades key-only SSH to a guessed secret. |
+ sshd -T on blankpad, Dankclaw, Dankserver → passwordauthentication yes, pubkeyauthentication yes, permitrootlogin prohibit-password, maxauthtries 6. Every privileged probe in this audit ran printf '<pw>' | sudo -S, which also puts the secret in the process table (/proc/<pid>/cmdline is world-readable) — the same class of leak that previously exposed an HF token. |
+ Rotate the password once, then set PasswordAuthentication no in a drop-in on all three boxes and switch agent-side privilege escalation to sudo -n (already passwordless on the servers) or sudo -S < ~/.secrets/sudo-pass with mode 600. Verify keys in a second session before closing the door. |
+
| high | +Dankclaw, Dankserver | +23 container images run mutable tags — 19 of the 33 quadlet manifests on Dankclaw (17 unique references: 15 × :latest, 1 × :main, 1 × :nightly) and 4 of the 12 on Dankserver. The deployed version cannot be read from the manifest, a restart can silently upgrade a production service, and a CVE lookup is impossible without inspecting each container. |
+ grep -h '^Image=' ~/.config/containers/systemd/*.container on both hosts. Dankclaw, recounted from the manifests: 33 Image= lines — 19 mutable (15 × :latest, 1 × :main, 1 × :nightly, the rest duplicate declarations of localhost/hermes-agent:latest), 10 exact-tag, 4 digest-pinned. The Dankclaw working page reports 24 there because it also counts rolling release tags (postgres:16-alpine ×2, valkey:9-alpine, comfyui-rocm:gfx1151) and open_notebook:v1-latest@sha256… as mutable. Dankserver: 4 on :latest plus the rolling mariadb:11 and redis:7-alpine. Four Dankclaw images do pin digests (open_notebook:v1-latest@sha256:54b2025…, surrealdb:v2@sha256:e5d7387…, chromedp/headless-shell@sha256:2d349b5…, ghcr.io/goauthentik/ldap@sha256:2e7b259…), so the policy exists but is applied inconsistently. Live probes disagree with the tags: gitea:latest → 1.27.3, grafana:latest → 13.2.2 (commit 1bea008), jellyfin:latest → 12.1.0, pihole:latest → Core v6.4.3 (vendor v6.5). |
+ Pin every Image= to tag@sha256:digest (or at minimum an exact tag) in the quadlet manifests, one commit per host; see Image census. |
+
| high | +Dankclaw | +Gitea allows self-registration and unauthenticated read. The instance carries the fleet's infrastructure repositories, so any device on the LAN (or anything that can reach 192.168.0.143:3000) can create an account and browse them. |
+ Live /data/gitea/conf/app.ini: DISABLE_REGISTRATION = false, REQUIRE_SIGNIN_VIEW = false; API version 1.27.3; published 0.0.0.0:3000 and 2222:22. |
+ DISABLE_REGISTRATION = true (Authentik is the identity provider; keep the OAuth path) and audit per-repository visibility — the secret-gate doctrine in AGENTS.md assumes these repos are not world-readable. |
+
| medium | +Dankclaw (Caddy) | +No HSTS anywhere, no CSP on the authenticated vhosts. The apex redirect drops the one header that pins clients to TLS; the app vhosts differ from each other, so policy is per-vhost accident rather than intent. | +https://franksdank.cloud → HTTP/2 308, server: Caddy and nothing else. gitea.franksdank.cloud → x-content-type-options: nosniff, x-frame-options: SAMEORIGIN. grafana.franksdank.cloud → bare HTTP/2 200. |
+ Add Strict-Transport-Security: max-age=31536000; includeSubDomains to the Caddy site blocks (and fix the pre-existing max-age=600 on the router-side listener), then stage a Content-Security-Policy starting in report-only mode. |
+
| medium | +Dankserver | +NFS client helpers exposed on every interface with nothing exported. rpcbind on 0.0.0.0:111 plus rpc.statd on 0.0.0.0:51651, while /etc/exports contains only comments — attack surface with no consumer. |
+ Root ss -tlnp on both servers; cat /etc/exports → comments only. Dankclaw has the same two listeners. |
+ systemctl disable --now rpcbind nfs-common on both Ubuntu boxes (re-enable if an export is ever added). |
+
| medium | +Dankserver, .40/.215 | +Patch lag and OpenSSH skew. The Ubuntu boxes are 73 packages behind (6 security) and the two livingroom hosts still run OpenSSH 10.0 while the audited boxes run 10.2/10.6 — three different SSH stacks on one LAN. | +Dankserver: apt-get -s upgrade → 73 pending, 6 from *-security*, reboot not required. .40/.215: nmap banner OpenSSH_10.0p1 Ubuntu-2ubuntu12.1 on Ubuntu 24.04.4 LTS. blankpad: OpenSSH_10.6p1, OpenSSL 3.6.5; Dankclaw/Dankserver: OpenSSH_10.2p1 Ubuntu-2ubuntu3.8, OpenSSL 3.5.5. |
+ Upgrade the Ubuntu pair in a window (both boxes, same procedure, reboot not required on Dankserver); plan the livingroom hosts into the same key rollout rather than leaving them on an old stack. | +
| medium | +Dankserver | +Host keys predate the installed system and two live addresses are undocumented. /etc/ssh/ssh_host_*_key are dated 2024-11-29 on a box whose userland is Ubuntu 26.04-era — the keys were carried across a reinstall and never rotated. .247 answers alongside .235 with the same service set, and the KB names only .235. |
+ ls -l --time-style=long-iso /etc/ssh/ssh_*_key → 2024-11-29 (ecdsa/ed25519/rsa, no post-quantum key); ARP: .235 b0:82:e2:a6:39:f3, .247 b0:82:e2:a6:39:f4 (same OUI, adjacent NIC) → [INFERENCE] second NIC of the same chassis. blankpad's keys (2026-09-09) already include ssh_host_mldsa44_ed25519_key; Dankclaw's (2026-07-21) and Dankserver's do not. |
+ Rotate Dankserver's host keys after pinning known_hosts on the clients, and record both addresses in omp-docs/system/dankserver.md. |
+
| low | +Dankclaw, blankpad | +Listeners that no manifest declares. On Dankclaw a container serves 0.0.0.0:8787 without a PublishPort= line (host-network), and two PublishPort entries omit the bind address so podman publishes them on all interfaces where their neighbours are explicit. |
+ Root ss -tlnp: 0.0.0.0:8787 → /opt/hermes/.venv/bin/python /webui/server.py (uid 109999); 192.168.0.143:18093 → signal-relay.py; 192.168.0.143:9401 + 127.0.0.1:9401 → gpu-exporter.py; 127.0.0.1:12345 → alloy; 127.0.0.1:33471 → containerd. Manifest grep shows PublishPort=2222:22 and PublishPort=3005:8080 with no address. blankpad likewise runs python3 on 0.0.0.0:8899 and bun on 127.0.0.1:8787. |
+ Write the missing PublishPort=127.0.0.1:… lines so intent is on disk, and adopt the loose host scripts into quadlet/systemd units — every listener should be owned by a unit. |
+
| low | +.40/.215 | +LLMNR enabled on the livingroom hosts (UDP/TCP 5355) — a legacy name-resolution protocol that answers broadcasts and is routinely poisoned; and their other open ports (8081, 27036, 32000) have no owner record anywhere. |
+ nmap service probes on .40 and .215; identical port sets on both addresses, which are two separate physical boxes (different OUIs: 84:47:09:…, 4c:23:38:…). |
+ LLMRR=no → LLMNR=no in /etc/systemd/resolved.conf; document what runs on those hosts once key access exists. |
+
| info | +all 3 boxes | +No rootkit or integrity indicators. NSE rootkit-check, http-malware-host, http-sql-vulnwrapper, http-wordpress-enum and ssl-ccs-injection ran against every reachable web service with no positives; blankpad binaries carry full RELRO, stack canary, Intel CET (SHSTK&IBT), NX and PIE. |
+ nmap NSE results per host; checksec file /usr/bin/sshd → Full RELRO / Canary / CFI SHSTK&IBT / NX / PIE / FORTIFY 7 of 10, same profile for ssh, and sudo 5 of 9 with RUNPATH [/usr/bin/sudo→/usr/lib/sudo]. |
+ Nothing to do; recorded so the next audit has a baseline. | +
| Field | Observed |
|---|---|
| OS / kernel | CachyOS, 7.2.9-1-cachyos |
| SSH | OpenSSH_10.6p1, OpenSSL 3.6.5; unit sshd active + enabled, listening 0.0.0.0:22 and [::]:22 |
| sshd policy | passwordauthentication yes · pubkeyauthentication yes · permitrootlogin prohibit-password · maxauthtries 6 · kbdinteractiveauthentication no · usepam yes; ciphers chacha20-poly1305, aes128-gcm, aes256-gcm, aes128-ctr, aes192-ctr, aes256-ctr |
| sshd config files | /etc/ssh/sshd_config.d/20-systemd-userdb.conf (symlink from /usr/lib/systemd), 99-archlinux.conf — the drop-ins, not a hand-edited config |
| Host keys | 2026-09-09: ed25519, ecdsa, rsa, mldsa44_ed25519 (post-quantum) — the only box in the fleet offering a PQ host key |
| Binary hardening | sshd/ssh: Full RELRO, canary, CFI SHSTK&IBT, NX, PIE, no RPATH, FORTIFY 7/10. sudo: same, FORTIFY 5/9, RUNPATH [/usr/lib/sudo] |
| Users with login shells | none besides root — no stale accounts |
| TCP listeners (13) | 0.0.0.0:22 sshd · 0.0.0.0:8899 python3 · 127.0.0.53:53 resolved · 127.0.0.1:8787 bun · 127.0.0.1:44179 omp · 127.0.0.1:6463 Discord · 127.0.0.1:35507 chrome · 127.0.0.1:5433 passt (rest loopback) |
| Local tooling | lynis + checksec installed; rkhunter/chkrootkit absent (Arch has no debsecan equivalent — pacman advisories come from the security tracker feed) |
| Field | Observed |
|---|---|
| SSH | OpenSSH_10.2p1 Ubuntu-2ubuntu3.8, OpenSSL 3.5.5; passwordauthentication yes, permitrootlogin prohibit-password, maxauthtries 6, authenticationmethods any, kbdinteractiveauthentication no; MAC list still offers umac-64-etm, hmac-sha1-etm, umac-64, hmac-sha1 |
| Authorised keys | /home/dank/.ssh/authorized_keys 9 entries, /root/.ssh/authorized_keys 3 entries |
| Host keys | 2026-07-21 (ecdsa, ed25519, rsa) |
| Containers | 33 quadlet manifests in ~/.config/containers/systemd; 15 on :latest, 1 on :main, 1 on :nightly (19 manifest lines / 17 unique references), 4 digest-pinned, 10 exact-tag |
| Published on all interfaces | 0.0.0.0:80, 0.0.0.0:443 (Caddy) · 0.0.0.0:53 tcp+udp and 0.0.0.0:8083→80 (Pi-hole DNS + admin) · 0.0.0.0:3000, 2222:22 (Gitea) · 0.0.0.0:8188, 0.0.0.0:8502, 3005:8080 · 389→3389, 636→6636 (Authentik LDAP/LDAPS) · 7772:7772 (embedding proxy) · 8081:8080, 8082:8085, 9119:9119 · 0.0.0.0:8787 (unmanifested, see findings) |
| Published loopback-only | 127.0.0.1:3002 Grafana · 127.0.0.1:3100 Loki · 127.0.0.1:9090 Prometheus · 127.0.0.1:9093 Alertmanager · 127.0.0.1:9000 Authentik · 127.0.0.1:5055, 127.0.0.1:5056→5055, 127.0.0.1:8080 + 192.168.0.143:8080 |
| Grafana | 13.2.2 commit 1bea008f7e4e858b6824c9e364d608bd4d10b13a via /api/health; live /etc/grafana/grafana.ini has ;enabled = false under [auth.anonymous] — anonymous access is off; env file mode 600, contains only GRAFANA_OAUTH_CLIENT_SECRET |
| Caddy | franksdank/caddy-porkbun:latest; Caddyfile fronts both hosts, guarded vhosts route through Anubis → Authentik, apps with their own auth exempt by construction |
| Pi-hole | pihole/pihole:latest; env ServerIP=192.168.0.143, DNS1=1.1.1.1, DNS2=1.0.0.1, WEBPASSWORD=<set> — the admin UI is on 0.0.0.0:8083 rather than behind Caddy |
| Host processes | signal-relay.py (18093), gpu-exporter.py --serve (9401), alloy (12345), containerd devv socket (33471) — scripts from ~/serverAppConfigs/scripts, not declared as quadlets |
| Field | Observed |
|---|---|
| SSH | OpenSSH_10.2p1 Ubuntu-2ubuntu3.8, OpenSSL 3.5.5; passwordauthentication yes, permitrootlogin prohibit-password, maxauthtries 6, usepam yes |
| Authorised keys | /home/dank/.ssh/authorized_keys 7 entries; /root/.ssh/authorized_keys not readable by dank (unprivileged cat → permission denied) |
| Host keys | 2024-11-29 — predates the current Ubuntu userland; no post-quantum host key |
| Packages | 73 upgradable, 6 from *-security; reboot not required |
| Containers | 12 quadlet manifests; 4 on :latest (prom/node-exporter, 9001/copyparty-ac, jellyfin/jellyfin → 12.1.0 live, rommapp/romm); the rest pinned, including linuxserver/plex:1.43.5.11029-6bf8af3f0-ls329 and linuxserver/calibre-web:0.6.27-ls402 |
| Host services | radiance inference on *:7770 (native process, not a container), syncthing *:8384 (user unit enabled), gnome-remote-de RDP on *:3389 (user unit active, system unit disabled), rpcbind 0.0.0.0:111, rpc.statd 0.0.0.0:51651 |
| NFS | /etc/exports contains comments only — nothing exported, so the two NFS helper daemons serve nothing |
| Second address | .247 (ARP b0:82:e2:a6:39:f4) presents the same service set as .235 (b0:82:e2:a6:39:f3) — [INFERENCE] second NIC of the same chassis; undocumented in the KB |
| Address | Identity | Evidence | Action |
|---|---|---|---|
.40 and .215 | danklivingroom — two distinct boxes (OUIs 84:47:09, 4c:23:38) with identical port profiles | SSH auth probe returns Ubuntu 24.04.4 LTS + Permission denied (publickey,password); nmap banner OpenSSH_10.0p1 Ubuntu-2ubuntu12.1; open ports 22, 5355, 8081, 27036, 32000 on both | Install the fleet key (no password auth needed), then patch and document; see the LLMNR finding |
.75 | Apple device | Open ports 853, 49152, 62078, 62742, 62805 — 62078 is the Apple mobile-sync service; mDNS name present | Managed handset/tablet: nothing to patch from here; record it in the network page so it stops showing up as an unknown |
.112 | dankstation | Seen by the earlier discovery pass (mDNS + SSH, 7 ports via nmap); absent from the 2026-10-21 fping/masscan sweep | Confirm whether it is asleep or was renamed — the KB has no current entry |
.1 | ARRIS gateway (ISP router, Wi-Fi password holder) | Open ports 80, 111, 443, 8181, 49152, 50011, 50012, 51515; HTTP banner server: ARRIS; auth probe reports password auth (no key accepted) | Admin UI is LAN-reachable; change the default credential and disable HTTP if the vendor build allows |
The same repo writes both styles on the same host. mutable means a + restart can change the running binary; pinned means the manifest states what + is running. Verified versions were read from the live services, not the tags.
+:latest| Image | Status | Live version |
|---|---|---|
docker.io/gitea/gitea:latest | mutable | 1.27.3 (API) |
docker.io/grafana/grafana:latest | mutable | 13.2.2 / 1bea008f7e4e858b6824c9e364d608bd4d10b13a |
franksdank/caddy-porkbun:latest | mutable | serves 80/443, server: Caddy |
docker.io/pihole/pihole:latest | mutable | DNS 53 + admin 8083 |
docker.io/prom/prometheus:latest, prom/alertmanager:latest, prom/node-exporter:latest | mutable | loopback-published |
ghcr.io/searxng/searxng:latest, ghcr.io/manualdousuario/marreta:latest, ghcr.io/open-webui/open-webui:main, docker.io/qmcgaw/gluetun:latest, docker.io/binwiederhier/ntfy:latest | mutable | — |
localhost/franksdank/frank-tts:latest, frank-tts-engine:latest, localhost/hermes-agent:latest (×3) | mutable | hermes webui answers on 0.0.0.0:8787 |
docker.io/lightpanda/browser:nightly | mutable | — |
ghcr.io/goauthentik/server:2026.8.3 (×3), ghcr.io/manualdousuario/marreta, ghcr.io/seerr-team/seerr:v3.4.1, techarohq/anubis:v1.27.0, gcr.io/cadvisor/cadvisor:v0.49.1, docker.io/library/postgres:16-alpine (×2), docker.io/valkey/valkey:9-alpine, localhost/comfyui-rocm:gfx1151 | pinned | — |
lfnovo/open_notebook:v1-latest@sha256:54b2025a…, surrealdb/surrealdb:v2@sha256:e5d7387e…, chromedp/headless-shell@sha256:2d349b54…, ghcr.io/goauthentik/ldap@sha256:2e7b259e… | digest-pinned | the pattern every manifest should follow |
:latest| Image | Status | Live version |
|---|---|---|
ghcr.io/jellyfin/jellyfin:latest | mutable | 12.1.0 (/System/Info/Public) |
ghcr.io/rommapp/romm:latest, ghcr.io/9001/copyparty-ac:latest, docker.io/prom/node-exporter:latest | mutable | — |
localhost/radiance-vllm:0.13.0-e060895, lscr.io/linuxserver/plex:1.43.5.11029-6bf8af3f0-ls329, linuxserver/calibre:9.15.0, linuxserver/calibre-web:0.6.27-ls402, linuxserver/tautulli:v2.18.1-ls245, docker.io/library/mariadb:11, redis:7-alpine, gcr.io/cadvisor/cadvisor:v0.49.1 | pinned | — |
git diff no longer tells you what code is running — the assumption the whole
+ "the checkout is the deployment" doctrine rests on.Versions come from live sources only — OSV POST /v1/query in the correct ecosystem
+ (Ubuntu/Alpine for distro packages, Go/PyPI/crates.io
+ for application code), the Ubuntu Security Tracker, the Alpine secdb, GitHub repository advisories, and
+ podman exec … --version inside each container. The complete per-host tables live beside this
+ report: vuln-dankclaw.md (33 Dankclaw images + host) and
+ vuln-dankserver.md (Dankserver, blankpad, danklivingroom). The tables below
+ are the cross-host summary; re-verified marks a version this session re-probed
+ directly from blankpad on 2026-10-21.
| Component | Installed | Severity | Advisory / fix |
|---|---|---|---|
openssh (source package), both servers | 1:10.2p1-2ubuntu3.8 re-verified | medium | CVE-2026-110923 plus CVE-2026-110924, -110925, -110926, -110927 — 5 unpatched, no Ubuntu fix released (apt-cache policy: candidate == installed; tracker status needs-triage, CVSS 5.5–6.5). An earlier pass recorded "0 open advisories" here: the OSV purl-only query shape returns nothing for that build, the name+ecosystem+version form returns the five. |
gnome-remote-desktop (Dankserver) | 50.2-0ubuntu0.1 | medium | 5 CVEs (CVE-2025-5024, CVE-2026-109832, CVE-2026-109833, CVE-2026-18358, CVE-2026-96541), none fixed for 26.04 — the RDP listener sits on *:3389 |
rpcbind (Dankserver) | 1.2.7-1build2 | medium | 3 CVEs (CVE-2026-16277, CVE-2026-16461, CVE-2026-94640), none fixed for 26.04; the daemon serves nothing (NFS exports are empty) yet answers on 0.0.0.0:111 |
openssl/libssl3t64, nfs-utils, samba, syncthing | 3.5.5-1ubuntu3.7, 1:2.8.5-1ubuntu1, 2:4.23.6+dfsg-1ubuntu2.2, 1.29.5~ds1-3 | clean | OSV Ubuntu returns no applicable advisory at the installed versions (syncthing: 3 records, all patched before 1.29.5) |
| kernel (Dankserver) | 7.0.0-38.38 | untriaged | 35 OSV records list the installed kernel as affected with no fixed event — needs-triage, not confirmed vulnerable |
| Container / image | Running version | Severity | Advisory / fix |
|---|---|---|---|
open-notebook-surrealdbsurrealdb/surrealdb:v2@sha256:e5d7387… | 2.7.0 (/surreal version) | high | 25 advisories, 6 HIGH (CVE-2026-63735, GHSA-4vgr-h27g-cf9p, GHSA-5qfp-32cf-69jh, GHSA-cc8f-fcx3-gpjr, CVE-2026-63760, GHSA-wjjj-24cx-f28g). Every fix is on the 3.x line — the pinned v2 tag is end-of-line, so this is a major-version migration, not a rebuild. |
gitea-servergitea/gitea:latest | 1.27.3 (/api/v1/version) | patched | CVE-2026-60004 (CRITICAL, RCE through the diffpatch git hook) and GHSA-cm61-xmth-gqwh (cacheable session) were both fixed in 1.27.1 — the running image carries the fix. The exposure here is F3 (open registration + public read), not the build. |
piholepihole/pihole:latest | Core v6.4.3 · Web v6.6 · FTL v6.7.1 (pihole -v) | high | 12 FTL + 3 web advisories published on/after the image build (2026-09-19), incl. GHSA-2h7g-g549-hf74 (authenticated file read + fix bypass), GHSA-2794-hrj8-5jg9 (webserver.advancedOpts RCE → root), GHSA-ww5x-xx4x-qvjr (misc.dnsmasq_lines RCE); vendor is at FTL v6.8 / Core v6.5 / Web v6.6.1. Its Alpine shell measures musl 1.2.5-r2 + libssl3 3.5.6-r0 → CVE-2026-36448 (CVSS 9.8), CVE-2026-31974, CVE-2026-39171. |
searxng-valkeyvalkey/valkey:9-alpine@sha256:31e788e7… | 9.1.2 (valkey-server --version) | high | 4 vendor advisories — CVE-2026-63639, CVE-2026-56684, GHSA-jcj7-v34w-v9vv, GHSA-fq2f-crmw-q97r — applicability unconfirmed (the Alpine secdb stops at 9.0.4-r0; the image is a from-source build). Reachable only from the searxng pod network. |
gitea-postgres, authentik-postgrespostgres:16-alpine@sha256:06f9702… | 16.15 (postgres --version) | unverifiable | PostgreSQL server CVEs are published on postgresql.org and are not in OSV/GHSA; postgresql16 is absent from the Alpine secdb (from-source build), so no tracker in the query set covers 16.15. |
caddyfranksdank/caddy-porkbun:latest | v2.11.7 (caddy version) → docker.io/library/caddy:v2.11.7_alpine@sha256:684242074367… | clean | No OSV record for github.com/caddyserver/caddy@2.11.7. The mutable local tag hides the upstream pin (F2) — record the digest in the manifest. |
Alpine 3.24 shells — gitea-server, grafana, ntfy, authentik-postgres, frank-tts | musl 1.2.6-r2, libssl3 3.5.7-r0 | medium | musl → CVE-2026-107891 (fixed 1.2.6-r3); libssl3 → 10 CVEs fixed at 3.5.8-r0. Shells on 3.23 (gluetun, caddy, seerr) were not fetched — backport status unknown. |
| Container / image | Running version | Severity | Advisory / fix |
|---|---|---|---|
plexlscr.io/linuxserver/plex:1.43.5.11029-6bf8af3f0-ls329 | 1.43.5.11029 (cat /build_version, build-date 2026-10-20) | high | Plex publishes no CVE feed and has no OSV ecosystem; upstream is at 1.43.6.11150, a security release, so the pin is one minor behind. The earlier pass attributed "12.1.0" to Plex — that string is Jellyfin's version (see the note at the end of this section). |
copypartyghcr.io/9001/copyparty:v1.26.2 (image 2284b21e4259) | 1.20.24 (image label) | medium | GHSA-3c88-p299-7hvr (fixed 1.20.25) and GHSA-hg99-jqfp-rf76 (low, fixed 1.20.26) are both newer than the running build — the tag moved without the container being rebuilt. |
redisdocker.io/library/redis:7-alpine@sha256:2ed3d0c… | v=7.4.11 (redis-server --version) | high | 12 vendor advisories (CVE-2026-23479, CVE-2026-25243, CVE-2025-46817, CVE-2025-48367, CVE-2025-32023, CVE-2025-21605 …) carry patched: TBD upstream — no fixed 7.4.x release exists to move to. CVE-2025-49844 is fixed at 7.4.6, so it does not apply. |
romm-mariadbdocker.io/library/mariadb:11@sha256:943995c7… | 11.8.9 (mariadb --version) | unverifiable | Upstream MariaDB has no OSV ecosystem; the 310 name-only records belong to Debian/Ubuntu/Alpine builds and cannot be attributed to this image. The 4 security fixes released for the 11.8.6 line were recorded against a "11.8.5" reading in the earlier pass — the installed build is 11.8.9. |
rommghcr.io/rommapp/romm@sha256:eab97d88d9d7… | 5.3.1 (cat /backend/__version__.py) | clean | None of the 15 repository advisories applies (all patched earlier), but upstream is at 5.9.0 — 12 releases behind, which is where future exposure comes from. |
jellyfinghcr.io/jellyfin/jellyfin@sha256:6370ab0005b4… | 12.1.0 (/System/Info/Public) | clean | None of the published repository advisories applies at 12.1.0 — all patched ranges end at ≤ 12.0, including the earlier pass's GHSA-vrc3-37vx-82q5 / CVE-2026-44208 row. The three newest advisories (GHSA-cf3c-8m59-2vhx SVG SSRF, GHSA-6828-c7cx-hvqm virtual-folder traversal, GHSA-4vx8-xhc9-qg6x session control) fix later releases. |
calibre-web / calibre | 0.6.27-ls402 / 9.15.0 (image tags) | unverifiable | No OSV record in the PyPI ecosystem at calibre-web 0.6.27 and none for calibre 9.15.0; the earlier pass's CVE-2026-42811 (fixed 0.6.28) came from the Ubuntu tracker for a different build line. |
tautullilscr.io/linuxserver/tautulli:v2.18.1-ls245 | 2.18.1 (tag) | clean | 18 repository advisories, all patched ≤ 2.17.2 |
cadvisor / cadvisor-test | v0.49.1 (images built 2024-03-02, Alpine 3.19 / 3.18.6 bases) | medium | No application advisory; the exposure is the base image — 63 GHSA on the Alpine 3.19 shell (61 fix-available), and v0.49.1 is 2.5 years old. |
frank-archon (native radiance, image localhost/radiance-vllm:0.13.0-e060895) | 0.13.0 — tag-derived only: the running container is docker.io/stilldeadcode/radiance@sha256:d590e300… and ships no python3 to confirm the embedded vLLM | critical | Assessed against vLLM 0.13.0: GHSA-4r2x-xpjr-7cvv and GHSA-94f4-hr76-p5j6 (CRITICAL, fixed 0.14.1 / 0.22.0) plus 48 more. If the fork carries a different vLLM base the whole row set changes — flagged unverifiable in the working page. |
| Host | Component | Severity | Advisory / fix |
|---|---|---|---|
danklivingroom .40 / .215 | OpenSSH 10.0p1 — banner verified by probe; OS reported Ubuntu 24.04.4 LTS, package version 1:10.0p1-2ubuntu12.1 | medium | 8 CVEs fixed for the 10.0p1 source line (CVE-2025-61984, CVE-2025-61985, CVE-2026-3497, CVE-2026-35385, -35386, -35387, -35388, -35414 — USN-8222-1, USN-8090-1). Nothing else on the box is assessable: key auth refused, so no inventory (caveat). |
| blankpad (Arch) | 1,359 installed packages | clean | 0 packages match an Arch advisory with a newer fix version (2,446-advisory feed matched on pkgbase, control-tested against deliberately old versions so the matcher is not vacuous). Two advisories stay open upstream without a fixed version: AVG-2882 (openssl CVE-2025-4575, low), AVG-2893 (systemd CVE-2025-4598, medium). The linux-cachyos kernel is not in the tracker at all. |
1.43.5.11029-6bf8af3f0-ls329. (3) Dankserver mariadb "11.8.5" — the running container reports 11.8.9. The Dankclaw mutable-tag census also differs by definition (19 manifests here, 24 in the working page, which counts rolling release tags as mutable); both counts are shown in F2.# 1. rotate the fleet password once, then close the door on all three boxes
+# (verify keys in a second session first)
+printf 'PasswordAuthentication no\n' | sudo tee /etc/ssh/sshd_config.d/99-audit.conf
+sudo sshd -t && sudo systemctl reload sshd
+
+# 2. stop echoing the secret in every command line
+# servers already allow `sudo -n` for systemctl; blankpad keeps its sudoers entry
+# 3. Gitea: stop self-registration, keep the Authentik path
+DISABLE_REGISTRATION = true # /data/gitea/conf/app.ini
+ tag@sha256:digest in the quadlet manifests, one commit per host; the repo already digest-pins four images, so this is finishing an existing pattern, not inventing one.Strict-Transport-Security: max-age=31536000; includeSubDomains on every TLS site (the router-side listener currently sends max-age=600), then CSP in report-only.PublishPort=2222:22 and 3005:8080 explicitly (127.0.0.1:) and give 0.0.0.0:8787 (hermes webui) a manifest line so the socket matches the repo.apt-get upgrade on Dankserver (73 packages, 6 security, no reboot flag) and the equivalent on Dankclaw.systemctl disable --now rpcbind nfs-common on both Ubuntu boxes — nothing is exported.known_hosts; consider shipping a post-quantum host key there and on Dankclaw the way blankpad already does..40/.215, patch OpenSSH 10.0, set LLMNR=no.[auth.anonymous] enabled=true, org_role=1). The live container config reads
+ ;enabled = false — a commented default, i.e. anonymous access is off. The earlier claim
+ came from a checkout path on the dev box, not from Dankclaw.127.0.0.1:3000". The manifest publishes
+ 127.0.0.1:3002:3000; port 3000 on that host belongs to Gitea.~/.config/containers/systemd; the survey had read a stale worktree path..40/.215
+ (key auth refused), .75 and the router — banner and port evidence only; whether
+ .247 is a second NIC or a second chassis is marked [INFERENCE] from ARP data;
+ and /root/.ssh/authorized_keys on Dankserver is not readable without a root shell.ss on a rootless-podman host hides most
+ listeners (they belong to rootlessport/pasta); every socket census here ran as
+ root, and the scan toolchain was installed on the audit box rather than the servers.