دليل النشر

Bricksforge CVE-2026-85097: التحديث وتدقيق مواقع العملاء

انشر على VPS Cloud ←

دليل عملي

Bricksforge CVE-2026-85097: التحديث وتدقيق مواقع العملاء

الأمان والمراقبة10 دقائق للقراءةعدد الخطوات: 12

ثغرة رفع ملفات بلا مصادقة في إضافة Bricksforge، المكمّل لمنشئ Bricks، كانت مستغَلة قبل الإعلان عنها. الإصلاح موجود، لكن التحديث وحده لا يكفي: قد يحمل موقع محدَّث ملف PHP زُرع قبل الترقيع. وصعوبة الوكالة مزدوجة: معرفة أي العملاء يستخدمون الإضافة، ثم إثبات أن أيًّا منهم لم يُزَر. يقدّم هذا الدليل الإجراء الكامل، من الجرد بـ wp-cli إلى تغيير الأسرار، مع Bricksforge كحالة حقيقية ونموذج يمكن إعادته مع الثغرة القادمة.

المحتويات· الثغرة في فقرة واحدة، والباقي إجراء1/13
  1. 01الثغرة في فقرة واحدة، والباقي إجراء
  2. 02جدول مرجعي: أين تنظر وعمّ تبحث
  3. 03لماذا لا يكفي التحديث
  4. 04جرد المواقع باستخدام wp-cli
  5. 05حدّد الأولويات ونافذة التدقيق الرجعي
  6. 06حدّث، أو عطّل مؤقتًا في الأثناء
  7. 07طارد الملفات المزروعة وآثار الوصول
  8. 08ما لا تُظهره السجلات
  9. 09عُثر على ملف: لم يعد الموقع سليمًا
  10. 10الأسرار والحسابات الواجب تجديدها بعد اختراق
  11. 11الإثبات المؤرَّخ الذي يُسلَّم للعميل
  12. 12أعد الإجراء نفسه مع ثغرة الإضافة القادمة
  13. 13الوثائق الرسمية

الثغرة في فقرة واحدة، والباقي إجراء

تمس CVE-2026-85097 الإصدار 3.1.8.9 من Bricksforge وما قبله؛ والإصلاح هو الإصدار 3.1.8.10. تتحقق وحدة Pro Forms من نوع MIME للملف عند الرفع الأول، لكنها تثق عند إرسال النموذج بالحقل url الذي يقدّمه العميل داخل المعامل temporaryFileUploads. ملف GIF/PHP متعدد الصيغ يجتاز الفحص، ثم يُشار إليه بعنوان وجهة بصيغة PHP: يكتبه الخادم هناك وينفّذه عند أول طلب.

أما الخطورة فالمصادر تختلف: حرجة، بدرجة CVSS تساوي 9.8 بحسب SecurityWeek و10.0 بحسب نشرة Patchstack. لا نرجّح رقمًا، فالتصرف المطلوب واحد. رصدت Patchstack أولى عمليات الاستغلال في 7 أكتوبر 2026، قبل الإعلان (نشرة 8 أكتوبر)، وتذكر SecurityWeek في مقالها الصادر في 12 أكتوبر نحو 6000 موقع يستخدم الإضافة. قوائم عناوين IP المهاجمة سريعة الزوال: هي في نشرة Patchstack ولا داعي لنسخها.

جدول مرجعي: أين تنظر وعمّ تبحث

مرّر الجدول أفقيًا

أين تنظرعمّ تبحثما يدل عليه
إصدار الإضافةBricksforge 3.1.8.9 أو أقدممعرَّض للثغرة: الانتقال إلى 3.1.8.10 أو أحدث
إضافة غائبة أو معطّلةلا سطر في جرد wp-cliلا تعرّض عبر هذه الإضافة، وسجّل ذلك مع ذلك
`wp-content/uploads/bricksforge/tmp/`أي ملف PHPزرع محتمل: عامِل الموقع كموقع مخترق
`wp-content/uploads/YYYY/MM/`ملفات `login_admin_*.php`هدف ذكرته Patchstack: عامِل الموقع كموقع مخترق
سجلات الوصولطلب POST إلى `/wp-json/bricksforge/v1/form_submit`محاولة: قارنها بحالة القرص
سجلات الوصول`admin-ajax.php` مع `bricksforge_form_submit` أو `bricksforge_regenerate_nonce`محاولة: يُطلب الـ nonce قبل الرفع
سجلات الوصولطلب إلى ملف PHP داخل `uploads/`تنفيذ محتمل: تغيير الأسرار
حسابات ووردبريسمدير حديث غير معروفاستمرارية محتملة: فكّر في الاستعادة

لماذا لا يكفي التحديث

سبق الاستغلالُ الإصلاحَ. موقع انتقل إلى 3.1.8.10 في 20 أكتوبر قد يكون استقبل ملفًا في اليوم الثامن، وهذا الملف ينجو من التحديث: الترقيع يغلق الباب لكنه لا يُخرج ما دخل. هذا هو الاعتراض الذي يجب حسمه قبل أن تكتب للعميل «كل شيء مُصلَح». الترتيب الصحيح: رقّع أو عطّل، ثم ابحث عن الاختراق (ملفات، سجلات، حسابات، أسرار)، ثم سلّم إثباتًا مؤرَّخًا.

وثمة عقبة ثانية أبسط: بلا جرد مركزي لا يعرف أحد أي العملاء يستخدمون الإضافة. موقع Bricks سُلّم قبل عامين واستضافه مزوّد آخر لا يظهر في أي تنبيه. لذلك يأتي الجرد أولًا، وهو يخدم كل ثغرة إضافة قادمة.

جرد المواقع باستخدام wp-cli

  1. اختبر موقعًا واحدًا في كل مرة

    cd /home/client/public_html
    wp plugin is-installed bricksforge && wp plugin get bricksforge --field=version
    wp plugin list --fields=name,version,update
    يجيب الأمر الأول عبر رمز الخروج، ويعرض الثاني الإصدار، ويسرد الثالث كل الإضافات مع حالة تحديثها. المسار مثال فقط: كيّفه مع مزوّد الاستضافة لديك.

  2. اعثر على كل المواقع في خادم

    find /home -name wp-config.php -not -path '*/wp-content/*'
    كل ملف wp-config.php يدل على تثبيت. يستبعد المرشّح النسخ المخزّنة داخل القوالب أو النسخ الاحتياطية؛ راجع القائمة، فمجلد اختبار منسيّ يُحتسب أيضًا.

  3. مرّ على كل التثبيتات في حلقة

    find /home -name wp-config.php -not -path '*/wp-content/*' -print0 | while IFS= read -r -d '' f; do d=$(dirname "$f"); echo "$d $(sudo -u "$(stat -c %U "$d")" wp --path="$d" --skip-plugins --skip-themes plugin get bricksforge --field=version 2>/dev/null)"; done
    يطبع كل سطر المجلد ثم الإصدار، أو لا شيء إن كانت الإضافة غائبة. الخياران --skip-plugins --skip-themes يتفاديان تحميل شيفرة قد تكون مفخخة أثناء التدقيق.

  4. اختر المستخدم بعناية

    شغّل wp-cli بحساب مالك الموقع كما في الحلقة أعلاه. الخيار --allow-root يعمل، لكنه ينشئ ملفات مملوكة لـ root داخل الموقع وينفّذ شيفرة الموقع بكامل الصلاحيات: احتفظ به للحالات التي لا بديل فيها.

  5. دوّن النتيجة في جدول

    سطر لكل تثبيت: العميل، المزوّد، المسار، الإصدار المرصود، تاريخ القراءة وساعتها. أضف عمودًا «زيارة منذ 7 أكتوبر» تملؤه في المرحلة التالية. يصبح هذا الجدول القطعة المركزية في الملف المسلَّم إلى العملاء.

  6. أكمل المواقع الواقعة خارج خادمك

    بالنسبة لموقع مستضاف في مكان آخر، اطلب وصولًا مؤقتًا أو تصديرًا لنتيجة wp plugin list --fields=name,version,update. الموقع الذي لا تستطيع استجوابه يبقى في الجدول بعبارة «لم يُتحقق منه»، لا غائبًا.

حدّد الأولويات ونافذة التدقيق الرجعي

عالج أولًا ما هو معرَّض ومستغَل معًا: موقع بإصدار Bricksforge 3.1.8.9 أو أقدم، ونماذج Pro Forms عامة، في الإنتاج. ثم مواقع الاختبار ونسخ العمل، ثم المواقع التي الإضافة فيها مثبّتة وغير مفعّلة. الإضافة الخاملة تستحق قرارًا: حذفها أسلم من تركها تهرم.

تبدأ نافذة التدقيق الرجعي في 7 أكتوبر 2026 الساعة 21:47 بالتوقيت العالمي، وهي أول إشارة نشرتها Patchstack. حوّل هذه الساعة إلى المنطقة الزمنية لسجلاتك قبل التصفية. والنقطة الجوهرية: إن لم تصل سجلاتك إلى ذلك التاريخ فغياب الأثر لا يثبت شيئًا. دوّن تاريخ أقدم سطر متاح، فهو يحدّ ما يمكنك تأكيده.

حدّث، أو عطّل مؤقتًا في الأثناء

حين يكون التحديث ممكنًا يكفي wp plugin update bricksforge لتثبيت يستقبل الإصدارات بشكل عادي؛ وبحسب الترخيص قد يطلب الموقع المرور بلوحة التحكم أو بأرشيف الناشر. ثم تحقق بالأمر wp plugin get bricksforge --field=version: يجب أن تكون النتيجة 3.1.8.10 أو أحدث.

