CVE-2026-9021 (GCVE-0-2026-9021)
Vulnerability from cvelistv5 – Published: 2026-07-09 09:31 – Updated: 2026-07-09 13:52
VLAI
EPSS
VEX
Title
Easy Invoice <= 2.1.19 - Unauthenticated Arbitrary Quote Accept/Decline and Invoice Creation via easy_invoice_accept_quote / easy_invoice_decline_quote AJAX Actions
Summary
The Easy Invoice plugin for WordPress is vulnerable to Missing Authorization in versions up to, and including, 2.1.19. This is due to the plugin registering the easy_invoice_accept_quote and easy_invoice_decline_quote AJAX actions via wp_ajax_nopriv_ hooks and relying solely on a quote-scoped nonce that is rendered into the publicly accessible single quote template, combined with an ownership check that is gated behind an off-by-default Pro option (easy_invoice_pro_restrict_quote_to_client). This makes it possible for unauthenticated attackers to accept or decline arbitrary published quotes — and, depending on the configured accept action, automatically convert them into invoices (and even email them to the client) — by harvesting the per-quote nonce from the public quote page and submitting it to admin-ajax.
Severity
5.3 (Medium)
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator (v2.0.3)
CWE
- CWE-862 - Missing Authorization
Assigner
References
10 references
Impacted products
1 product
| Vendor | Product | Version | |
|---|---|---|---|
| matrixaddons | Easy Invoice – Invoice Generator, PDF Quotes & Payments |
Affected:
0 , ≤ 2.2.19
(semver)
|
Credits
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-9021",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-09T13:51:54.715152Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-07-09T13:52:00.900Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"product": "Easy Invoice \u2013 Invoice Generator, PDF Quotes \u0026 Payments",
"vendor": "matrixaddons",
"versions": [
{
"lessThanOrEqual": "2.2.19",
"status": "affected",
"version": "0",
"versionType": "semver"
}
]
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "PeterPatter"
}
],
"descriptions": [
{
"lang": "en",
"value": "The Easy Invoice plugin for WordPress is vulnerable to Missing Authorization in versions up to, and including, 2.1.19. This is due to the plugin registering the easy_invoice_accept_quote and easy_invoice_decline_quote AJAX actions via wp_ajax_nopriv_ hooks and relying solely on a quote-scoped nonce that is rendered into the publicly accessible single quote template, combined with an ownership check that is gated behind an off-by-default Pro option (easy_invoice_pro_restrict_quote_to_client). This makes it possible for unauthenticated attackers to accept or decline arbitrary published quotes \u2014 and, depending on the configured accept action, automatically convert them into invoices (and even email them to the client) \u2014 by harvesting the per-quote nonce from the public quote page and submitting it to admin-ajax."
}
],
"metrics": [
{
"cvssV3_1": {
"baseScore": 5.3,
"baseSeverity": "MEDIUM",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N",
"version": "3.1"
}
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-862",
"description": "CWE-862 Missing Authorization",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-07-09T09:31:23.000Z",
"orgId": "b15e7b5b-3da4-40ae-a43c-f7aa60e62599",
"shortName": "Wordfence"
},
"references": [
{
"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/dab1c93d-e83c-4d38-be80-56d8e32f1894?source=cve"
},
{
"url": "https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L1022"
},
{
"url": "https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L1453"
},
{
"url": "https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L88"
},
{
"url": "https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/templates/quotes/single.php#L1462"
},
{
"url": "https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L1022"
},
{
"url": "https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L1453"
},
{
"url": "https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L88"
},
{
"url": "https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/templates/quotes/single.php#L1462"
},
{
"url": "https://plugins.trac.wordpress.org/changeset/3517910/easy-invoice/trunk/includes/Controllers/QuoteController.php"
}
],
"timeline": [
{
"lang": "en",
"time": "2026-07-08T20:50:02.000Z",
"value": "Disclosed"
}
],
"title": "Easy Invoice \u003c= 2.1.19 - Unauthenticated Arbitrary Quote Accept/Decline and Invoice Creation via easy_invoice_accept_quote / easy_invoice_decline_quote AJAX Actions"
}
},
"cveMetadata": {
"assignerOrgId": "b15e7b5b-3da4-40ae-a43c-f7aa60e62599",
"assignerShortName": "Wordfence",
"cveId": "CVE-2026-9021",
"datePublished": "2026-07-09T09:31:23.000Z",
"dateReserved": "2026-05-19T15:07:10.933Z",
"dateUpdated": "2026-07-09T13:52:00.900Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"epss": {
"cve": "CVE-2026-9021",
"date": "2026-07-10",
"epss": "0.00297",
"percentile": "0.21517"
},
"nvd": "{\"cve\":{\"id\":\"CVE-2026-9021\",\"sourceIdentifier\":\"security@wordfence.com\",\"published\":\"2026-07-09T11:16:41.900\",\"lastModified\":\"2026-07-09T16:19:45.567\",\"vulnStatus\":\"Deferred\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"The Easy Invoice plugin for WordPress is vulnerable to Missing Authorization in versions up to, and including, 2.1.19. This is due to the plugin registering the easy_invoice_accept_quote and easy_invoice_decline_quote AJAX actions via wp_ajax_nopriv_ hooks and relying solely on a quote-scoped nonce that is rendered into the publicly accessible single quote template, combined with an ownership check that is gated behind an off-by-default Pro option (easy_invoice_pro_restrict_quote_to_client). This makes it possible for unauthenticated attackers to accept or decline arbitrary published quotes \u2014 and, depending on the configured accept action, automatically convert them into invoices (and even email them to the client) \u2014 by harvesting the per-quote nonce from the public quote page and submitting it to admin-ajax.\"}],\"affected\":[{\"source\":\"security@wordfence.com\",\"affectedData\":[{\"vendor\":\"matrixaddons\",\"product\":\"Easy Invoice \u2013 Invoice Generator, PDF Quotes \u0026 Payments\",\"defaultStatus\":\"unaffected\",\"versions\":[{\"version\":\"0\",\"lessThanOrEqual\":\"2.2.19\",\"versionType\":\"semver\",\"status\":\"affected\"}]}]}],\"metrics\":{\"cvssMetricV31\":[{\"source\":\"security@wordfence.com\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N\",\"baseScore\":5.3,\"baseSeverity\":\"MEDIUM\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"NONE\",\"integrityImpact\":\"LOW\",\"availabilityImpact\":\"NONE\"},\"exploitabilityScore\":3.9,\"impactScore\":1.4}],\"ssvcV203\":[{\"source\":\"134c704f-9b21-4f2e-91b3-4a467353bcc0\",\"ssvcData\":{\"timestamp\":\"2026-07-09T13:51:54.715152Z\",\"id\":\"CVE-2026-9021\",\"options\":[{\"exploitation\":\"none\"},{\"automatable\":\"no\"},{\"technicalImpact\":\"partial\"}],\"role\":\"CISA Coordinator\",\"version\":\"2.0.3\"}}]},\"weaknesses\":[{\"source\":\"security@wordfence.com\",\"type\":\"Secondary\",\"description\":[{\"lang\":\"en\",\"value\":\"CWE-862\"}]}],\"references\":[{\"url\":\"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L1022\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L1453\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L88\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/templates/quotes/single.php#L1462\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L1022\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L1453\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L88\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/templates/quotes/single.php#L1462\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://plugins.trac.wordpress.org/changeset/3517910/easy-invoice/trunk/includes/Controllers/QuoteController.php\",\"source\":\"security@wordfence.com\"},{\"url\":\"https://www.wordfence.com/threat-intel/vulnerabilities/id/dab1c93d-e83c-4d38-be80-56d8e32f1894?source=cve\",\"source\":\"security@wordfence.com\"}]}}",
"vulnrichment": {
"containers": "{\"adp\": [{\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-9021\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"none\"}, {\"Automatable\": \"no\"}, {\"Technical Impact\": \"partial\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-07-09T13:51:54.715152Z\"}}}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-07-09T13:51:58.373Z\"}}], \"cna\": {\"title\": \"Easy Invoice \u003c= 2.1.19 - Unauthenticated Arbitrary Quote Accept/Decline and Invoice Creation via easy_invoice_accept_quote / easy_invoice_decline_quote AJAX Actions\", \"credits\": [{\"lang\": \"en\", \"type\": \"finder\", \"value\": \"PeterPatter\"}], \"metrics\": [{\"cvssV3_1\": {\"version\": \"3.1\", \"baseScore\": 5.3, \"baseSeverity\": \"MEDIUM\", \"vectorString\": \"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N\"}}], \"affected\": [{\"vendor\": \"matrixaddons\", \"product\": \"Easy Invoice \\u2013 Invoice Generator, PDF Quotes \u0026 Payments\", \"versions\": [{\"status\": \"affected\", \"version\": \"0\", \"versionType\": \"semver\", \"lessThanOrEqual\": \"2.2.19\"}], \"defaultStatus\": \"unaffected\"}], \"timeline\": [{\"lang\": \"en\", \"time\": \"2026-07-08T20:50:02.000Z\", \"value\": \"Disclosed\"}], \"references\": [{\"url\": \"https://www.wordfence.com/threat-intel/vulnerabilities/id/dab1c93d-e83c-4d38-be80-56d8e32f1894?source=cve\"}, {\"url\": \"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L1022\"}, {\"url\": \"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L1453\"}, {\"url\": \"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/includes/Controllers/QuoteController.php#L88\"}, {\"url\": \"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.2.0/templates/quotes/single.php#L1462\"}, {\"url\": \"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L1022\"}, {\"url\": \"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L1453\"}, {\"url\": \"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/includes/Controllers/QuoteController.php#L88\"}, {\"url\": \"https://plugins.trac.wordpress.org/browser/easy-invoice/tags/2.1.12/templates/quotes/single.php#L1462\"}, {\"url\": \"https://plugins.trac.wordpress.org/changeset/3517910/easy-invoice/trunk/includes/Controllers/QuoteController.php\"}], \"descriptions\": [{\"lang\": \"en\", \"value\": \"The Easy Invoice plugin for WordPress is vulnerable to Missing Authorization in versions up to, and including, 2.1.19. This is due to the plugin registering the easy_invoice_accept_quote and easy_invoice_decline_quote AJAX actions via wp_ajax_nopriv_ hooks and relying solely on a quote-scoped nonce that is rendered into the publicly accessible single quote template, combined with an ownership check that is gated behind an off-by-default Pro option (easy_invoice_pro_restrict_quote_to_client). This makes it possible for unauthenticated attackers to accept or decline arbitrary published quotes \\u2014 and, depending on the configured accept action, automatically convert them into invoices (and even email them to the client) \\u2014 by harvesting the per-quote nonce from the public quote page and submitting it to admin-ajax.\"}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-862\", \"description\": \"CWE-862 Missing Authorization\"}]}], \"providerMetadata\": {\"orgId\": \"b15e7b5b-3da4-40ae-a43c-f7aa60e62599\", \"shortName\": \"Wordfence\", \"dateUpdated\": \"2026-07-09T09:31:23.000Z\"}}}",
"cveMetadata": "{\"cveId\": \"CVE-2026-9021\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-07-09T13:52:00.900Z\", \"dateReserved\": \"2026-05-19T15:07:10.933Z\", \"assignerOrgId\": \"b15e7b5b-3da4-40ae-a43c-f7aa60e62599\", \"datePublished\": \"2026-07-09T09:31:23.000Z\", \"assignerShortName\": \"Wordfence\"}",
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
}
}
Loading…
Loading…
Experimental. This forecast is provided for visualization only and may change without notice. Do not use it for operational decisions.
Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
Loading…