Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain shipped config constants
-
ExploitCompute deterministic JWT signing key
-
ExecutionForge unsubscribe/subscribe-confirm JWT
-
ImpactPOST to API, deactivate contacts
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Authentication mechanism
|
| Exploitation Conditions | No special conditions beyond running a default BillionMail instance at version 4.9 or earlier with its shipped configuration: the JWT signing key is computed from configuration constants distributed in the project's config.yaml, so standard installations are vulnerable out of the box with no attacker authentication (PR:N) and no user interaction. Exploitation requires the /api/unsubscribe, /api/unsubscribe_new, or /api/subscribe/confirm endpoints to be network-reachable, and to target a specific victim the attacker needs the relevant contact/subscription identifier (e.g. email address). The practical limiting factor is impact scope - only unsubscribe/subscribe-confirm subscription state can be manipulated, not authentication, code execution, or stored data. |
| Impact | This is a genuine but moderate-priority issue rather than a critical one. The CVSS 4.0 base score of 6.9 (medium) is consistent with the attack profile: AV:N/AC:L/AT:N/PR:N/UI:N means a remote, unauthenticated attacker can exploit default installations with low complexity and no user interaction, because the JWT signing key is deterministically derivable from configuration constants shipped in the repository (config.yaml) and consumed by jwt.go. However, impact is deliberately scoped low - VC:N (no confidentiality loss), with VI:L and VA:L - reflecting that forged tokens only manipulate subscription state (deactivating contacts, forcing confirmed subscriptions), not code execution, data theft, or account takeover. No EPSS score and no CISA KEV entry are present in the input, so there is no signal of active or widespread exploitation; this reads as a researcher-disclosed flaw (reported by VulnCheck) rather than an observed in-the-wild campaign. A detailed public technical writeup (hackmd) documents how to compute the key, which materially lowers the practical barrier even though no packaged exploit is flagged in the input. Net: patch promptly on any internet-facing BillionMail deployment because exploitation is trivial and unauthenticated, but the limited integrity/availability impact keeps this below the urgency of an RCE or authentication bypass. |
| Exploit ScenarioDerived | An attacker reads BillionMail's publicly shipped configuration constants, reconstructs the deterministic JWT signing key, and forges valid unsubscribe or subscribe-confirm tokens for arbitrary contacts. They then POST the forged tokens to /api/unsubscribe, /api/unsubscribe_new, or /api/subscribe/confirm to deactivate legitimate contacts or force confirmed subscriptions. A public technical writeup already details the key-derivation and forgery method, so the exploitation path is low-complexity, remote, and unauthenticated. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 15, 2026
Unauthenticated attackers can forge unsubscribe and subscribe-confirmation JWTs against BillionMail through version 4.9 because the token signing key is deterministically computed from default configuration constants that ship with the project. By submitting forged tokens to /api/unsubscribe, /api/unsubscribe_new, or /api/subscribe/confirm, an attacker who knows the target contact identifier (e.g. an email address) can deactivate that contact or force a subscription to be confirmed. The flaw is remotely reachable with no authentication (CVSS vector PR:N) and no user interaction; there is confirmed KEV status? No - it is not in CISA KEV and no public exploit identified at time of analysis, impact is confined to integrity and availability of subscription state, making this a genuine but moderate-priority issue rather than a critical one.
RemediationAI
No vendor-released patch identified at time of analysis; track https://github.com/aaPanel/BillionMail and the VulnCheck advisory (https://www.vulncheck.com/advisories/billionmail-through-4.9-forgeable-jwts-via-default-signing-key) for an official fix version before upgrading. As an immediate compensating control, override the modeled JWT signing key in config.yaml with a high-entropy secret (at least 32 random bytes from a CSPRNG) that is not derived from shipped constants, restrict the file's permissions to the service account, and rotate it - the trade-off is that every previously issued unsubscribe/subscribe-confirm link becomes invalid, so in-flight email links will fail and recipients may need re-issued mailings. Where the endpoints must remain internet-facing for legitimate email opt-out flows, avoid blanket IP blocking and instead apply reverse-proxy rate limiting, WAF signatures for anomalous token patterns, and alerting on unsubscribe bursts or confirms that do not correlate with outbound campaign volumes; additionally consider binding each token to a server-side per-contact nonce so a token cannot be regenerated solely from public constants, accepting the small added state and storage cost. Log and review existing unsubscribe/confirm activity for tampering before rotating the key, since the forgery leaves valid signatures in application logs.
Affected VersionsENISA
Affected Packages
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
BillionMail, an aaPanel (vendor identifier in CPE cpe:2.3:a:aapanel:billionmail) bulk-mailing product, issues JSON Web Tokens that are embedded in outbound email links to perform unauthenticated actions such as unsubscribing a recipient or confirming a double opt-in subscription. The root cause is CWE-1394 (Use of Default Cryptographic Key): rather than generating a random, per-installation HMAC secret, the application derives the JWT signing key from static constants committed in the project's shipped configuration (core/manifest/config/config.yaml) and used by the token service at core/internal/service/batch_mail/jwt.go (lines 98-123 of the v4.9 source). Because the constants are public on GitHub, anyone can reproduce the key derivation offline and mint tokens that pass the server's HMAC signature check - no key disclosure, memory corruption, or authentication bypass is required, only knowledge of the derivation inputs. The practical limiting factor is that the forged tokens only grant the rights attached to these token types, so the attacker can manipulate subscription state for a known contact identifier but cannot gain accounts, execute code, read stored data, or extract email content. This analysis is consistent with an independent assessment of CVSS 3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L, a public technical write-up of the deterministic-secret forgery technique, and the absence of any vendor patch reference in the available intelligence.
Know when Billionmail 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N
Key is deterministically derivable from shipped constants so AC:L and PR:N (unauthenticated, network); impact limited to altering subscription state, hence C:N, I:L, A:L.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
BillionMail through 4.9 contains a hard-coded cryptographic key vulnerability that allows unauthenticated attackers to forge unsubscribe and subscribe-confirm JWTs by computing the key from shipped configuration constants. Attackers can submit forged tokens to /api/unsubscribe, /api/unsubscribe_new, or /api/subscribe/confirm to deactivate any contact or force confirmed subscriptions.
Threat Intelligence Overview
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.
EUVD-2026-102507
GHSA-h86v-9fhw-gvch
NVD
CVE.org
EPSS
Exploit-DB