
CVE-2026-14378 (WordPress DevKit Pro Plugin <= 2.3.0) के लिए रक्षात्मक विश्लेषण, पैच विश्लेषण, और डिटेक्शन स्कैनर।
CVE-2026-14378 WordPress के लिए DevKit Pro प्लगइन में एक गंभीर अनधिकृत प्रमाणीकरण बायपास (CVSS 9.8) है, जो 2.3.0 तक और उस सहित सभी संस्करणों को प्रभावित करता है।
इस प्लगइन में एक डेवलपर उपयोगकर्ता-स्विचिंग तंत्र शामिल है। जब कोई व्यवस्थापक किसी अन्य उपयोगकर्ता खाते में "स्विच" करता है, तो यह व्यवस्थापक की ID को original_user_id नामक कुकी में संग्रहीत करता है। दोष यह है: प्लगइन उस कुकी के मौजूद रहने पर किसी भी पृष्ठ पर एक "switch back" HTML फ़ॉर्म प्रस्तुत करता है — जिसमें उन अनधिकृत आगंतुकों के लिए भी शामिल है जो कुकी को मैन्युअल रूप से सेट करते हैं। इससे भी बुरा, nonce सत्यापन चरण कुकी उपयोगकर्ता की व्यवस्थापक क्षमता की जाँच करता है, न कि कॉलर के सत्र की — इसलिए सर्वर खुशी-खुशी किसी भी ऐसे व्यक्ति को प्रमाणित व्यवस्थापक सत्र कुकी सौंप देता है जो सही POST भेजता है।
शुद्ध परिणाम: पूर्ण WordPress व्यवस्थापक अधिग्रहण के लिए शून्य क्रेडेंशियल आवश्यक।
| विशेषता | विवरण |
|---|---|
| CVE ID | CVE-2026-14378 |
| भेद्यता वर्ग | अनुचित प्रमाणीकरण (CWE-287) |
| CVSS v3.1 स्कोर | 9.8 (गंभीर) |
| CVSS वेक्टर | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| प्रभावित सॉफ़्टवेयर | DevKit Pro (dplugins) WordPress प्लगइन |
| भेद्य संस्करण | <= 2.3.0 |
| पैच किया गया संस्करण | 2.3.1 |
| प्रकटीकरण तिथि | 02 अक्टूबर 2026 |
DevKit Pro में एक डेवलपर सहायक शामिल है जो साइट व्यवस्थापकों को अनुमतियों का परीक्षण करने के लिए अन्य उपयोगकर्ता खातों में "स्विच" करने देता है। जब व्यवस्थापक स्विच का उपयोग करता है:
Set-Cookie: original_user_id=1isset($_COOKIE['original_user_id']) की जाँच करता हैwp_footer() में एक "Switch Back" टूलबार प्रस्तुत करता है जिसमें एक ताज़ा nonce वाला छिपा हुआ POST फ़ॉर्म होता हैadmin-post.php?action=revert_switch पर POST करता हैwp_set_auth_cookie($user_id) को कॉल करता हैwp_footer हुक हैंडलर:
// DevKit Pro <= 2.3.0 — render_switch_back_bar()
public function render_switch_back_bar() {
// FLAW: Only checks if cookie exists — no session validation!
if ( isset( $_COOKIE['original_user_id'] ) ) {
$user_id = (int) $_COOKIE['original_user_id'];
$nonce = wp_create_nonce( 'devkit_revert_switch_' . $user_id );
echo '<div id="devkit-pro-switch-back" class="devkit-switch-bar" style="display:none;">';
echo ' <form id="devkit-revert-form" action="' . admin_url('admin-post.php') . '" method="POST">';
echo ' <input type="hidden" name="action" value="revert_switch" />';
echo ' <input type="hidden" name="_wpnonce" value="' . $nonce . '" />';
echo ' <input type="hidden" name="target_user_id" value="' . $user_id . '" />';
echo ' </form>';
echo '</div>';
echo '<!-- DevKit Pro 2.3.0 Switch Component Active -->';
}
}
फॉर्म सबमिशन को प्रोसेस करने वाला POST हैंडलर:
// DevKit Pro <= 2.3.0 — handle_revert_switch()
public function handle_revert_switch() {
$user_id = (int) $_POST['target_user_id'];
$nonce = sanitize_text_field( $_POST['_wpnonce'] );
if ( ! $this->verify_nonce_and_capability( $user_id, $nonce ) ) {
wp_die( 'Unauthorized' );
}
wp_set_current_user( $user_id );
wp_set_auth_cookie( $user_id ); // <-- Grants authenticated session to caller
wp_redirect( admin_url() );
exit;
}
private function verify_nonce_and_capability( $user_id, $nonce ) {
if ( ! wp_verify_nonce( $nonce, 'devkit_revert_switch_' . $user_id ) ) {
return false;
}
// CRITICAL FLAW: Checks the cookie user's capability, not the caller's!
return user_can( $user_id, 'manage_options' );
}
user_can( $user_id, 'manage_options' ) इस प्रश्न का उत्तर देता है: "क्या उपयोगकर्ता #1 के पास manage_options क्षमता है?"
उपयोगकर्ता #1 (पहला बनाया गया WordPress एडमिन) के लिए उत्तर हमेशा true होता है।
इसे यह पूछना चाहिए: "क्या यह HTTP अनुरोध करने वाले व्यक्ति के पास manage_options क्षमता है?"
सही जाँच current_user_can('manage_options') है जो एक अनधिकृत आगंतुक के लिए false लौटाएगी।
यह पूरा वॉकथ्रू एक लाइव WordPress इंस्टेंस के विरुद्ध निष्पादित और सत्यापित किया गया था जो एक स्थानीय Podman कंटेनर (http://localhost:8080) में चल रहा था और DevKit Pro 2.3.0 सक्रिय था।
इसे स्थानीय रूप से पुनरुत्पादित करने के लिए, आपको चाहिए:
त्वरित Podman लैब सेटअप:
# Start MariaDB
podman run -d --name wp-db \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
mariadb:10.6
# Start WordPress
podman run -d --name wp-app \
-p 8080:80 \
--link wp-db:mysql \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=wppass \
wordpress:latest
WordPress इनिशियलाइज़ होने के बाद (http://localhost:8080/wp-admin/install.php), plugins मेनू के माध्यम से DevKit Pro 2.3.0 इंस्टॉल और एक्टिवेट करें।
कोई भी attack payload भेजने से पहले, plugin की उपस्थिति की पुष्टि करें और plugin readme fetch करके उसका version निर्धारित करें:
Request:
GET /wp-content/plugins/devkit-pro/readme.txt HTTP/1.1
Host: localhost:8080
प्रतिक्रिया (HTTP 200):
=== DevKit Pro ===
Requires at least: 5.0
Tested up to: 6.8
Requires PHP: 7.4
Stable tag: 2.3.0
License: GPLv2 or later