PolyShell: ما هو ثابت، وأين تختلف المصادر
تمسّ الثغرة CVE-2026-48356، المعروفة باسم PolyShell، منصتَي Adobe Commerce وMagento Open Source. تصنّفها بطاقة NVD، المنشورة في 14 يوليو 2026 استنادًا إلى تصريح Adobe، ضمن CWE-434 (رفع ملف من نوع خطِر)، بدرجة CVSS 3.1 تبلغ 9.3 ومتّجه AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N. التصحيح هو نشرة Adobe ذات المرجع APSB26-73. وفي 27 أكتوبر 2026 أضافتها CISA إلى فهرس الثغرات المستغَلة (KEV)، مع مهلة تنتهي في 10 نوفمبر 2026 للوكالات الفدرالية الأمريكية: لم يعد الاستغلال فرضية.
لا تصف المصادر الثغرة بالطريقة نفسها. تتحدث NVD عن تنفيذ شيفرة عشوائية «في سياق المستخدم الحالي» يتطلب تفاعلًا: على الضحية أن يزور رابطًا مفخَّخًا أو صفحة مخترَقة، ويتجاوز الأثر المكوّن المعرَّض للثغرة. أما Sansec والصحافة المتخصصة فتصفان عمليات رفع ملفات تنتهي بزرع ملفات webshell على الخادم. لا نحسم بين القراءتين. والسلوك الحذر لوكالة هو معاملة كل متجر بقي بلا تصحيح على أنه متجر قد يحمل بالفعل ملف webshell.
ما تقوله المصادر، وما تستخلصه منها
مرّر الجدول أفقيًا
| المصدر | ما يؤكده | ما تستخلصه |
|---|---|---|
| NVD | CWE-434، درجة CVSS 3.1 تبلغ 9.3، تفاعل مطلوب، تنفيذ في سياق المستخدم الحالي | المعرّفات التي تُدوَّن في ملف العميل |
| CISA، فهرس KEV | استغلال ثابت، إضافة في 27 أكتوبر 2026، مهلة فدرالية حتى 10 نوفمبر 2026 | أفق للعمل، لا موعد للاطمئنان |
| Adobe، النشرة APSB26-73 | الإصدارات ذات اللاحقة 2026-jul غير متأثرة | الإصدار المستهدف لكل فرع |
| Sansec، 30 مارس 2026 | موجة هجوم واسعة: 471 متجرًا مخترقًا في ساعة واحدة، ملف webshell بلغة PHP ثم أبواب خلفية `accesson.php` | الملفات التي يُبحث عنها على القرص |
| Sansec، 24 أكتوبر 2026 | محمّل JavaScript في `cms_block`، حملة متابَعة منذ يوليو 2025 على 953 متجرًا؛ 102 من أصل 169 تثبيتًا غير مصحَّح كانت تحمل ملفات مرفوعة | الاستعلامات التي تُنفَّذ على قاعدة البيانات |
| الصحافة المتخصصة | رفع ملفات يؤدي إلى ملفات webshell | قراءة يجب التحقق منها بمصادر أخرى، لا مصدر أولي |
لماذا لا يُغلق التصحيح الملف
تطبيق APSB26-73 يزيل الثغرة، لكنه لا يزيل شيئًا مما دخل بالفعل. ملف webshell زُرع قبل التحديث يبقى على القرص، وباب خلفي accesson.php يظل يستجيب، وشيفرة محقونة في cms_block تظل تُقدَّم لكل زائر، وحساب مسؤول أنشأه المهاجم يبقى صالحًا. وتلخّص Sansec الأمر هكذا: إزالة الشيفرات لا تُزيل وصول المهاجم.
تُبيّن الدراسة الثانية لـSansec لماذا يُطرح السؤال على مستوى مجموعة المتاجر كاملة. فمن أصل 169 تثبيتًا لـMagento 2 غير مصحَّح جرى فحصها، كان 102 يحمل ملفات مرفوعة عبر PolyShell أو SessionReaper (CVE-2025-54236، المصحَّحة بالنشرة APSB25-88)، أي 60 %. لذلك فترتيب العمل ثابت: الجرد، ثم تجميد الحالة، ثم التحديث، ثم البحث عن الآثار، ثم تدوير صلاحيات الوصول، وأخيرًا تقرير مؤرَّخ يُسلَّم للعميل. تجاوُز التدوير لكسب ساعة يعني ترك المفاتيح للمهاجم الذي ربما نسخها بالفعل.
ما يتركه هذا الإجراء بين يديك
- جرد لكل متجر — الإصدار (Commerce أو Open Source)، ورقم النسخة بدقة، ووجود التصحيح 2026-jul أو غيابه.
- إصدار مستهدف لكل فرع — يُقرأ في النشرة APSB26-73، دون تخمين للترقيم.
- حالة مجمَّدة قبل أي تدخل — لقطة (snapshot) وتصدير لقاعدة البيانات يُحفظان دليلًا، قبل أي تنظيف.
- أربعة فحوص قابلة للتكرار — الملفات تحت
pub/media، والأبواب الخلفيةaccesson.php، وشيفرات JavaScript فيcms_blockوفيcms_page. - تدوير كامل لصلاحيات الوصول — حسابات الإدارة، ومفاتيح API والتكامل، وقاعدة البيانات، ومفتاح التشفير، وSSH وSFTP.
- تقرير مؤرَّخ لكل عميل — ما جرى فحصه، وما وُجد، وما صُحّح، وما لم يُفحص.
الإصدارات المتأثرة والمصحَّحة بحسب APSB26-73
مرّر الجدول أفقيًا
| المنتج والفرع | متأثر حتى | الإصدار المصحَّح |
|---|---|---|
| Adobe Commerce 2.4.9 | 2.4.9 | 2.4.9-2026-jul |
| Adobe Commerce 2.4.8 | 2.4.8-p5 | 2.4.8-2026-jul |
| Adobe Commerce 2.4.7 | 2.4.7-p10 | 2.4.7-2026-jul |
| Adobe Commerce 2.4.6 | 2.4.6-p15 | 2.4.6-2026-jul |
| Adobe Commerce 2.4.5 | 2.4.5-p17 | 2.4.5-2026-jul |
| Adobe Commerce 2.4.4 | 2.4.4-p18 | 2.4.4-2026-jul |
| Magento Open Source 2.4.9 | 2.4.9 | 2.4.9-2026-jul |
| Magento Open Source 2.4.8 | 2.4.8-p5 | 2.4.8-2026-jul |
| Magento Open Source 2.4.7 | 2.4.7-p10 | 2.4.7-2026-jul |
| Magento Open Source 2.4.6 | 2.4.6-p15 | 2.4.6-2026-jul |
| Adobe Commerce B2B | 1.5.3، 1.5.2-p5، 1.4.2-p10، 1.3.4-p17، 1.3.3-p18 | 1.5.3-2026-jul، 1.5.2-2026-jul، 1.4.2-2026-jul، 1.3.4-2026-jul، 1.3.3-2026-jul |
| Adobe Commerce Events | 1.20.0 وما قبلها | 1.21.0 |
| Magento Open Source 2.4.5 و2.4.4 | غائبتان عن قائمة NVD | لا استنتاج: اقرأ نشرة Adobe |
جرد إصدار كل متجر
قراءة الإصدار المعلَن
cd /var/www/client-storebin/magento --version
يعرض الأمر نوع الإصدار ورقمه. المسار مثال: عدّله بحسب كل استضافة. شغّله بمستخدم النظام المالك للملفات، لا بحساب root، حتى لا تُغيّر صلاحيات ذاكرة التخزين المؤقت.التحقق المتقاطع عبر Composer
composer show magento/product-community-edition
لـMagento Open Source، أوcomposer show magento/product-enterprise-edition
لـAdobe Commerce. يقرأ Composer ما هو مثبَّت فعلًا. إذا اختلفت القراءتان، فالمرجع هو Composer، ويُدوَّن الفرق.مسح خادم كامل
find /var/www /home -name composer.lock -not -path '*/vendor/*' -exec grep -H -A1 '"name": "magento/product-' {} +
كل ملف يظهر ينتمي إلى تثبيت Magento، ويلي سطرُversionاسمَ الحزمة. بيئة ما قبل الإنتاج المكشوفة أو نسخة قديمة مفكوكة الضغط تُحسب متجرًا: فهي معرَّضة بالطريقة نفسها إذا كانت تُخدَّم.التصنيف بجدول الإصدارات
قارن الرقم الذي قرأته بالجدول أعلاه. قاعدة القراءة: كل إصدار لا يحمل اللاحقة 2026-jul الخاصة بفرعه يجب معالجته. بالنسبة لـMagento Open Source 2.4.5 و2.4.4، الغائبتين عن قائمة NVD، لا تكتب «غير متأثر»: أحِل إلى نشرة Adobe وعامِل المتجر على أنه معرَّض ما لم تقرأ خلاف ذلك.
تدوين سطر لكل متجر
العميل، والخادم، والمسار، ونوع الإصدار، والإصدار المقروء، وتاريخ القراءة وساعتها. أضف من الآن الأعمدة التي ستحتاجها لاحقًا: التصحيح مطبَّق، ونتيجة الفحوص الأربعة، والصلاحيات المدوَّرة. يصبح هذا الجدول الوثيقة المحورية في الملف المسلَّم للعميل.
جمّد الحالة قبل أي تعديل: إنها دليل أيضًا
قبل أي تعديل، جمّد المتجر كما وجدته. على خادم VPS، تلتقط اللقطة (snapshot) للخادم، إن وفّرها مضيفك، القرص كاملًا؛ أضف تصديرًا لقاعدة البيانات وأرشيفًا للشيفرة على وسيط لا يمسّه التحديث. الفرق بين الأداتين مفصّل في مقارنتنا بين اللقطة والنسخة الاحتياطية.
تخدم هذه الحالة مرتين. فهي تتيح التراجع إذا كسر التحديث مسار الشراء. وهي قبل كل شيء تحفظ الدليل: إذا دخل المهاجم، فالملفات المزروعة وتواريخها وكتل CMS المعدَّلة موجودة في هذه النسخة، ولا مكان آخر لها بعد التنظيف. كما تُحيل CISA إلى متطلباتها للفرز الجنائي الرقمي بالنسبة للأنظمة المعنية. لا تحذف هذه الحالة ولا تستبدلها ما دام الملف لم يُغلق.
الترقية بين الفروع، من 2.4.6 إلى 2.4.9 مثلًا، مشروع آخر: إجراؤها عبر Composer وجدول دعمها موجودان في دليل الترقية لدينا. هنا يبقى كل متجر في فرعه ويتلقى التصحيح فقط.
تطبيق التصحيح دون انقطاع طويل
التجربة على بيئة ما قبل الإنتاج
استعِد الحالة المجمَّدة على بيئة ما قبل الإنتاج، أو استنسخ المتجر، ونفّذ التحديث هناك أولًا. قِس مدة كل أمر: هذه المدة هي التي تحدد نافذة الصيانة التي تُعلنها للعميل.
تثبيت الإصدار المصحَّح
composer require magento/product-community-edition=<fixed-version> --no-update
استبدل الحزمة بـmagento/product-enterprise-editionلـAdobe Commerce، و<fixed-version>بالإصدار ذي اللاحقة 2026-jul الخاص بفرعك، كما تكتبه النشرة.حلّ التبعيات واعتماد ملف القفل
composer update magento/product-community-edition --with-all-dependencies
راجِع قائمة الحزم المعدَّلة. ملفcomposer.lockالناتج والمختبَر هو الذي ستنشره: بيئة الإنتاج لا تحلّ شيئًا بعد ذلك، بل تثبّت فقط.فتح نافذة الصيانة في الإنتاج
bin/magento maintenance:enablebin/magento maintenance:allow-ips <your-ip>
كل ما سبق جرى دون إيقاف البيع. الأمر الثاني يتيح لك اختبار المتجر قبل إعادة فتحه.التثبيت والتطبيق
composer install --no-devbin/magento setup:upgradebin/magento setup:di:compilebin/magento setup:static-content:deploy
مع ملف قفل معتمَد مسبقًا، يقتصر الانقطاع على هذه الأوامر الأربعة.إعادة الفتح والتحقق
bin/magento maintenance:disablecomposer show magento/product-community-edition
يجب أن يكون الإصدار المثبَّت هو الإصدار المصحَّح لفرعك. نفّذ طلبًا عبر بوابة الدفع في وضع الاختبار، ثم دوّن الإصدار والساعة في الجدول.
البحث عن آثار الاختراق
سرد الملفات المزروعة تحت pub/media
find pub/media/custom_options/ pub/media/customer_address/ -type f ! -name '.htaccess'
أمر نشرته Sansec، يُشغَّل من جذر المتجر. كل ملف يظهر يجب فحصه، ولا سيما شيفرة PHP. انسخه خارج الشجرة العامة مع تاريخ تعديله قبل حذفه.البحث عن الأبواب الخلفية accesson.php
find . -name 'accesson.php' -type f
تشير Sansec إلى هذا الملف «في عدة مجلدات»: شغّل البحث من الجذر، لا تحتpub/فقط. النتيجة الفارغة تُثبت غياب هذا الملف تحديدًا، لا غياب أي باب خلفي.الاستعلام في الجدول cms_block
SELECT block_id, identifier, update_time FROM cms_block WHERE content LIKE '%fpCode%' OR content LIKE '%se_referrer%' OR content LIKE '%localStorage.getItem%';
استعلام نشرته Sansec. أضف بادئة الجداول الخاصة بالتثبيت إن وُجدت. يساعد العمودupdate_timeعلى تأريخ الحقن.الاستعلام في الجدول cms_page
SELECT page_id, identifier, update_time FROM cms_page WHERE content LIKE '%fpCode%' OR content LIKE '%se_referrer%' OR content LIKE '%localStorage.getItem%';
الفحص نفسه على صفحات CMS. النتيجة ليست بالضرورة خبيثة: قد يظهرlocalStorage.getItemفي شيفرة مشروعة. اقرأ المحتوى قبل أن تحكم.المطابقة مع المؤشرات المنشورة
بالنسبة لموجة مارس 2026، نشرت Sansec نطاق محمّل هو
lanhd6549tdhse.top، ومفتاح localStorage هو136c1e07507f4a97، ووسم باب خلفي هو8194460. ابحث عنها في النتائج السابقة وفي الملفات التي عثرت عليها، مثلًا بالأمرgrep -rl 'lanhd6549tdhse' pub/ app/. هذه القائمة ليست شاملة: غيابها لا يبرّئ المتجر.فحص حسابات المسؤولين
SELECT user_id, username, email, created, logdate, is_active FROM admin_user ORDER BY created DESC;
الحساب الذي لا يعرفه أحد، أو الذي أُنشئ في تاريخ قريب من تاريخ ملف مشبوه، يُعطَّل ثم يُوثَّق. الفحص الشهري لهذه النقاط على كل VPS للعملاء موصوف في قائمة التدقيق لدينا.
تقوية: لا مكان لـPHP تحت pub/media
بمعزل عن PolyShell، لا ينبغي لمجلد يستقبل ملفات يرسلها الزوار أن ينفّذ PHP أبدًا. تحقّق من أن إعدادات nginx أو Apache لديك ترفض تنفيذ الشيفرات تحت pub/media، واختبر ذلك على بيئة ما قبل الإنتاج بملف غير مؤذٍ. هذا ليس إجراء تخفيف نشرته Adobe لهذه الثغرة، ولا يحلّ محل التصحيح: إنه تقوية عامة تقلّل أثر أي عملية رفع ناجحة في المستقبل.
استكشاف الأعطال: العوائق الشائعة أثناء الإجراء
«Your requirements could not be resolved to an installable set of packages.» يرفض Composer الإصدار المطلوب: وحدة من طرف ثالث تثبّت تبعية ما، أو قيد الاستقرار في composer.json يستبعد الإصدار المستهدف. الأمر composer why-not magento/product-community-edition <fixed-version> يسمّي الحزمة التي تعرقل. عالِج ذلك على بيئة ما قبل الإنتاج، لا في الإنتاج أبدًا.
«Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory.» يعرض المتجر هذه الرسالة بعد تحديث الشيفرة: لم تُنفَّذ خطوة setup:upgrade، أو فشلت. أعِد تشغيلها، ثم التجميع.
«Table '…cms_block' doesn't exist» عند تنفيذ استعلام Sansec: يستخدم التثبيت بادئة للجداول. اقرأ البادئة في إعدادات المتجر وأضفها إلى اسم الجدول.
«No such file or directory» مع أمر find الخاص بـpub/media: المجلد custom_options أو customer_address غير موجود في هذا المتجر. دوّن ذلك في الجدول؛ فهو ليس فشلًا ولا دليلًا على النظافة.
متجر يبقى في وضع الصيانة: تحقّق من عدم بقاء علامة صيانة وأعِد تشغيل bin/magento maintenance:disable بالمستخدم المالك للملفات.
بعد التنظيف: ما يجب تدويره
- كلمات مرور المسؤولين — كل الحسابات في
admin_user، بما فيها تلك التي تراها سليمة. - مفاتيح API والتكاملات — رموز التكاملات المعلَنة في لوحة الإدارة، ومفاتيح الخدمات الخارجية (الدفع، الشحن، ERP) المخزَّنة في الإعدادات.
- بيانات اعتماد قاعدة البيانات — كلمة مرور جديدة، تُنقل إلى إعدادات المتجر.
- مفتاح التشفير — يُغيَّر باتباع وثائق Adobe، بعد تقدير الأثر على البيانات المشفَّرة مسبقًا.
- وصول SSH وSFTP — كلمات المرور، ومفاتيح SSH المصرّح بها، وحسابات النظام المجهولة.
- وصول الاستضافة — لوحة التحكم والنسخ الاحتياطية، فهي أيضًا تتيح الوصول إلى الملفات.
التقرير المؤرَّخ الذي يُسلَّم لكل عميل
مرّر الجدول أفقيًا
| العمود | ما تكتبه فيه | السبب |
|---|---|---|
| الإصدار قبل وبعد | الأرقام التي قرأها Composer، مع التاريخ والساعة | يُظهر أن التصحيح APSB26-73 مطبَّق |
| الحالة المجمَّدة | مرجع اللقطة وتصدير قاعدة البيانات | يتيح التراجع والفحص الجنائي الرقمي |
| الملفات تحت pub/media | مسارات الملفات التي وُجدت وتواريخها، أو «لا شيء» | فحص نشرته Sansec |
| accesson.php | المسارات التي وُجدت، أو «لا شيء» | باب خلفي أشارت إليه Sansec |
| cms_block وcms_page | المعرّفات التي ظهرت والحكم بعد القراءة | JavaScript محقون يُقدَّم للزوار |
| حسابات الإدارة | الحسابات المجهولة المعطَّلة، أو «لا شيء» | وصول تركه المهاجم |
| الصلاحيات المدوَّرة | الأسرار التي غُيّرت وتاريخ تغييرها | يغلق ما قد يكون المهاجم نسخه |
| ما لم يُفحص | ما لم تتمكن من فحصه، ولماذا | تقرير صادق خير من «كل شيء على ما يرام» |
ما تحتفظ به، والمصادر التي تُستشهد بها
حين يُكتشف أن متجرًا مخترَق، فالوكالة هي من يتصل بها العميل. حافظ على هذا الدور: أنت تمسك العلاقة والتشخيص والتقرير المؤرَّخ؛ والمنصة تمسك البنية التحتية، ووصول root إلى خادم VPS الذي يتيح تشغيل هذه الفحوص، واللقطة قبل التدخل. نحن لا نعدّل شيفرة متجر نيابةً عنك: تحديث Magento يبقى من مهام الوكالة. احتفظ أيضًا بنموذج الجدول: الثغرة القادمة التي تمسّ متجرًا ستتبع التسلسل نفسه، مع سطر إضافي في الجرد.
المصادر الأولية:
بطاقة NVD للثغرة CVE-2026-48356
نشرة Adobe ذات المرجع APSB26-73
تنبيه CISA بتاريخ 27 أكتوبر 2026
Sansec، موجة الهجوم الواسعة PolyShell
Sansec، محمّل JavaScript في cms_block