CVE-2026-103039
CriticalCVSS 9.8Summary
The Gravity Forms plugin for WordPress in versions up to and including 3.1.2 is vulnerable to PHP Object Injection via a Post Custom Field of List input type. The submitted value is passed to WordPress' unrestricted global maybe_unserialize() instead of the hardened GFCommon::maybe_unserialize(), allowing unauthenticated attackers to inject a PHP object into post meta. If a gadget chain exists via another plugin or theme, this could lead to remote code execution.
Risk Assessment
If a gadget chain is present in additional plugins or themes, an attacker could achieve remote code execution; when the field is mapped to the _wp_page_template meta key, WordPress itself supplies a chain that can yield RCE on certain hosts.
Recommendation
Update Gravity Forms to a version later than 3.1.2 and review other plugins and themes for known PHP gadget chains.
Other vulnerabilities in Gravity Forms
See all- CVE-2026-97645High
The Gravity Forms plugin for WordPress in versions up to and including 3.1.2 is vulnerable to Stored Cross-Site Scripting via the List Field due to insufficient input sanitization and output escaping. Unauthenticated attackers can inject arbitrary web scripts into pages that execute when a user accesses the injected page. Successful exploitation requires the administrator to click the injected link in the entry detail view and confirm a dialog, triggering the admin JavaScript bundle's delegated data-dialog-callback handler.
- CVE-2026-90437High
The Gravity Forms plugin for WordPress in versions up to and including 3.1.1 is vulnerable to Stored Cross-Site Scripting via Post Excerpt, Post Custom Field, and Rich-Text Paragraph field values due to insufficient input sanitization and output escaping. Unauthenticated attackers can inject arbitrary web scripts into pages that execute when a user accesses the injected page. These fields allow raw HTML submissions via allow_html(), and an entity-encoded payload stored in a data-dialog-confirm attribute evades wp_kses_post() at save time but is decoded into executable markup by insertAdjacentHTML() in the admin JavaScript.
- CVE-2026-84434Critical
The Gravity Forms plugin for WordPress (versions up to and including 3.1.0.4) is vulnerable to arbitrary file upload via the upload_file function. A mismatch between validation and persistence pipelines allows hidden file upload fields to bypass extension validation. Unauthenticated attackers can upload executable files, enabling remote code execution.
- CVE-2026-48866Critical
A Path Traversal vulnerability in Gravity Forms by Rocketgenius Inc. allows access to files outside the restricted directory. This issue affects versions up to 2.10.0.1 inclusive.
- CVE-2026-97296High
Deserialization of Untrusted Data vulnerability in Rocketgenius, Inc Gravity Forms allows Object Injection. This issue affects Gravity Forms: from n/a before 3.1.1.
- CVE-2026-16649High
The Gravity Forms plugin for WordPress is vulnerable to Stored Cross-Site Scripting via Post Body Field Value in all versions up to, and including, 2.10.5 due to insufficient input sanitization and output escaping. This makes it possible for unauthenticated attackers to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. The exploit survives save-time sanitization because wp_kses_post allows the required HTML tags and attributes, and the client-side tooltip script re-parses the browser-decoded aria-label value as innerHTML while only stripping script elements, leaving onerror and other event-handler attributes fully intact and executable.
- CVE-2026-19513High
An Arbitrary File Upload vulnerability in the Gravity Forms plugin for WordPress (up to and including 3.0.2). Insufficient validation of multi-file upload chunk state in GFAsyncUpload::upload() allows unauthenticated attackers, when a public form has a File Upload field with Multiple Files enabled, to upload a PNG/PDF polyglot to an attacker-selected public .php or .html filename in the temporary upload directory. This can lead to remote code execution on NGINX or other non-.htaccess respecting servers. Where PHP execution is blocked, attacker-written HTML can result in stored XSS.
- CVE-2026-12997High
The Gravity Forms plugin for WordPress is vulnerable to Directory Traversal in all versions up to and including 2.10.4 via the 'gform_uploaded_files' parameter. Unauthenticated attackers can read arbitrary files on the server, potentially exposing sensitive information.
- CVE-2026-4406Medium
The Gravity Forms plugin for WordPress up to version 2.9.30 is vulnerable to Reflected XSS via the `form_ids` parameter in the `gform_get_config` AJAX action. This is due to the `GFCommon::send_json()` method outputting JSON data wrapped in HTML comments with a `Content-Type: text/html` header instead of `application/json`. The `wp_json_encode()` function does not HTML-encode angle brackets, allowing injected HTML/script tags. The `config_nonce` is publicly embedded on every page with a Gravity Forms form, making it identical for all unauthenticated visitors within a 12-hour nonce tick. This allows unauthenticated attackers to inject arbitrary web scripts if they can trick a user into clicking a link. The vulnerability does not work against authenticated users.
- CVE-2026-4394Medium
The Gravity Forms plugin for WordPress up to version 2.9.30 has a Stored XSS vulnerability in the Credit Card field's 'Card Type' sub-field. The get_value_entry_detail() method outputs the value without escaping, and get_value_save_entry() accepts unsanitized input. The Card Type field is not rendered on the frontend but the backend accepts it from POST requests. Unauthenticated attackers can inject arbitrary scripts that execute when an admin views the entry in the dashboard.
Original NVD description (English source)
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.
Vulnerability data from NVD (NIST) · CISA KEV · EPSS

