← Back to search

CVE-2026-103039

9.8 CRITICAL

Published 2026-10-30 · Updated 2026-10-30

AI risk analysis

Summary
The Gravity Forms WordPress plugin up to v3.1.2 suffers from PHP Object Injection via the List custom field when a content template is enabled, because GFFormsModel::create_post() uses WordPress' unsafe maybe_unserialize() instead of the plugin's hardened GFCommon::maybe_unserialize(), allowing unauthenticated attackers to inject arbitrary PHP objects into post meta.
Exploitability
Exploitation requires an attacker to submit a malicious serialized object via a List field with content template enabled on a vulnerable Gravity Forms installation; no authentication is needed, but successful remote code execution depends on the presence of additional gadget chains in WordPress or third-party plugins/themes.
Blast radius
If combined with a suitable gadget chain—such as WordPress' built-in WP_Theme chain when mapping to _wp_page_template—an unauthenticated attacker could achieve remote code execution on the server, fully compromising confidentiality, integrity, and availability.
Detection
Look for POST requests to WordPress endpoints (e.g., /wp-admin/admin-ajax.php or form submission endpoints) containing serialized data in custom field values—especially in fields named like 'input_XX' or 'field_XX'—that include the string 'O:' followed by a class name and parentheses, such as 'O:8:"stdClass":'. Monitor for unusual _wp_page_template meta updates via REST API or post meta endpoints.
Prioritized remediation
Upgrade to Gravity Forms version 3.1.3 or later, which ensures GFCommon::maybe_unserialize() is used with allowed_classes => false for List field inputs.
php-object-injectionrcewordpressgravity-formsunauthenticatedserialization

Analysis generated locally by garnet-coder (no data left the box). AI-assisted — verify against primary sources before acting.

NVD description

The Gravity Forms plugin for WordPress is vulnerable to PHP Object Injection in all versions up to, and including, 3.1.2 via a Post Custom Field whose input type is List. This is due to GFFormsModel::create_post() passing the submitted value to WordPress' unrestricted global maybe_unserialize() rather than the plugin's own hardened GFCommon::maybe_unserialize(), which was added in 3.1.1 and passes allowed_classes => false precisely to prevent object instantiation. Where the field has a content template enabled, the submitted row reaches that call verbatim. This makes it possible for unauthenticated attackers to inject a PHP object into post meta. No PHP Object Injection gadget chain is present in the plugin itself; however, if a gadget chain is present via an additional plugin or theme, it could allow the attacker to perform actions such as remote code execution. Where the custom field is mapped to the protected _wp_page_template meta key, WordPress itself supplies the chain: validate_file() accepts non-scalars, WP_Theme::__toString() then resolves an attacker-controlled path, and on hosts with a readable PEAR install and register_argc_argv enabled this yields remote code execution.

CVSS vector

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Weaknesses

CWE-502

All references

Source data: NVD (nvd.nist.gov), public domain. Exploit-DB.ai adds local AI analysis for defensive use only.

Related CVEs

Related by shared AI tags and CWE weakness class. Browse the full archive.