وحين لا يكون ممكنًا بعد، توجد ثلاثة تدابير مؤقتة لا يحل أي منها محل الإصلاح. تعطيل الإضافة بالأمر wp plugin deactivate bricksforge يقطع المسار على حساب نماذج الموقع: نبّه العميل. ومنع تنفيذ PHP داخل uploads/ يُسقط قيمة أي ملف مزروع: في nginx، location ~* ^/wp-content/uploads/.*\.(php|php[0-9]|phtml|pht|phps)$ { deny all; } قبل كتلة PHP العامة؛ وفي Apache، ملف .htaccess داخل uploads/ يحوي <FilesMatch "\.(php|php[0-9]|phtml|pht|phps)$"> Require all denied </FilesMatch>. وأخيرًا، تحديد معدل الطلبات على /wp-json/bricksforge/v1/form_submit يبطئ الدفعات، وقاعدة RapidMitigate من Patchstack تحجب حركة الهجوم لمن يستخدم تلك الخدمة. هذه التدابير تخفض الخطر ولا تصلح الثغرة.

طارد الملفات المزروعة وآثار الوصول

  1. ابحث عن ملفات PHP في uploads

    find wp-content/uploads -type f \( -iname '*.php' -o -iname '*.php[0-9]' -o -iname '*.phtml' -o -iname '*.pht' -o -iname '*.phps' \) -ls
    مجلد uploads/ السليم لا يحوي PHP قابلًا للتنفيذ. ملف index.php من بضعة بايتات وهو مجرد تعليق شائع وغير ضار؛ اقرأ أي ملف آخر قبل الحكم عليه.

  2. استهدف المواضع التي ذكرتها Patchstack

    ls -la wp-content/uploads/bricksforge/tmp/
    find wp-content/uploads -name 'login_admin_*.php' -ls
    find wp-content/uploads -type f -newermt '2026-10-07' -ls
    يستهدف الأمران الأولان المواضع واسم الملف من النشرة؛ ويسرد الثالث كل ما كُتب في uploads/ منذ 7 أكتوبر لاكتشاف متغيّر.

  3. امسح سجلات nginx

    zgrep -h -i -E 'bricksforge/v1/form_submit|bricksforge_(form_submit|regenerate_nonce)' /var/log/nginx/access.log*
    يقرأ zgrep الملفات المضغوطة والعادية سواءً: فتدوير gzip مشمول بالنجمة. احتفظ بتاريخ كل سطر وقارنه بنافذة التدقيق الرجعي.

  4. امسح سجلات Apache وcPanel

    zgrep -h -i -E 'bricksforge/v1/form_submit|bricksforge_(form_submit|regenerate_nonce)' /var/log/apache2/*access*.log* /var/log/httpd/*access*log* /usr/local/apache/domlogs/*
    تختلف المجلدات: /var/log/apache2/ في Debian وUbuntu، و/var/log/httpd/ في RHEL وAlmaLinux، و/usr/local/apache/domlogs/ في خادم cPanel. المسارات الغائبة تنتج خطأً غير مؤثر.

  5. ابحث عن الوصول إلى الملفات المزروعة

    zgrep -h -i -E 'login_admin_[^ ]*\.php|/uploads/[^ ]*\.(php[0-9]?|phtml|pht)|%2e(php|phtml)' /var/log/nginx/access.log*
    طلب، وخصوصًا GET ناجح، إلى ملف PHP داخل uploads/ يعني أن ملفًا ربما نُفّذ. متغيّرات حالة الأحرف والترميز تُغطّى هنا في السجلات لا على القرص.

  6. عُدّ المصادر ودوّن

    zgrep -h 'POST /wp-admin/admin-ajax.php' /var/log/nginx/access.log* | awk '{print $1}' | sort | uniq -c | sort -rn | head
    يرتّب هذا الأمر العناوين بحسب عدد طلبات POST إلى admin-ajax.php. دوّن النتيجة ولو كانت فارغة، مع تاريخ أقدم سجل قُرئ.

ما لا تُظهره السجلات

كثيرًا ما يسافر إجراء AJAX في جسم طلب POST الذي لا يسجّله سجل الوصول: فقد لا يجد البحث عن bricksforge_form_submit شيئًا رغم وقوع الاستدعاء. في هذه الحالة ابحث عن حجم غير عادي من طلبات POST إلى admin-ajax.php أو إلى مسار REST، وقارنه بحالة القرص. يصف هذا الدليل مهام إدارية؛ وهو مقدَّم كما هو، دون دعم من جانبنا.

عُثر على ملف: لم يعد الموقع سليمًا

وجود ملف مزروع يعني تنفيذ شيفرة على الخادم بصلاحيات حساب الموقع. حذف الملف وحده لا يكفي: فقد استُخدم لإنشاء حساب أو لقراءة wp-config.php أو لزرع باب ثانٍ. اعزل الموقع، واحتفظ بنسخة من الملف للتحليل، ثم استعد من نسخة احتياطية أقدم من 7 أكتوبر 2026 بدل التنظيف اليدوي.

بعد الاستعادة، حدّث Bricksforge قبل إعادة الموقع إلى الإنترنت، وإلا عاد الطلب نفسه. وإن لم توجد نسخة سليمة، أعد البناء من الشيفرة المصدرية وتصدير المحتوى، وعامل أي استخراج من قاعدة البيانات كأنه مشبوه.

الأسرار والحسابات الواجب تجديدها بعد اختراق

  • أملاح ومفاتيح wp-config.php — الأمر wp config shuffle-salts يعيد توليدها ويُبطل الجلسات المفتوحة، ومنها جلسة المتسلل.
  • كلمة مرور قاعدة البيانات — غيّرها في خادم MySQL أو MariaDB ثم في wp-config.php دون انتظار.
  • مفاتيح API والرموز — الدفع، البريد المعاملاتي، الخرائط، الخدمات الخارجية المصرّح بها في الموقع أو في القاعدة.
  • بيانات اعتماد SMTP — حساب بريد مقروء في الإعدادات يُستعمل سريعًا في إرسال احتيالي.
  • كلمات مرور المديرين — wp user reset-password <ID> لكل واحد، وكلمة مرور فريدة لكل شخص.
  • حسابات ووردبريس المجهولة — الأمر wp user list --fields=ID,user_login,role,user_registered --orderby=user_registered --order=DESC يكشف الإنشاءات الحديثة.
  • الاستمرارية — wp cron event list، ومجلد wp-content/mu-plugins/، وأي إضافات أو قوالب ليست لك.

الإثبات المؤرَّخ الذي يُسلَّم للعميل

العميل الذي يقرأ «تم التحديث» لا يعرف ما الذي تحققتَ منه. سلّم ورقة من صفحة واحدة لكل موقع: تاريخ التدقيق وساعته، الإصدار قبل وبعد، نتيجة البحث عن الملفات، الفترة التي تغطيها السجلات مع تاريخ أقدم سطر قُرئ، الإجراءات المتخذة (استعادة، تغيير أسرار، حسابات محذوفة) وما تعذّر فحصه. ذكر الحدود يحميك بقدر ما تحميك النتائج.

وهذه الورقة حمايتك أيضًا إن ظهر اختراق لاحقًا: فهي تؤرّخ ما كنتَ تعرفه وما فعلته. احفظ جدول الجرد والمخرجات الخام للأوامر مع الورقة.

أعد الإجراء نفسه مع ثغرة الإضافة القادمة

خمس خطوات تصلح لأي إضافة. الجرد: الإضافة، الإصدار، الموقع، العميل، المزوّد. الأولوية: المعرَّض والمستغَل أولًا. تحديد نافذة التدقيق الرجعي انطلاقًا من أول إشارة منشورة. التعطيل أو التحديث، ثم البحث عن الملفات وآثار الوصول والحسابات والأسرار بهذا الترتيب. تسليم الإثبات المؤرَّخ. لا يتغير سوى أمر الجرد وأنماط البحث، وتقدّمها نشرة الناشر أو Patchstack.

الأجزاء المبعثرة بين عدة مزوّدين تبطئ كل مرحلة. يجمع حساب الموزّع مواقعك في حساب واحد، مع نقطة وصول لكل عميل؛ والوصول عبر SSH وأداة wp-cli يتوقف على الخطة، فتحقق منه قبل ذلك. تحتفظ أنت بعلاقة العميل ونحن نتولى البنية التحتية.

الوثائق الرسمية

نشرة Patchstack حول CVE-2026-85097: https://patchstack.com/articles/critical-unauthenticated-arbitrary-file-upload-vulnerability-exploited-in-bricksforge-plugin/
مقال SecurityWeek: https://www.securityweek.com/bricksforge-wordpress-plugin-vulnerability-exploited-in-the-wild/
أوامر wp plugin: https://developer.wordpress.org/cli/commands/plugin/
الأمر wp config shuffle-salts: https://developer.wordpress.org/cli/commands/config/shuffle-salts/
التوجيه location في nginx: https://nginx.org/en/docs/http/ngx_http_core_module.html#location

مواقع عملاء كثيرة، حلقة تدقيق واحدة

حين تعيش مواقع العملاء عند عدة مزوّدين يكلّف كل تدقيق ساعات. مع استضافة الموزّعين من ServOrbit.com، تتيح نقطة وصول لكل عميل وواجهة واحدة تجميع مواقع عملائك تحت واجهة واحدة، بأسعارك وعلامتك.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة