Proxmox VE 7 is vulnerable to some type of 0day/RCE non auth

Does OVH really deploy PVE7 still in 2026? Or isn't it more that folks start with some version and then never update due to the non-dying "never change a running system"-bullshit? And since you mention wireguard: If that's available why don't they use it? "Zero knowledge" doesn't excuse lazyness



And they wouldn't if they wouldn't have run EOL software. If you have zero knowledge you shouldn't run servers exposed to the Internet. Given that stuff like tailscale/netbird/pangolin/cloudfare tunnels are available there is no reason why anybody should expose stuff on the internet.
They deploy PVE9, I did a server today, but they still doing a just one big disk ext4 setup. :(

Had to install over KVM.
 
OVH deploys PVE8 last I saw, unsure about presently.
I think there is a disconnect, that mass providers like OVH with 1-click installation have lowered the barrier to entry to using software such as PVE widely.

From some of the people I spoke to who were impacted by this, they either didn't even know they could SSH into the server to patch major versions, or assumed the UI gave them everything they needed. I agree it doesn't excuse laziness, but, "you don't know what you don't know" is also a thing. Some of people genuinely have no idea.

Software (such as PVE) has just become so much more consumable by people who otherwise don't know anything past the surface. Even some of the folks in this thread asking for help, you can tell they do not know the full extent of their software, nor how much is exposed by keeping UI interfaces on public nets. I do agree, it is 100% the consumers fault.

I just think the whole point and laugh + gatekeep response that happens on forums like this get is why people don't ask for help until it is too late lol.


Yeah modern day software has made this less of an issue, again, agreed.
The likes of docker have allowed this as well, automation allowing people who normally wouldnt go near it, do it directly themselves.
 
We were compromised through CVE-2023-54391 on 1–2 September and rebuilt 22 nodes from backup. A few of the post-exploitation findings cost us real time, so probably worth sharing here.

Getting the obvious out of the way first: we were on 7.4, well past EOL, with 8006 reachable from the internet because our customers log into it. That was our decision and our consequence.

**What was left behind**

An eBPF rootkit on every node, loaded by a systemd unit with a random 8-character name and `Description=System Management Daemon`. It hides its own files and processes from `ls`, `find` and `ps`, blocks `kill` against its own PIDs, blocks `ptrace`, and rewrites Monero addresses in flight. `dpkg -V` came back clean on `top`, `procps` and `libc6` — because the binaries genuinely are clean. The interception is in the kernel.

Detection is one command, and it's the only check the rootkit can't filter:

bpftool map show | grep -E 'protected_pids|exempt_comm|hidden_filename|ghost_files|hidden_names'

Any output means infected. If `bpftool` is missing, copy it from another node — on a host where dpkg keeps getting killed, apt won't finish.

`kill` doesn't work on it either, since it hooks that too. Use the cgroup — `echo 1 > /sys/fs/cgroup/<path>/cgroup.kill` — and disable, mask and remove the unit before killing.

**The part that cost us the most time**

We restored a host in place with `rsync -aHAX --delete` from backup. It completed without error and the rootkit was still resident.

The rootkit hides its files from `getdents`, and `rsync --delete` enumerates the destination with `getdents`. Files it can't see are files it doesn't delete, so the unit file and binaries survived a restore that reported success.

The order that worked: remove the rootkit, confirm with `bpftool map show`, **reboot**, then rsync. Hosts we rebuilt from a live USB never had this problem, because the hooked kernel isn't running.

**Cluster config**

`/etc/pve` has to be preserved for quorum, so it doesn't get restored — and that's where the API tokens and any added accounts live. We rebuilt 22 clean hosts and every one came back into a config that still held both, and that was our omission.

It was our fortune that before we open port 8006 again, we build additional checks on authenticity of any login, in addition to Proxmox's own authentication. This guards are based on a few vectors including IP address, past login records and patterns, and immediately blocks suspicious logins. It was this mechanism that detected the use and existance of the planted tokens. May be we should contribute our code to Proxmox for this part! :D

Therefore, worth checking `/etc/pve/priv/token.cfg` and your user list against your own provisioning records. Tokens don't appear in `pveum user list`, so an account audit won't surface them.

Honestly Proxmox is good piece of software. Software has bugs and sysadmin should never trust the authentication logic of Proxmox as well as those of other hypervisors. Always install guards that fit your need and that's a lesson we learned.

Here full write-up with IOCs, timeline, how actors exploited qemu-ga, plus many malicious or hacked IP addresses:

https://hosting.netfront.net/announ...-cluster-compromised-and-how-we-restored.html
I suppose a middle ground for your needs is use a front end in front of Proxmox, it has an API system, but even a simple reverse proxy might work, have this front end block root level login's. Then firewall of 8006 to staff. I really would not be keen on having that open to the internet.

Now my own little confession, I today updated a 7.2 node (yes not even 7.4), it was left to rot, as it was planned to retire the machine for a long time, but only recently it was decided to keep it. So I had a look to see what was going on, it was on 7.2, a build that has no pve7to8 binary, I couldnt do a clean update to 7.4 as the debian repo is now offline, but luckily the proxmox repo is still online, so I at least updated pve components. I then had to override certificate errors for debian 12 repo as had an outdated keyring package, its now 0n 8.4, with the nag its EOL since end of August. Will be updated again tomorrow to 9.x.

This is firewalled off to just me and one other person, so no compromise. There is also not much running on it as I said it was going to be retired.
 
Last edited: