CVE-2026-32417

Pochipp < 1.18.9 - Missing Authorization

mediumMissing Authorization
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
1.18.9
Patched in
50d
Time to patch

Description

The Pochipp plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to 1.18.9. This makes it possible for authenticated attackers, with subscriber-level access and above, to perform an unauthorized action.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
None
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<1.18.9
PublishedFebruary 25, 2026
Last updatedApril 15, 2026
Affected pluginpochipp

What Changed in the Fix

Changes introduced in v1.18.9

Loading patch diff...

Source Code

WordPress.org SVN
Research Plan
Unverified

# Exploitation Research Plan: CVE-2026-32417 (Pochipp Missing Authorization) ## 1. Vulnerability Summary The Pochipp plugin for WordPress (versions < 1.18.9) contains a missing authorization vulnerability in its AJAX handlers. Specifically, functions registered to `wp_ajax_pochipp_update_data` and …

Show full research plan

Exploitation Research Plan: CVE-2026-32417 (Pochipp Missing Authorization)

1. Vulnerability Summary

The Pochipp plugin for WordPress (versions < 1.18.9) contains a missing authorization vulnerability in its AJAX handlers. Specifically, functions registered to wp_ajax_pochipp_update_data and wp_ajax_pochipp_registerd_by_block perform a nonce check but fail to implement a capability check (e.g., current_user_can()). This allow any authenticated user, including those with Subscriber-level privileges, to create new Pochipp product posts or update product data.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • Action: pochipp_registerd_by_block (High Impact) and pochipp_update_data (Medium Impact).
  • Authentication: Authenticated (Subscriber+).
  • Payload Parameter:
    • action: pochipp_registerd_by_block
    • nonce: A valid WordPress nonce for the action.
    • attributes: A JSON-encoded string containing product data.
    • clientId: A string identifier used for the post title fallback.
  • Preconditions: The attacker must be logged in to the WordPress site.

3. Code Flow

  1. Entry Point: A POST request is sent to admin-ajax.php with action=pochipp_registerd_by_block.
  2. Hook Registration: In inc/ajax.php, add_action( 'wp_ajax_pochipp_registerd_by_block', '\POCHIPP\registerd_by_block' ) routes the request.
  3. Nonce Check: The function \POCHIPP\registerd_by_block calls \POCHIPP\check_ajax_nonce(). This function verifies the nonce parameter against \POCHIPP::NONCE_KEY.
  4. Missing Check: The function proceeds directly to process input without calling current_user_can().
  5. Data Processing:
    • The attributes parameter is retrieved and JSON-decoded.
    • pid (Post ID) is checked; if present, it returns an error (preventing updates via this specific function, but allowing creation).
    • Meta fields like className, pid, hideInfo, etc., are unset from the array.
  6. Sink (Post Creation): wp_insert_post() is called with post_type set to \POCHIPP::POST_TYPE_SLUG (typically pochipp) and post_status set to publish.
  7. Sink (Meta Storage): update_post_meta() is called using \POCHIPP::META_SLUG to store the remaining attributes as a JSON string.

4. Nonce Acquisition Strategy

The nonce is required. Based on standard Pochipp behavior, nonces are localized for the block editor.

  1. Identify Script Localization: The plugin likely uses wp_localize_script to pass a nonce to the editor. We need to find the variable name.
  2. Strategy:
    • Create a Subscriber user.
    • Log in as the Subscriber.
    • Navigate to the WordPress Dashboard (/wp-admin/).
    • Since the block editor scripts are often enqueued for all users who can access the dashboard or specific post-editing screens, check for a global variable.
    • Search for a script containing pochipp. The common localization object name is likely pochipp or pochipp_data (inferred).
    • Use browser_eval to find the nonce:
      // Search for any object containing the nonce
      Object.keys(window).find(key => window[key] && window[key].nonce);
      // or specifically
      window.pochipp?.nonce
      
    • Based on inc/ajax.php, the default nonce key is \POCHIPP::NONCE_KEY.

5. Exploitation Strategy

Goal: Create an unauthorized product post.

  1. Setup: Authenticate as a Subscriber.
  2. Extraction: Extract the nonce from the wp-admin dashboard source or via browser_eval.
  3. Request:
    • URL: http://<target>/wp-admin/admin-ajax.php
    • Method: POST
    • Headers: Content-Type: application/x-www-form-urlencoded
    • Body:
      action=pochipp_registerd_by_block&nonce=<EXTRACTED_NONCE>&clientId=exploit_client&attributes={"title":"Malicious Product","amazon_url":"https://evil.com/ref=hack","rakuten_url":"https://evil.com/rakuten"}
      
  4. Response: A successful response will return a JSON object with the new post ID: {"pid":123}.

6. Test Data Setup

  1. User: Create a user with the subscriber role.
  2. Plugin Configuration: No specific configuration is needed, but the plugin must be active so that the pochipp post type is registered.

7. Expected Results

  • The admin-ajax.php response should be a JSON object containing a pid (e.g., {"pid": 105}).
  • The response code should be 200 OK.
  • Accessing wp-admin (as an admin) and checking the Pochipp product list should show a new entry titled "Malicious Product".

8. Verification Steps

  1. Check Post Existence:
    wp post list --post_type=pochipp --fields=ID,post_title,post_status
    
    (Verify the new ID and title exist).
  2. Check Meta Data:
    wp post meta get <NEW_PID> pochipp_data
    
    (Verify the JSON-encoded URLs/attributes were saved).

9. Alternative Approaches

If pochipp_registerd_by_block fails, attempt exploitation via pochipp_update_data:

  • Action: pochipp_update_data
  • Body: action=pochipp_update_data&nonce=<NONCE>&itemcode=ANY_STRING&searched_at=amazon
  • Goal: This may trigger an SSRF if \POCHIPP::get_item_data fetches external URLs based on the itemcode. While the primary vulnerability is Missing Authorization, the logic inside get_item_data should be audited for further impact.

Constants to Verify During Execution:

  • \POCHIPP::POST_TYPE_SLUG (Likely pochipp)
  • \POCHIPP::META_SLUG (Likely pochipp_data)
  • \POCHIPP::NONCE_KEY (Likely pochipp_nonce)
Research Findings
Static analysis — not yet PoC-verified

Summary

The Pochipp plugin for WordPress fails to implement capability checks in its AJAX handlers, allowing authenticated users with Subscriber-level permissions to create or update product posts. By exploiting the 'pochipp_registerd_by_block' or 'pochipp_update_data' actions, an attacker can inject arbitrary product metadata and publish new items to the site.

Vulnerable Code

// inc/ajax.php line 44
add_action( 'wp_ajax_pochipp_update_data', '\POCHIPP\update_data' );
function update_data() {

	if ( ! \POCHIPP\check_ajax_nonce() ) {
		wp_die( json_encode( [
			'error' => [
				'code'    => 'nonce error',
				'message' => '不正なアクセスです。',
			],
		] ) );
	};

	// ... processes data ...

	wp_die( json_encode( [
		'data' => $datas[0],
	] ) );
}

---

// inc/ajax.php line 91
add_action( 'wp_ajax_pochipp_registerd_by_block', '\POCHIPP\registerd_by_block' );
function registerd_by_block() {

	if ( ! \POCHIPP\check_ajax_nonce() ) {
		wp_die( json_encode( [
			'error' => [
				'code'    => 'nonce error',
				'message' => '不正なアクセスです。',
			],
		] ) );
	};

	$datas     = [];
	$attrs     = \POCHIPP\get_sanitized_data( $_POST, 'attributes', 'text', '' );
	$client_id = \POCHIPP\get_sanitized_data( $_POST, 'clientId', 'text', '' );

	// ... processes attributes ...

	$new_id = wp_insert_post( [
		'post_type'      => \POCHIPP::POST_TYPE_SLUG,
		'post_title'     => $title,
		'post_content'   => '<!-- wp:pochipp/setting /-->',
		'post_status'    => 'publish',
		] );

	// ... updates meta ...

	update_post_meta( $new_id, \POCHIPP::META_SLUG, json_encode( $attrs, JSON_UNESCAPED_UNICODE ) );

	wp_die( json_encode( [
		'pid' => $new_id,
	] ) );
}

Security Fix

diff -ru /home/deploy/wp-safety.org/data/plugin-versions/pochipp/1.18.8/inc/ajax.php /home/deploy/wp-safety.org/data/plugin-versions/pochipp/1.18.9/inc/ajax.php
--- /home/deploy/wp-safety.org/data/plugin-versions/pochipp/1.18.8/inc/ajax.php	2026-02-23 01:32:30.000000000 +0000
+++ /home/deploy/wp-safety.org/data/plugin-versions/pochipp/1.18.9/inc/ajax.php	2026-02-23 01:42:50.000000000 +0000
@@ -25,6 +25,30 @@
 	return false;
 }
 
+/**
+ * ポチップ商品の作成・公開権限があるか
+ */
+function can_create_pochipp_item() {
+
+	$post_type_object = get_post_type_object( \POCHIPP::POST_TYPE_SLUG );
+
+	if ( ! $post_type_object || empty( $post_type_object->cap ) ) {
+		return current_user_can( 'publish_pages' );
+	}
+
+	if ( ! empty( $post_type_object->cap->create_posts ) ) {
+		$create_cap = $post_type_object->cap->create_posts;
+	} elseif ( ! empty( $post_type_object->cap->edit_posts ) ) {
+		$create_cap = $post_type_object->cap->edit_posts;
+	} else {
+		$create_cap = 'edit_pages';
+	}
+
+	$publish_cap = ! empty( $post_type_object->cap->publish_posts ) ? $post_type_object->cap->publish_posts : 'publish_pages';
+
+	return current_user_can( $create_cap ) && current_user_can( $publish_cap );
+}
+
 require_once POCHIPP_PATH . 'inc/ajax/auto_update.php';
 require_once POCHIPP_PATH . 'inc/ajax/search_amazon.php';
 require_once POCHIPP_PATH . 'inc/ajax/search_rakuten.php';
@@ -72,6 +96,15 @@
 add_action( 'wp_ajax_pochipp_registerd_by_block', '\POCHIPP\registerd_by_block' );
 function registerd_by_block() {
 
+	if ( ! \POCHIPP\can_create_pochipp_item() ) {
+		wp_die( json_encode( [
+			'error' => [
+				'code'    => 'forbidden',
+				'message' => 'この操作を実行する権限がありません。',
+			],
+		] ) );
+	}
+
 	if ( ! \POCHIPP\check_ajax_nonce() ) {
 		wp_die( json_encode( [
 			'error' => [

Exploit Outline

To exploit this vulnerability, an attacker first authenticates as a Subscriber-level user. They then obtain a valid AJAX nonce by inspecting the localized scripts in the WordPress dashboard (typically associated with the Pochipp block editor script). With this nonce, the attacker sends a POST request to '/wp-admin/admin-ajax.php' with the 'action' parameter set to 'pochipp_registerd_by_block'. The payload includes the 'nonce' and a JSON-encoded 'attributes' string containing the desired product title and affiliate URLs. Because the plugin does not verify if the user has the 'publish_posts' capability for the Pochipp post type, it will create a new published post containing the attacker's metadata.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.