PowerPress Podcasting plugin by Blubrry <= 11.15.10 - Authenticated (Contributor+) PHP Object Injection
Description
The PowerPress Podcasting plugin by Blubrry plugin for WordPress is vulnerable to PHP Object Injection in all versions up to, and including, 11.15.10 via deserialization of untrusted input. This makes it possible for authenticated attackers, with Contributor-level access and above, to inject a PHP Object. No known POP chain is present in the vulnerable software, which means this vulnerability has no impact unless another plugin or theme containing a POP chain is installed on the site. If a POP chain is present via an additional plugin or theme installed on the target system, it may allow the attacker to perform actions like delete arbitrary files, retrieve sensitive data, or execute code depending on the POP chain present.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:HTechnical Details
<=11.15.10Source Code
WordPress.org SVN# Research Plan: CVE-2026-23798 - PowerPress Podcasting Object Injection ## 1. Vulnerability Summary The PowerPress Podcasting plugin (<= 11.15.10) contains a PHP Object Injection vulnerability accessible to users with **Contributor-level** permissions or higher. The vulnerability exists because th…
Show full research plan
Research Plan: CVE-2026-23798 - PowerPress Podcasting Object Injection
1. Vulnerability Summary
The PowerPress Podcasting plugin (<= 11.15.10) contains a PHP Object Injection vulnerability accessible to users with Contributor-level permissions or higher. The vulnerability exists because the plugin passes user-controlled metadata through the unserialize() function (or a wrapper) during the post-saving process or through an AJAX-based metadata update.
While no built-in POP (Property-Oriented Programming) chain is identified within PowerPress itself, the vulnerability can be leveraged if other plugins or themes with usable POP chains are installed.
2. Attack Vector Analysis
- Endpoint:
POST /wp-admin/post.php(standard post save) orPOST /wp-admin/admin-ajax.php. - Action:
editpost(standard) orpowerpress_save_episode(AJAX). - Vulnerable Parameter:
PowerPress[...]array elements, likelyPowerPress[itunes_image]or a hidden metadata field likepowerpress_episode_data. - Authentication: Required (Contributor+).
- Preconditions: The PowerPress "Episode" meta box must be active on the post type (usually
post).
3. Code Flow
- A Contributor user initiates a post save or an episode metadata update.
- The
powerpress_save_settingsfunction or thesave_posthook handler (e.g.,powerpressadmin_post_save) is triggered. - The plugin processes the
$_POST['PowerPress']array. - In
powerpressadmin-metabox.phporpowerpressadmin-auth.php, the plugin encounters a field intended to store complex attributes (like iTunes metadata or media info). - The plugin calls
unserialize()on a specific string value from thePowerPressarray before merging it into the global settings or storing it in the_enclosuremeta field. - Sink:
unserialize($user_input).
4. Nonce Acquisition Strategy
PowerPress secures its meta box operations with nonces. To perform the exploit, we must obtain a valid nonce generated for the current session.
- Identify Nonce: The plugin typically uses
_powerpress_meta_noncefor metadata operations. - Target Page: The nonce is rendered on the "Add New Post" page (
/wp-admin/post-new.php). - Extraction:
- Navigate to
/wp-admin/post-new.phpas a Contributor. - The nonce is usually localized in the
powerpress_adminJS object or as a hidden input field. - JavaScript Variable:
window.powerpress_admin?.nonce(inferred). - Hidden Field:
id="_powerpress_meta_nonce".
- Navigate to
Execution Step:
// Use browser_eval to extract the nonce
const nonce = document.querySelector('#_powerpress_meta_nonce')?.value;
return nonce;
5. Exploitation Strategy
We will attempt to trigger the deserialization by submitting a post save request containing a serialized object in the PowerPress parameters.
Step-by-Step Plan:
- Authentication: Log in to the WordPress instance as a Contributor.
- Creation: Create a draft post to obtain a
post_ID. - Nonce Extraction: Access the edit page of the draft post and extract
_powerpress_meta_nonce. - Payload Preparation: Generate a simple PHP serialized object. Since no POP chain is confirmed, use a dummy object to confirm deserialization (e.g.,
O:8:"stdClass":0:{}). - HTTP Request:
- Tool:
http_request - URL:
https://<target>/wp-admin/post.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
action=editpost &post_ID=<ID> &_powerpress_meta_nonce=<NONCE> &PowerPress[itunes_image]=O:8:"stdClass":0:{} &PowerPress[feed_slug]=podcast - Note: The exact key inside the
PowerPressarray may vary. Ifitunes_imagefails, tryimport_podcastorpowerpress_episode_save.
- Tool:
6. Test Data Setup
- User: Create a user with the
contributorrole. - Post: Create a draft post titled "Exploit Test" using
wp post create. - Plugin Config: Ensure PowerPress is active and the "Episode" meta box is visible (default).
7. Expected Results
- The server should process the request without an immediate 403 (verifying the nonce works).
- If the injection point is correct, PHP will attempt to deserialize the string.
- Verification of Injection: If an error-based approach is needed, provide an invalid serialized string like
O:8:"stdClass":1:{s:3:"abc";}(missing closing brace) and check the PHP error logs for "unserialize(): Error at offset...".
8. Verification Steps
After sending the request, verify if the object was injected:
- Check Meta: Use WP-CLI to check the
_enclosureoritunes_metadatameta for the post.wp post meta get <post_id> _enclosure - Audit Logs: Check the
wp-content/debug.log(if enabled) for deserialization errors. - Database Check: Check the
wp_postmetatable for the serialized string.
9. Alternative Approaches
If the standard post.php path is blocked:
- AJAX Path: Target
wp-admin/admin-ajax.phpwithaction=powerpress_save_episode. - Specific Meta Field: Focus on the "Media URL" field. In some versions, the plugin attempts to fetch and "unserialize" metadata cached for specific media URLs.
- Taxonomy Path: If the contributor has permissions to edit categories, target the
powerpress_taxonomysettings which are often processed throughpowerpress_save_settings.
Search Queries for Source Review (if accessible by agent):
grep -rn "unserialize" wp-content/plugins/powerpress/ | grep "_POST"
grep -rn "maybe_unserialize" wp-content/plugins/powerpress/admin/
grep -rn "_powerpress_meta_nonce" wp-content/plugins/powerpress/
Summary
The PowerPress Podcasting plugin for WordPress is vulnerable to PHP Object Injection via the insecure use of the unserialize() function on user-supplied metadata in the 'PowerPress' parameter array. Authenticated attackers with Contributor-level permissions or higher can leverage this vulnerability to inject PHP objects, which can lead to remote code execution if a suitable POP chain is present on the system.
Exploit Outline
To exploit this vulnerability, an attacker with at least Contributor-level authentication must first obtain a valid security nonce (specifically `_powerpress_meta_nonce`) from the post editor page. The attacker then submits a POST request to `/wp-admin/post.php` with the `action` parameter set to `editpost` (or alternatively targets the `powerpress_save_episode` AJAX action). The payload consists of a serialized PHP object placed within the `PowerPress` array parameters, such as `PowerPress[itunes_image]`. When the plugin processes the post save or metadata update, it passes this untrusted string directly into the `unserialize()` function, triggering the object injection.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.