Skip to main content

PostfixAdmin EUVDEUVD-2026-115896

| CVE-2026-121551 MEDIUM
Cross-site Scripting (XSS) (CWE-79)
2026-11-03 VulnCheck GHSA-3mcr-px3q-mcw8
5.1
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate as low-privilege mailbox user
  2. Delivery
    Create TOTP exception with scripted description
  3. Exploit
    Payload stored unescaped in database
  4. Execution
    Global admin views totp-exceptions.php
  5. Persist
    Script executes in admin session
  6. Impact
    Issue authenticated admin requests via CSRF token

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires (1) a valid authenticated mailbox user account on the PostfixAdmin instance, and (2) the TOTP feature enabled (the vulnerable workflow is creating a TOTP exception on totp-exceptions.php; the patched test fixture sets config 'totp' = 'YES'). The stored payload only executes when a global administrator subsequently opens totp-exceptions.php, so admin interaction is a hard prerequisite (UI:P) - it does not fire on its own. Limiting factors that reduce realistic risk below the raw score: exploitation is gated on attacker holding a legitimate low-privilege account (PR:L), on TOTP exceptions being in use, and on an administrator actually viewing the affected list page; the companion app-passwords.php list has the same escaping flaw fixed in the same commit. Affected versions are PostfixAdmin through 4.0.5.

Impact

This is a medium-severity stored XSS (vendor CVSS 4.0 base 5.1; CWE-79) whose real-world risk is moderate and clearly bounded, not a drop-everything emergency. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N) tells a consistent story with the description: the injector must already hold a low-privilege mailbox account (PR:L), and exploitation only fires when a global administrator passively views totp-exceptions.php (UI:P). The source-code evidence confirms the mechanism - the patched commit removes the false third argument on $smarty->assign('pExceptions', ...) (and the matching app-passwords assignment), which had disabled Smarty's output escaping, so a stored description was rendered as raw HTML. Impact is limited to the subsequent (admin) system (SC:L/SI:L) rather than the attacker's own account (VC/VI/VA:N), which is why severity stays medium despite the admin-session consequence. KEV status is not listed, so this is not confirmed actively exploited; no EPSS score was supplied, so exploitation probability cannot be quantified from the input and that gap should be noted rather than assumed low or high. The vuln.today decision label is 'this_month', consistent with a medium flaw that has a vendor patch but no confirmed in-the-wild use. Net: a genuine privilege-boundary-crossing bug (mailbox user → admin context) worth remediating on a routine monthly cycle, gated by the need for a valid account, the TOTP feature being enabled, and an admin actually opening the exceptions page.

Exploit ScenarioDerived

An authenticated low-privilege mailbox user creates a TOTP exception whose description field contains a script payload, which is stored unescaped in the database. When a global administrator later opens totp-exceptions.php, the payload executes in the admin's authenticated browser session and can issue admin-level requests reusing the page's CSRF token, effectively escalating a mailbox user toward administrative actions. No confirmed working public exploit is identified in the input, though VulnCheck published an advisory and the GitHub issue (#1185) documents the flaw.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Nov 03, 2026

Stored cross-site scripting in PostfixAdmin through 4.0.5 lets an authenticated mailbox user persist a script payload in the description field of a TOTP exception, which then executes in the browser of a global administrator who opens totp-exceptions.php and can issue authenticated admin requests using that page's CSRF token. The same output-escaping defect exists in the application-password list (app-passwords.php), which the vendor commit fixes alongside the TOTP list. Exploitation is bounded: it needs a legitimate low-privilege mailbox account, the TOTP feature in use, and an administrator actually viewing the affected list page; the upstream fix is public (PRs #1172 and #1186), no tagged patched release is confirmed in the supplied data, and no public exploit code or active exploitation was identified at time of analysis.

RemediationAI

Upstream fix available (PR/commit); released patched version not independently confirmed in the provided data. Apply commit 0a894b08769481ce1a7f0f42af901c6d9f88fa9c on the 4.0.x line (a backport of PR https://github.com/postfixadmin/postfixadmin/pull/1172, tracked via issue https://github.com/postfixadmin/postfixadmin/issues/1185 and PR https://github.com/postfixadmin/postfixadmin/pull/1186), or upgrade to the first tagged release that contains that commit once the vendor publishes it, and confirm the deployed totp-exceptions.php and app-passwords.php no longer pass the third noescape argument to $smarty->assign. The commit's tests/SecurityListOutputTest.php can be used as a verification check across the mailbox, domain-admin and global-admin list pages, and the CHANGELOG.TXT entry for the release should reference the escape fix for TOTP-exception and application-password descriptions. Until the patch is deployed, reduce exposure by setting the TOTP feature off (config 'totp' = 'NO') so the vulnerable TOTP exception workflow is not reachable, accepting that this removes TOTP exception management for users; note that this leaves the identical escaping flaw in the application-password list, so disabling app passwords ('app_passwords' = 'NO') is required for full interim coverage. Patching only one of the two pages is insufficient because the same noescape assignment pattern was fixed in both. Review the totp_exception_address and mailbox_app_password tables for descriptions containing markup that may have been planted before the fix.

Affected VersionsENISA

postfixadmin 0 ≤4.0.5

Affected Packages

euvd postfixadmin no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

PostfixAdmin is a PHP web application that manages Postfix mailboxes, domains and aliases, and it renders its administrative and user-facing pages through the Smarty templating engine. The root cause is CWE-79 (improper neutralization of input during web page generation): in public/users/totp-exceptions.php the exception rows were handed to the template with $smarty->assign('pExceptions', $exceptions, false), and Smarty's third argument disables output escaping, so the attacker-controlled description column from the totp_exception_address table was emitted raw into templates/totp-exceptions.tpl (around line 56). The vendor commit 0a894b08769481ce1a7f0f42af901c6d9f88fa9c removes the noescape argument on both public/users/totp-exceptions.php and public/users/app-passwords.php, adds a CHANGELOG entry noting the backport of #1172, and adds tests/SecurityListOutputTest.php, an HTTP-level regression test that stores descriptions in the mailbox_app_password and totp_exception_address tables and asserts that the mailbox, domain-admin and global-admin security list pages render those values as text. Because the payload is stored server-side and rendered only in the administrator's privileged context, the impact is scoped change (S:C) confined to low confidentiality and integrity of the admin session, consistent with the assessed CVSS:3.1 vector AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N and the vendor CVSS 4.0 base score of 5.1. The trigger is a normal page view of the affected list by the administrator; no special memory or race condition is involved.

Know when Postfixadmin gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (VulnCheck) PRIMARY 5.1 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N
vuln.today AI 5.4 MEDIUM

Authenticated mailbox user injects (PR:L) and an admin must view the page (UI:R); payload runs in the admin's different security context (S:C) with limited confidentiality/integrity impact and no availability impact.

3.1 AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
Low
User Interaction
Passive
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
Low
Subsequent system: Integrity
Low
Subsequent system: Availability
None

DescriptionCVE.org

PostfixAdmin through 4.0.5 contains a stored cross-site scripting vulnerability that allows authenticated mailbox users to inject script by creating a TOTP exception with an unescaped description. When a global administrator views totp-exceptions.php, the script runs in the admin session and can issue authenticated admin requests using the page's CSRF token.

Threat Intelligence Overview

Prevalence
Medium
common open-source Postfix web admin; mostly self-hosted mail deployments, not ubiquitous
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org Vulnrichment GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

26
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +26
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy