Skip to content
eastbaycyber

CVE-2026-109220: WooCommerce PDF Invoice RCE

CVSS · Critical
9.8
In CISA KEV
No
Published
Oct 31
Patch SLA & TriageVector: Network
24 to 48 hours

Critical CVSS (9.8) reachable over network.

Exposure:
Control:
CVSS v3.1 Blast RadiusScore: 9.8
Decode Vector & Sub-Scores →
CVE explainers 10 min read
Security Research Desk Source-checked
Auto-checked against the official CVE record · Human-reviewed after publishing · Updated 2026-10-31
▲ Escalation ViewOne CVE, briefed at three altitudes — skim the Brief, weigh the Impact, or work the Runbook. The way a SOC actually reads it.
CISOBrief · 30-second brief

CVE-2026-109220 is a critical PDF Invoice for WooCommerce vulnerability that can reportedly enable unauthenticated PHP object injection and remote code execution (RCE). The issue affects plugin versions through 7.1.1. Administrators should upgrade to 7.2.0 or later, or remove the plugin if an upgrade is not immediately possible.

TL;DR

  • CVE-2026-109220 affects PDF Invoice for WooCommerce + Drag and Drop Template Builder through version 7.1.1.
  • The reported attack path uses the public WooCommerce checkout endpoint and does not require a WordPress account.
  • Upgrade to 7.2.0 or later, or deactivate and remove the plugin after confirming it is no longer required.
  • No verified public PoC or confirmed in-the-wild exploitation was identified as of 2026-10-31.
AnalystImpact · assess the risk

Are You Affected?

CVE-2026-109220 affects the WordPress plugin PDF Invoice for WooCommerce + Drag and Drop Template Builder, whose WordPress.org package slug is pdf-for-woocommerce.

The vulnerable code reportedly processes the WooCommerce customer_note checkout field during invoice generation. Your site may be affected if the plugin is installed and active at version 7.1.1 or earlier, particularly when the site exposes a public WooCommerce checkout flow.

Field Details
CVE CVE-2026-109220
Severity Critical
CVSS 9.8
Attack vector Network
Authentication None required, according to the NVD description
Vulnerable parameter customer_note
Affected product PDF Invoice for WooCommerce + Drag and Drop Template Builder
Package slug pdf-for-woocommerce
Affected versions All versions up to and including 7.1.1
Apparent fixed version 7.2.0
Patch available Yes, based on the official WordPress.org 7.2.0 package
CISA KEV No, as of 2026-10-31

The reported attack path uses:

POST /wc/store/v1/checkout

According to the available description, an attacker can submit crafted content through customer_note during an anonymous checkout. Direct Bank Transfer or cheque payment methods may cause the order to transition to on-hold, which can trigger invoice generation and the vulnerable processing path.

The available research identifies version 7.2.0 as the remediation target through the official WordPress.org package. The supplied NVD material does not include detailed vendor release notes proving which code changes fixed the vulnerability. Treat 7.2.0 as the minimum upgrade target, verify the installed version after deployment, and monitor the site for compromise.

Analyst’s Take: Upgrade first. The affected path is a public checkout endpoint, and the reported attack does not require a WordPress account. Although no public PoC or confirmed exploitation was identified, that absence does not offset the risk of running version 7.1.1 or earlier on an internet-facing store.

The Fix, If You’re in a Hurry

Upgrade PDF Invoice for WooCommerce to 7.2.0 or later. If the plugin cannot be upgraded immediately, deactivate and remove it, then validate that invoice-generation functionality is no longer reachable.

A temporary restriction on anonymous WooCommerce checkout, Direct Bank Transfer, or cheque payment methods may reduce exposure. However, these controls can disrupt legitimate transactions and should not replace upgrading or removing the vulnerable plugin.

For WP-CLI-managed installations, inspect the current plugin state:

wp plugin get pdf-for-woocommerce \
  --field=version \
  --allow-root

wp plugin status pdf-for-woocommerce \
  --allow-root

If the plugin is active and an update is available through the configured WordPress update source, upgrade it:

wp plugin update pdf-for-woocommerce --allow-root

Confirm the resulting version:

wp plugin get pdf-for-woocommerce \
  --fields=name,status,version \
  --format=table \
  --allow-root

If you cannot safely upgrade, deactivate the plugin:

wp plugin deactivate pdf-for-woocommerce --allow-root

Remove it only after confirming that the site does not require its stored invoice data or configuration:

wp plugin delete pdf-for-woocommerce --allow-root

Disabling only a payment method is not a complete fix. The underlying issue involves attacker-controlled checkout data reaching unsafe processing logic, so the plugin should remain unavailable until a fixed release is installed.

After upgrading, review administrator accounts, WordPress scheduled tasks, recently modified PHP files, web-server configuration, and outbound connections for evidence of post-exploitation. Organizations should also review their broader WordPress plugin security processes and verify that vulnerable plugins are inventoried across production, staging, and abandoned sites.

How This Vulnerability Works

The vulnerability is described as a PHP object injection issue caused by insufficient handling of the WooCommerce customer_note field. An attacker places crafted content in that field during an anonymous checkout. The plugin then inserts the value into invoice HTML without adequate validation.

The reported processing chain is significant because multiple transformations occur before deserialization:

  1. The attacker submits a public WooCommerce checkout request.
  2. The malicious value is supplied through customer_note.
  3. The plugin places the value into invoice HTML.
  4. simplehtmldom decodes HTML entities back into a live tag.
  5. mPDF reconstructs the content as raw bytes.
  6. The data reaches unserialize() through _getObjAttr.
  7. PHP object deserialization may invoke available gadget chains and result in arbitrary code execution.

The relevant request path is:

POST /wc/store/v1/checkout

According to the NVD description, Direct Bank Transfer or cheque payment methods can cause the order to transition to on-hold. That transition fires the plugin’s invoice-generation hook, allowing the attacker-controlled value to reach the vulnerable processing path. The reported attack therefore does not depend on an authenticated WordPress session.

The issue is not simply HTML injection. The dangerous behavior is the eventual use of attacker-influenced data in PHP deserialization. Whether a complete exploit succeeds depends on the installed PHP runtime, available classes, autoloaded libraries, WordPress and plugin versions, and the presence of a usable gadget chain.

Those environmental variables affect exploit reliability and impact, but they do not make the vulnerable code safe.

Technical Notes

The affected source references identified in the research include the 7.1.1 plugin tree:

  • frontend/index.php, around line 378
  • libs/HtmlDocument.php, around line 300
  • libs/HtmlNode.php, around line 1266
  • vendor/mpdf/mpdf/src/Mpdf.php, around line 9105

Use these references for code review and validation against the deployed package, not as a substitute for upgrading. A local comparison can help confirm that production is not still running the vulnerable release:

wp plugin get pdf-for-woocommerce --field=version --allow-root

# If the plugin directory is available locally:
grep -RIn --include='*.php' \
  -E 'unserialize\s*\(|customer_note|_getObjAttr' \
  wp-content/plugins/pdf-for-woocommerce/

The grep result is not proof of exploitability or remediation. It is a triage aid for identifying the relevant data flow and confirming whether an old package remains on disk.

Severity, Explained

NVD rates CVE-2026-109220 CVSS 9.8 Critical. The supplied record did not expose the complete vector string, so organizations that require the exact machine-readable vector should retrieve it directly from the NVD record before importing the score into a risk system.

The score is consistent with a vulnerability that is remotely reachable over the network, requires no authentication, and has high potential impact across confidentiality, integrity, and availability. According to the published description, an attacker does not need an existing WordPress account.

A successful exploit could allow server-side code execution, which may lead to:

  • Modification of WordPress files
  • Theft of database and customer data
  • Creation of administrator accounts
  • Malicious changes to payment pages
  • Installation of persistent malware
  • Use of the host to attack other systems

CVSS describes technical severity, not the probability that a particular site will be attacked. Exposure depends on whether the plugin is installed, whether the checkout path is publicly available, how the site handles payment methods, and what defenses surround the WordPress application.

The absence of a public exploit or KEV listing does not reduce the technical impact of a successful compromise. Internet-facing stores should patch before lower-risk maintenance work, preserve relevant logs, and perform a focused compromise review after remediation.

Is It Being Exploited?

No confirmed in-the-wild exploitation was established from the sources reviewed for this article. CVE-2026-109220 was not listed in CISA’s Known Exploited Vulnerabilities catalog as of 2026-10-31.

No verified public proof-of-concept repository or exploit link was identified in the supplied NVD references and reviewed search results. The current status should therefore be stated precisely:

Active exploitation is not confirmed, and a public PoC is not verified.

That status is not an assurance of safety. The attack reportedly uses a normal public Store API checkout request rather than a complicated administrative interface. Once technical details become available, exploitation may be adapted quickly, particularly against WordPress sites with predictable plugin layouts and permissive checkout configurations.

Defenders should use the absence of confirmed exploitation to guide detection and prioritization, not to defer patching. Teams reviewing related identity and access risks may also benefit from understanding identity attacks when investigating newly created administrator accounts or credential misuse after a suspected compromise.

ResponderRunbook · act now

Detecting It in Your Environment

Start by identifying every site running pdf-for-woocommerce and recording the installed version. Inventory should include production, staging, development, and abandoned WordPress instances because an overlooked internet-facing site may still expose the vulnerable endpoint.

Review web-server, reverse-proxy, WAF, and WooCommerce logs for requests to the Store API checkout endpoint, especially requests that create orders with Direct Bank Transfer or cheque payment methods.

A request to the endpoint is not inherently malicious. Detection should combine the path with:

  • Unusual request bodies
  • Malformed or encoded HTML in customer_note
  • Unexpected order creation
  • Invoice-generation activity
  • PHP errors
  • Unexpected file changes
  • New administrator accounts
  • Suspicious outbound connections

Technical Notes

A basic Apache or NGINX log search for the described endpoint is:

zgrep -hE '"(POST )?/wc/store/v1/checkout([? "]|$)' \
  /var/log/nginx/access.log* \
  /var/log/apache2/access.log* 2>/dev/null

If the site uses a prefixed WordPress path, search for the endpoint suffix as well:

zgrep -hiE 'POST .*wc/store/v1/checkout' \
  /var/log/nginx/access.log* \
  /var/log/apache2/access.log* 2>/dev/null

For Elastic or OpenSearch-style data, a starting query is:

http.request.method: "POST"
and url.path: "/wc/store/v1/checkout"

Prioritize events where the request body or captured application fields contain indicators such as:

customer_note
__PHP_Incomplete_Class
O:
s:
a:
unserialize

Serialized-object markers alone are not proof of exploitation. They can occur in benign application data or unrelated requests. Correlate them with the source IP, order ID, response status, invoice-generation activity, PHP errors, and file changes.

After patching, inspect for post-exploitation indicators:

find wp-content -type f -name '*.php' -mtime -14 -print

wp user list \
  --role=administrator \
  --fields=ID,user_login,user_email,user_registered \
  --allow-root

wp cron event list \
  --fields=hook,next_run_gmt,recurrence \
  --allow-root

Also review PHP-FPM, web-server, and WordPress logs for:

  • Unexpected command execution
  • Repeated 5xx responses
  • Requests to newly created PHP files
  • Unexpected changes to .htaccess or web-server configuration
  • Outbound connections from the web process
  • New or modified scheduled tasks

If compromise is suspected, isolate the host, preserve logs and filesystem evidence, rotate WordPress, database, hosting, API, and payment-related credentials, and investigate from a clean administrative system.

References and Further Reading

The primary reference is the NVD record for CVE-2026-109220. Use it to verify current CVSS metadata, description, affected product information, and later updates. Vulnerability metadata can change after initial publication.

The apparent remediation package is the official WordPress.org download for PDF for WooCommerce 7.2.0. Administrators should verify the package through their normal WordPress update process and confirm the installed version after deployment rather than relying only on a download URL.

The source references associated with the vulnerable 7.1.1 code include:

Consult the CISA Known Exploited Vulnerabilities Catalog for status changes. CVE-2026-109220 was not listed at the time of research, but catalog status can change independently of a site’s exposure.

Final Recommendation

Affected administrators should upgrade to 7.2.0 or later first. If that is not possible, deactivate and remove the plugin after confirming its stored invoice data or configuration is not required.

After remediation:

  1. Confirm the installed plugin version.
  2. Review checkout and web-server logs.
  3. Search for suspicious PHP file changes.
  4. Audit administrator accounts and scheduled tasks.
  5. Rotate credentials if compromise is suspected.
  6. Continue monitoring for changes to CISA KEV status and vendor guidance.

This article may contain affiliate links. We earn a commission on qualifying purchases at no extra cost to you.

Choosing a tool? Pricing and head-to-head guides

Last verified: 2026-10-31

Disclaimer: This article may contain affiliate links. We earn a commission on qualifying purchases at no extra cost to you.