Skip to content

ProxCenter

v1.4.1 Security

This release includes 4 security fixes for security teams reviewing exposed deployments.

Published 13d Virtualization
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →
This release patches 4 known CVEs

Topics

backup-management ceph cluster-management datacenter drs high-availability
+9 more
load-balancing monitoring pbs proxmox pve pve-cluster self-hosted sysadmin virtualization

Affected surfaces

rce_ssrf deps

ReleasePort's take

Moderate signal
editorial:auto 13d

The migration cap model changes from global to per‑cluster and introduces an opt‑in per‑target inflow limit, while several bug fixes tighten concurrency controls and prevent ID collisions.

Why it matters: Patch clusters immediately; the per‑cluster cap removes legacy settings that could cause unexpected throttling, and new safeguards (e.g., 64‑bit UUID generation) eliminate migration ID collisions.

Summary

AI summary

Broad release touches AI, Quality & test coverage, Rolling update, and Upgrade notes.

Changes in this release

Security Medium

Tighten enterprise.proxmox.com URL spoofing check in license validator.

Tighten enterprise.proxmox.com URL spoofing check in license validator.

Source: llm_adapter@2026-05-21

Confidence: high

Security Medium

SSRF guard on AI test/models endpoints, blocks cloud metadata services.

SSRF guard on AI test/models endpoints, blocks cloud metadata services.

Source: llm_adapter@2026-05-21

Confidence: low

Security Medium

Bump ws to 8.20.1, addresses CVE-2026-45736.

Bump ws to 8.20.1, addresses CVE-2026-45736.

Source: llm_adapter@2026-05-21

Confidence: low

Security Medium

Bump bundled npm to 11.15.0, covers brace-expansion CVE-2026-45149.

Bump bundled npm to 11.15.0, covers brace-expansion CVE-2026-45149.

Source: llm_adapter@2026-05-21

Confidence: low

Security Medium

Patch bundled npm for CVE-2026-42338 (ip-address < 10.1.1).

Patch bundled npm for CVE-2026-42338 (ip-address < 10.1.1).

Source: llm_adapter@2026-05-21

Confidence: low

Breaking Medium

Per-cluster migration cap replaces global cap, removes legacy setting.

Per-cluster migration cap replaces global cap, removes legacy setting.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Per-target inflow cap (opt-in) prevents ping-pong on same-node convergence.

Per-target inflow cap (opt-in) prevents ping-pong on same-node convergence.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Freshness gate (StaleTTL) rejects aged-out recommendations before execution.

Freshness gate (StaleTTL) rejects aged-out recommendations before execution.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Rebalance interval now supports 15m and 30m schedule options.

Rebalance interval now supports 15m and 30m schedule options.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Surface node version and API token permission errors in rolling-update UI.

Surface node version and API token permission errors in rolling-update UI.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

Auto-generate INTERNAL_API_TOKEN outside Docker for source-built installs.

Auto-generate INTERNAL_API_TOKEN outside Docker for source-built installs.

Source: llm_adapter@2026-05-21

Confidence: low

Bugfix Medium

Post-migration snowball: triggerPostMigrationEvaluation stops auto-running Rebalance.

Post-migration snowball: triggerPostMigrationEvaluation stops auto-running Rebalance.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

64-bit UUID generation prevents recommendation and migration ID collisions.

64-bit UUID generation prevents recommendation and migration ID collisions.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Post-migration singleflight guards prevent concurrent Evaluate re-entry.

Post-migration singleflight guards prevent concurrent Evaluate re-entry.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Exclusive scheduler registration prevents two cron cycles from firing parallel.

Exclusive scheduler registration prevents two cron cycles from firing parallel.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Storage gate scoped strictly to maintenance evacuation and QEMU only.

Storage gate scoped strictly to maintenance evacuation and QEMU only.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Affinity enforcement preserved across PVE flap, fail-closed LastSeenAt.

Affinity enforcement preserved across PVE flap, fail-closed LastSeenAt.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

mergeRecommendations target mutation resets confirmation counter.

mergeRecommendations target mutation resets confirmation counter.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

mergeRecommendations partitions by origin, prevents flag bleed across classes.

mergeRecommendations partitions by origin, prevents flag bleed across classes.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

EvacuateNode supersedes prior pending evacuations for same cluster/node.

EvacuateNode supersedes prior pending evacuations for same cluster/node.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Migrate-to-Proxmox button disabled on single-disk nodes, /tmp synthesized.

Migrate-to-Proxmox button disabled on single-disk nodes, /tmp synthesized.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

PVE config PUT timeouts extended to 120s, fixes ZFS-over-iSCSI hangs.

PVE config PUT timeouts extended to 120s, fixes ZFS-over-iSCSI hangs.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Respect reboot_timeout end-to-end with sustained 3x online polling.

Respect reboot_timeout end-to-end with sustained 3x online polling.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Run apt/ha-manager/ceph/reboot as root via sudo for non-root SSH.

Run apt/ha-manager/ceph/reboot as root via sudo for non-root SSH.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Backfill ORCHESTRATOR_API_KEY on upgrade, refuse placeholder at startup.

Backfill ORCHESTRATOR_API_KEY on upgrade, refuse placeholder at startup.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

curl stderr surfaced and orphan LVM freed on stream failure.

curl stderr surfaced and orphan LVM freed on stream failure.

Source: llm_adapter@2026-05-21

Confidence: low

Bugfix Medium

Scope reboot_timeout deadline to reboot path only, not verify window.

Scope reboot_timeout deadline to reboot path only, not verify window.

Source: llm_adapter@2026-05-21

Confidence: low

Bugfix Medium

Test connection for Ollama fixed after auth refactor.

Test connection for Ollama fixed after auth refactor.

Source: llm_adapter@2026-05-21

Confidence: low

Refactor Medium

DRS settings UI reorganized into subsections, dead-knob toggles removed.

DRS settings UI reorganized into subsections, dead-knob toggles removed.

Source: llm_adapter@2026-05-21

Confidence: low

Refactor Medium

Install URL uses proxcenter.io/install/* instead of get subdomain.

Install URL uses proxcenter.io/install/* instead of get subdomain.

Source: llm_adapter@2026-05-21

Confidence: low

Full changelog

ProxCenter v1.4.1

Patch release: DRS automatic-mode hardening, vSphere migration fixes,
rolling-update reliability, security.

DRS, automatic mode hardening

The automatic-mode DRS is significantly safer in this release. Several
latent issues surfaced under multi-cluster workloads with scheduled
rebalancing and are now closed.

  • Per-cluster migration cap replaces the global cap as the user-facing
    throttle. Operators reason per cluster, not globally, so the legacy
    global setting is removed from the UI. Each cluster gets its own slot
    budget, preventing one busy cluster from monopolizing every scheduled
    tick (backend #5, frontend #333).
  • Per-target inflow cap (opt-in). Caps how many migrations may target
    the same node within one Rebalance cycle, preventing ping-pong when
    several recommendations converge on the same "least-loaded" node and
    overshoot it.
  • Post-migration snowball fix. triggerPostMigrationEvaluation no
    longer auto-runs Rebalance() after every load-balance or rule-violation
    migration completes. The scheduled cron is now the only periodic
    trigger. Maintenance evacuations still self-loop so node drains progress
    batch by batch (backend #4).
  • Vague 1 hardening bundle (backend #3, 10 commits):
    • 64-bit UUID generation prevents recommendation / migration ID collisions.
    • Post-migration singleflight guards against concurrent re-entry into Evaluate.
    • Exclusive scheduler registration so cron overlaps cannot fire two cycles in parallel.
    • Freshness gate (StaleTTL) rejects recommendations that aged out before execution.
    • Storage gate scoped strictly to maintenance evacuation + QEMU, never to automatic rule-violation migrations on local-disk VMs.
    • Affinity enforcement preserved across PVE flap (zero LastSeenAt fail-closed).
    • Target mutation in mergeRecommendations resets confirmation counter.
    • mergeRecommendations partitions by recommendation origin (maintenance / rule / load-balance) so flags can't bleed across classes.
    • EvacuateNode supersedes prior pending evacuations for the same (cluster, source-node).
  • DRS settings UI cleanup. Advanced section reorganized into Migration
    limits, Migration behavior, and Resource weights subsections with icons.
    Slider helper text moved to tooltip with ? icon. Dead-knob toggles
    removed ("Migrate larger first", "Prevent overprovisioning" with
    misleading scope). EWMA formula descriptive block removed.
  • Rebalance interval supports 15m and 30m in addition to hourly options.

Migration

  • Migrate-to-Proxmox button greyed out on single-disk Proxmox nodes
    fixed
    (#331). When / is the only large filesystem on the target
    (no separate /var/lib/vz, LVM-thin storage not visible to df), the
    preflight returned an empty tempStorages list, hiding the Temporary
    Storage selector and silently disabling the Migrate button. /tmp is
    now synthesized as a fallback when the root filesystem has at least
    1 GiB free, and a defensive Alert surfaces the truly degenerate case.
  • Long-running PVE config PUT timeouts on slow storage fixed
    (#332, #334). ZFS-over-iSCSI auto-attach was failing with an 8s
    timeout while the underlying PUT took 20+ seconds. The failover
    masquerade then reported a fake "all cluster nodes unreachable"
    error. All migration-time /qemu/{vmid}/config PUTs now use a 120s
    timeout.
  • curl stderr surfaced + orphan LVM freed on stream failure (#316).

Rolling update

  • Respect reboot_timeout end-to-end with sustained-online polling
    • verify retry (backend #2). waitForNodeOnline used to return on the
      first online sighting. After a reboot pmxcfs can briefly report online
      while corosync re-joins, then flip back to unknown. Now requires 3
      consecutive online sightings (10s sustained), and verifyNodeHealth
      polls for up to 60s instead of one-shot.
  • Scope reboot_timeout deadline to the reboot path only so a short
    value doesn't shorten the standalone verify window for non-reboot
    updates.
  • Run apt / ha-manager / ceph / reboot as root via sudo -n when
    the PVE connection uses a non-root SSH user (backend #1).
  • Surface node version and API token permission errors in the
    rolling-update UI (#318).

Deployment & install

  • Backfill ORCHESTRATOR_API_KEY on upgrade and refuse placeholder
    at startup (#330). Pre-v1.4.0 installs without the key, and
    .env.example placeholder leakage, are detected and fixed by the
    installer. The frontend container refuses to boot with the placeholder.
  • Auto-generate INTERNAL_API_TOKEN outside Docker for source-built
    installs.
  • Install URL uses proxcenter.io/install/* instead of the get.
    subdomain.

AI

  • Test connection for Ollama fixed (#314, #315). The provider check
    was broken since the auth refactor.

Security

  • SSRF guard on AI test and models endpoints (#335). The ai/test
    and ai/models routes accept user-supplied base URLs for Ollama and
    OpenAI-compatible providers. The validator now blocks cloud metadata
    endpoints (AWS 169.254.169.254, Alibaba 100.100.100.200, OCI
    192.0.0.192, AWS IPv6 IMDS), strips IPv6 brackets before comparison,
    and performs a DNS lookup so DNS aliases (such as *.nip.io style
    hostnames) that resolve to blocked addresses are rejected. Loopback
    and RFC1918 remain reachable for legitimate local Ollama setups.
    Closes the 2 critical CodeQL alerts (js/request-forgery) on these
    routes.
  • Bump ws to 8.20.1 (CVE-2026-45736) (#335).
  • Bump bundled npm to 11.15.0 in the runner image (covers
    brace-expansion < 5.0.6 / CVE-2026-45149) (#335).
  • Patch bundled npm in runner image for CVE-2026-42338 (ip-address
    < 10.1.1) (#311).
  • Tighten enterprise.proxmox.com URL spoofing check in the license
    validator (#306).
  • Backend: bump go-ntlmssp to v0.1.1, Alpine base 3.19 to 3.22,
    sanitise filename components against path injection in the reports
    generator.
  • Frontend: add shell-arg validators on routes that build SSH commands,
    allow testing SSH against unsaved form values.

Quality & test coverage

  • New PR-only SonarCloud Quality Gate workflow with proper LCOV path
    rewriting and baseline analysis on main.
  • New Vitest route-handler harness, with tests for the connections POST
    route, SSH test endpoint, orchestrator client, and SSH helpers.
  • Multiple Sonar bug, vulnerability, and smell cleanups.

Dependencies

  • Node 22-alpine to 26-alpine on the frontend image.
  • Various dependabot bumps (eslint-config-next, stylelint,
    softprops/action-gh-release).

Upgrade notes

  • No schema changes since v1.4.0. PostgreSQL connection string unchanged.
  • The DRS Settings UI presents max_concurrent_migrations_per_cluster
    instead of max_concurrent_migrations. Existing configs are
    auto-migrated at runtime (per-cluster falls back to 2 when persisted
    value is 0). The legacy max_concurrent_migrations field is still
    parsed from existing YAML / DB rows but no longer enforced.
  • rebalance_interval now accepts 15m and 30m in addition to the
    hourly options.
  • AI provider URLs are now subject to an SSRF guard. URLs targeting
    cloud metadata endpoints (link-local 169.254.x, Alibaba, OCI, AWS
    IPv6 IMDS) are refused with an explicit error message. Local Ollama
    setups using localhost, 127.0.0.1, or RFC1918 addresses are
    unaffected.

Docker Images

docker pull ghcr.io/adminsyspro/proxcenter-frontend:v1.4.1
docker pull ghcr.io/adminsyspro/proxcenter-orchestrator:v1.4.1
docker pull ghcr.io/adminsyspro/proxcenter-weasyprint:v1.4.1

Breaking Changes

  • Removed global `max_concurrent_migrations` cap; UI now uses per‑cluster `max_concurrent_migrations_per_cluster` (legacy field parsed but ignored).
  • Bumped frontend Node runtime from Alpine 22 to Alpine 26.

Security Fixes

  • SSRF guard on AI `test` and `models` endpoints blocks cloud metadata IPs (AWS, Alibaba, OCI, AWS IPv6 IMDS) – closes CodeQL alerts.
  • Bumped `ws` to 8.20.1 (CVE-2026-45736).
  • Bumped bundled `npm` to 11.15.0 in runner image (covers CVE-2026-45149).
  • Patched bundled npm for CVE-2026-42338 (`ip-address` < 10.1.1).

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track ProxCenter

Get notified when new releases ship.

Sign up free

About ProxCenter

Modern web interface for Proxmox

All releases →

Related context

Related CVEs

Earlier breaking changes

  • v1.4.0 ProxCenter v1.4.0 drops SQLite and requires PostgreSQL.

Beta — feedback welcome: [email protected]