Ceph CVE-2025-30156: rotate CephX keys off insecure aes cipher to aes256k #71
Labels
No labels
blocked
borg-backup
ceph
forgejo
in-progress
infra
netdata
nextcloud
p:high
p:low
p:medium
searxng
service-onboard
swarm-nodes
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
copper/ccnet-prod-devops#71
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Ceph's cluster health has been
HEALTH_ERRsince 2026-09-16, triggered by six newAUTH_INSECURE_*checks that Ceph 20.2.4 (already partially rolled out viaccnet-proxmox-nodes-runbook/proxmox-update.ymlnode testing) added to flag every existing CephX key still using the oldaescipher (CVE-2025-30156 — an authentication-bypass vulnerability). This is not an active outage or data-risk issue — the cluster is otherwise fully healthy (273 active+cleanPGs) — but it does blockproxmox-update.yml's Ceph-health precheck from proceeding on further nodes, since that check correctly refuses to drain a node whileHEALTH_ERRis present.Current plan: finish rolling
proxmox-baseline.yml/proxmox-update.ymlacross the remaining Proxmox nodes first (tracked separately), muting the specific health checks in the meantime so the update roll isn't blocked. Come back to this issue once all 7 nodes are on current versions and do the actual key rotation as its own deliberate, tested piece of work — not rushed, per Proxmox staff's own guidance below.What this actually is
CVE-2025-30156: CephX's old
aescipher (AES-128-CBC) has no HMAC and a hardcoded IV — no authentication of the ciphertext, and identical plaintexts always produce identical ciphertexts. An attacker with a low-privilege key or network access to CephX traffic can flip bits in ciphertexts to forge credentials, including forging admin credentials.Fixed in Ceph Tentacle 20.2.4+ / Squid 19.2.6+, which introduce a new key type
aes256k(AES256-CTS-HMAC-SHA384-192, per RFC 8009: random confounders per operation, HMAC-SHA384 auth, ciphertext stealing against padding-oracle attacks) and six new health checks that fire against every existing key still on the old cipher until rotated:AUTH_INSECURE_CLIENT_KEY_TYPE(WARN) — 9 client entities (client.admin, allbootstrap-*,client.crash,client.swarm-data-fs) onaesAUTH_INSECURE_KEYS_ALLOWED(WARN) — mons configured to permitaesauthAUTH_INSECURE_KEYS_CREATABLE(WARN) — mons configured to permit creating newaeskeysAUTH_INSECURE_ROTATING_SERVICE_KEY_TYPE(WARN) — mon/mds/osd/mgr rotating service keys onaesAUTH_INSECURE_SERVICE_KEY_TYPE(ERR) — 19 service entities (every OSD, every MDS, both MGRs) onaesAUTH_INSECURE_SERVICE_TICKETS(ERR) — mons issuing service tickets withaesThe two
ERR-severity checks are what push the cluster intoHEALTH_ERR(vs. justHEALTH_WARN).How urgent, really
Proxmox staff (Thomas Lamprecht) on the equivalent forum thread: "as long as your ceph setup is not accessible from untrusted networks, the impact here is much reduced and a migration should not be rushed." Our Ceph network is internal/VLAN-isolated, not internet-facing, per
docs/homelab-architecture.md— so this is real and worth fixing, but not an emergency. It should still be done deliberately given the failure modes other operators have hit (below).How to actually fix it
Do not use raw
ceph auth rotatecommands manually — Proxmox ships its own migration helper specifically for this,pve-cephx-rotate-service-keys(dry-run by default; documented inpve-docs9.2.6+):It uses a staging/graceful-handover mechanism — both old and new keys stay valid while clients (running VMs, CephFS mounts) refresh. Running VMs need to be rebooted to actually pick up the new key.
Real risks other operators hit (from the Proxmox forum threads)
Not a proper rbd authentication fileerrors7.0.14-x)Suppressing the health error in the meantime
Ceph supports muting specific health checks so they don't block automation that gates on
HEALTH_ERR/HEALTH_OK:(The four
WARN-level checks don't need muting to unblockproxmox-update.yml's "not HEALTH_ERR" precheck, but can be muted too for a cleanceph -sif desired.) A mute is not--stickyby default, so it will automatically re-arm if the underlying condition changes; it also expires after the given TTL (set to 4 weeks here — adjust if the Proxmox fleet roll runs longer).ceph health unmute <code>reverses it early. This is a deferral, not a fix — the six checks (and the underlying CVE exposure) remain exactly as-is underneath the mute.Next steps
proxmox-baseline.yml+proxmox-update.ymlacross all 7 Proxmox nodes (separate tracked work)pve-cephx-rotate-service-keys(no--apply) against the live cluster, review output carefullyAUTH_INSECURE_*checks once rotation is complete and confirmHEALTH_OKSources