ثغرتان حرجتان وسلسلة استغلال كاملة
في 25 سبتمبر 2026، نُشرت استشارتا أمان في آنٍ واحد لـDokploy، أداة النشر ذاتية الاستضافة البديلة لـHeroku وRender. يُشكّل الجمع بينهما التهديد الأشد خطورة الذي طال منظومة PaaS ذاتية الاستضافة عام 2026: لا حساب مطلوب، وصول root على المضيف في أقل من دقيقة، وكل نسخة أقل من 0.29.13 مكشوفة.
CVE-2026-45631 (CVSS 10.0) يتعلق بسر JWT مضمَّن في الكود. CVE-2026-72863 (CVSS 9.9) يتعلق بمعالجات WebSocket التي تُصادق دون أن تُصرِّح. كل ثغرة على حدة بالغة الخطورة. مجتمعتين تشكّلان هجوماً كاملاً: الأولى تمنح الهوية الإدارية، والثانية تمنح التنفيذ.
CVE-2026-45631 (CVSS 10.0): سر JWT المضمَّن في الكود
تصف الاستشارة GHSA-w3gm-rc4p-9rhj ثغرة من نوع CWE-798 — استخدام بيانات اعتماد ثابتة في الكود. يستخدم Dokploy مكتبة better-auth لإدارة الجلسات ورموز JWT. في الإصدارات من 0.27.0 إلى 0.29.2 شاملةً، تركت قيمة المتغير BETTER_AUTH_SECRET الافتراضية على better-auth-secret-123456789 في الكود المصدري المنشور على GitHub.
هذه القيمة هي ما يُوقِّع كل رموز JWT الإدارية في Dokploy. كل من يعرفها — وهي متاحة للعموم منذ أول commit في الإصدار 0.27.0 — يستطيع تزوير رمز JWT صالح بصلاحيات المسؤول دون امتلاك أي حساب على النسخة المستهدفة. تقبل واجهة API الإدارية في Dokploy جميع الطلبات: قراءة كل أسرار النشر، وتنفيذ الأوامر عبر API، وتعديل إعدادات الخدمات.
درجة CVSS 10.0 هي الحد الأقصى المطلق في المقياس. وتعكس الغياب الكامل لأي حاجز: ناقل الهجوم هو الشبكة، ولا يلزم أي تفاعل من المستخدم، ولا مصادقة مسبقة، وسرية المضيف وسلامته وتوافره مُخترَقة كلياً.
التحقق مما إذا كانت نسختك مكشوفة لـCVE-2026-45631
على مضيف Dokploy، نفِّذ: grep BETTER_AUTH_SECRET /etc/dokploy/.env
إذا كانت القيمة المعروضة هي better-auth-secret-123456789، أو كان المتغير غائباً عن الملف، أو سبق ملفَّ .env الإصدارَ 0.29.3 دون أن يُعاد توليده: فنسختك مكشوفة. إصدار الثنائي وحده لا يكفي — التحديث دون تدوير السر يُبقي القيمة القديمة.
CVE-2026-72863 (CVSS 9.9): التصعيد عبر طرفيات WebSocket
تصف الاستشارة GHSA-7r6p-v9gw-pwc8 ضبط تحكم وصول غير كافٍ على معالجات WebSocket التي تكشف طرفيات Docker في Dokploy. الثغرة من نوع CWE-285 — تفويض غير صحيح.
يتيح Dokploy لكل مستخدم الوصول إلى طرفية تفاعلية في حاوياته عبر WebSocket. الفحص المُطبَّق كان يُصادق المستخدم — يؤكد وجود رمز صالح — لكنه لا يُصرِّح: لم يتحقق من أن الخدمة المطلوبة تعود فعلاً للمستخدم الطالب. وبذلك يستطيع أي مستخدم بحساب صالح، حتى دون صلاحيات إدارية، فتح طرفية في أي حاوية لأي مستخدم آخر.
التأثير الفعلي يتجاوز الحاوية ذاتها. يعمل Dokploy بصلاحيات root ويُوصِّل مقبس Docker للمضيف (/var/run/docker.sock). من داخل shell في حاوية، يمنح الأمر docker run --rm -v /:/host alpine chroot /host sh صدفة root على نظام ملفات المضيف. جميع الإصدارات الأقل من 0.29.13 متأثرة.
سيناريو الهجوم الكامل: من الصفر إلى root
تُشكّل سلسلة CVE-2026-45631 + CVE-2026-72863 هجوماً كاملاً قابلاً للتنفيذ من أي شبكة، دون حساب مسبق، في خطوتين.
الخطوة 1 — تزوير رمز مسؤول (CVE-2026-45631). يعرف المهاجم القيمة better-auth-secret-123456789 من الكود المصدري العام. يُولِّد رمز JWT موقَّعاً بهذه القيمة مدَّعياً دور المسؤول. تقبل API الخاصة بـDokploy هذا الرمز دون تحقق إضافي. يمتلك المهاجم الآن صلاحية إدارية كاملة: قائمة بكل الخدمات والأسرار البيئية ومفاتيح النشر.
الخطوة 2 — الوصول إلى طرفية حاوية (CVE-2026-72863). بالرمز الإداري المزوَّر، يفتح المهاجم اتصال WebSocket بطرفية أي حاوية. يسمح الفحص الغائب للتصريح بتمرير الطلب. يمتلك المهاجم الآن shell داخل الحاوية.
النتيجة — root على المضيف. مع تشغيل Dokploy بصلاحيات root ومقبس Docker مُوصَّل، ينتقل المهاجم من الحاوية إلى المضيف. نظام الملفات بالكامل، وأسرار كل المشاريع المستضافة، ومفاتيح SSH، والمتغيرات البيئية للإنتاج — كلها في متناوله. لا يتطلب الأمر أي تفاعل من المشغّل ولا حساباً مسبقاً.
مصفوفة الإصدارات والتصحيحات
مرّر الجدول أفقيًا
| CVE | CVSS | الإصدارات المتأثرة | الإصدار المُصلَح | الإجراء المطلوب |
|---|---|---|---|---|
| CVE-2026-45631 | 10.0 — حرجة | 0.27.0 – 0.29.2 | ≥ 0.29.3 | التحديث + توليد BETTER_AUTH_SECRET من جديد |
| CVE-2026-72863 | 9.9 — حرجة | < 0.29.13 | ≥ 0.29.13 | التحديث إلى 0.29.13 كحد أدنى |
| السلسلة الكاملة | 10.0 فعلياً | < 0.29.13 مع السر الافتراضي | ≥ 0.29.13 | التحديث + تدوير السر |
تشخيص نسختك قبل تطبيق التصحيح
قبل المتابعة في التحديث، قيِّم مدى انكشاف نسختك بدقة.
التحقق من الإصدار المثبَّت: docker exec dokploy cat /app/package.json | grep '"version"'
إذا كان الإصدار المعروض أقل من 0.29.13، فنسختك معرَّضة لـCVE-2026-72863. إذا كانت بين 0.27.0 و0.29.2، فهي معرَّضة للثغرتين في آنٍ واحد.
التحقق من قيمة سر JWT: grep BETTER_AUTH_SECRET /etc/dokploy/.env
إذا كانت القيمة better-auth-secret-123456789 أو كان المتغير غائباً، فـCVE-2026-45631 قابلة للاستغلال على نسختك بصرف النظر عن الإصدار.
التحقق من الانكشاف الشبكي: إذا كانت واجهة Dokploy متاحة من الإنترنت دون تقييد IP (جدار حماية، Cloudflare Access، VPN)، فسطح الهجوم عام. لا يحتاج المهاجم إلى أي وصول شبكي مسبق لاستغلال CVE-2026-45631.
دليل التحديث خطوة بخطوة إلى Dokploy 0.29.13
نسخ احتياطي للإعدادات والبيانات
قبل أي عملية، أنشئ نسخة احتياطية كاملة.
# نسخ دليل الإعداد احتياطياً cp -r /etc/dokploy /etc/dokploy.bak-$(date +%Y%m%d-%H%M) # نسخ قاعدة بيانات Dokploy احتياطياً docker exec dokploy-postgres pg_dump -U dokploy dokploy > /root/dokploy-db-$(date +%Y%m%d).sqlاحتفظ بهذه النسخ خارج مضيف Dokploy — إذا اختُرقت النسخة، فالنسخ الاحتياطية المحلية في متناول المهاجم.
التحقق من الإصدار الحالي وملف docker-compose.yml
حدِّد طريقة التثبيت والإصدار المُثبَّت في ملف Compose الخاص بك. تستخدم معظم تثبيتات Dokploy الصورة الرسمية
dokploy/dokploy. إذا كان ثمة وسم إصدار مُثبَّت في docker-compose.yml، فدوِّنه.cat /etc/dokploy/docker-compose.yml | grep 'image:'تحديث صورة Dokploy
من دليل إعداد Dokploy:
cd /etc/dokploy docker compose pullيُنزِّل هذا الأمر صورة
dokploy/dokploy:latestأو الوسم المُثبَّت. لتثبيت الإصدار المُصلَح صراحةً، حدِّث السطر image:في docker-compose.yml: استبدل الوسم الموجود بـdokploy/dokploy:0.29.13قبل تشغيل pull.إعادة تشغيل الحاويات
cd /etc/dokploy docker compose down docker compose up -dانتظر حتى تصل الحاويات إلى الحالة
healthyقبل المتابعة:docker compose psيجب أن يُظهر Dokploy وقاعدة بيانات PostgreSQL كلاهما
Upأو healthy.توليد قيمة جديدة لـBETTER_AUTH_SECRET
هذه هي الخطوة الأهم والأكثر إغفالاً. التحديث دون تدوير السر يُبقي CVE-2026-45631 قابلة للاستغلال. ولِّد قيمة عشوائية جديدة آمنة تشفيرياً:
openssl rand -base64 48انسخ القيمة المُولَّدة. افتح
/etc/dokploy/.envواستبدل السطر BETTER_AUTH_SECRET=...بالقيمة الجديدة. إذا كان المتغير غائباً عن الملف، أضفه.ثم أعد تشغيل Dokploy لتطبيق التغيير:
cd /etc/dokploy && docker compose down && docker compose up -dملاحظة: تدوير السر يُبطل جميع الجلسات النشطة. سيحتاج المستخدمون المتصلون إلى تسجيل الدخول مجدداً.
التحقق من الإصدار بعد التحديث
تأكد من تشغيل الإصدار 0.29.13 أو أحدث:
docker exec dokploy cat /app/package.json | grep '"version"'تحقق أيضاً من تطبيق السر الجديد:
grep BETTER_AUTH_SECRET /etc/dokploy/.envيجب ألا تكون القيمة بعد الآن
better-auth-secret-123456789. إذا كانت كذلك، فلم يُطبَّق التدوير — أعِد الخطوة السابقة.
إجراءات التصليب بعد التصحيح
يُصلح التحديث كلتا الثغرتين. تُقلل هذه الإجراءات الإضافية من سطح الهجوم المتبقي.
تقييد الوصول الشبكي لواجهة Dokploy. لا توجد مبررات لإتاحة واجهة الإدارة من الإنترنت. قيِّد الوصول إلى المنفذ 3000 (أو المنفذ الذي تستخدمه) على عناوين IP لفريقك عبر جدار حماية المضيف، أو ضع Dokploy خلف VPN.
تفعيل المصادقة متعددة العوامل (MFA). يدعم Dokploy بروتوكول TOTP منذ الإصدار 0.28.0. فعِّله لجميع حسابات الإدارة.
مراجعة أسرار بيئة المشاريع. يخزِّن Dokploy متغيرات البيئة الخاصة بتطبيقاتك. إذا كانت النسخة مكشوفة خلال نافذة الثغرة (الإصدارات 0.27.0 إلى 0.29.12)، افترض أن جميع أسرار الإنتاج قد تكون قد اطُّلع عليها. يُوصى بتدوير مفاتيح API ورموز قاعدة البيانات وأسرار التطبيق.
مقبس Docker ومبدأ الامتياز الأدنى. مقبس Docker المُوصَّل كحجم هو سطح هجوم موثَّق ومُستغَل في CVE-2026-72863. يحتاجه Dokploy للعمل، لكن يمكن تقييد الوصول عبر سياسات وكيل مقبس Docker مثل Tecnativa/docker-socket-proxy للحد من العمليات المُصرَّح بها.
هل Dokploy لا يزال موثوقاً رغم هذه الثغرات؟
هذه الثغرتان خطيرتان، لكن استجابة المطوِّرين تستحق التأمل قبل إصدار حكم على نضج المشروع.
نُشرت الاستشارات في 25 سبتمبر 2026. كان إصلاح CVE-2026-45631 متاحاً في الإصدار 0.29.3، وإصلاح CVE-2026-72863 في الإصدار 0.29.13 — كلاهما في مهلة معقولة بعد الإفصاح المسؤول. يُديم المشروع برنامج أمان عبر GitHub Security Advisories، مما يدل على قدر من النضج في إدارة الثغرات.
Dokploy مشروع شاب (أول إصدار مستقر عام 2024) يحقق انتشاراً سريعاً: أكثر من 15 ألف نجمة على GitHub ووتيرة إصدارات مستمرة. وجود سر ثابت في الإصدارات الأولى يعكس ديناً أمنياً نموذجياً للمشاريع سريعة النمو حيث أُولِيت سهولة التثبيت الأولوية على صرامة الإعدادات الافتراضية.
يبقى المشروع خياراً ملائماً للفرق التي تريد PaaS ذاتية الاستضافة وسهلة الوصول، شريطة متابعة تحديثات الأمان وتطبيق إجراءات التصليب الموضَّحة في هذا المقال.
البدائل إذا كنت تفكر في الانتقال
إذا دفعتك هذه الثغرات إلى إعادة تقييم اختيارك لـPaaS ذاتية الاستضافة، إليك البدائل النشطة في هذا القطاع.
Coolify هو أقرب البدائل من حيث الميزات. مفتوح المصدر، يُصان بنشاط، بنموذج أمان أكثر نضجاً لإدارة الأسرار (لا قيمة افتراضية مضمَّنة موثَّقة حتى الآن). واجهته أكثر تعقيداً لكن قاعدة كوده أكبر وأكثر مراجعةً.
Caprover خيار مجرَّب، أقدم وبالتالي بسجل أمني أطول. أقل نشاطاً في الميزات الجديدة لكن أكثر استقراراً.
Portainer مع Docker stacks يبقى نهجاً صالحاً للفرق التي لا تحتاج PaaS كاملة. يحمل Portainer ثغراته التاريخية — ولا سيما تصعيد الامتيازات عبر Docker API — لكن الإصدار 3.x أعاد النظر في إدارة التفويض.
أياً كان البديل المختار، تطبيق إجراءات التصليب ذاتها (تقييد الوصول الشبكي، MFA، تدوير منتظم للأسرار) يبقى الخط الأساسي غير القابل للتفاوض.
على VPS من ServOrbit، يختزل التصحيح في أمرَين
تشغيل docker compose pull && docker compose up -d من /etc/dokploy، يليه توليد قيمة جديدة لـBETTER_AUTH_SECRET، يُطبِّق الإصلاح الكامل. على VPS بوصول root، تختار نافذة الصيانة الخاصة بك دون الانتظار على مزود الاستضافة. إذا نشرت Dokploy عبر قالب ServOrbit، فملف .env في /etc/dokploy/ والملف docker-compose.yml هو الذي يُوفِّره القالب.
الخلاصة: النقاط غير القابلة للتفاوض
CVE-2026-45631 (CVSS 10.0) وCVE-2026-72863 (CVSS 9.9) تتسلسلان في هجوم من الصفر إلى root على المضيف. أي نسخة من Dokploy أقل من 0.29.13 مع السر الافتراضي better-auth-secret-123456789 قابلة للاختراق من أي شبكة.
يتطلب الإصلاح خطوتين متمايزتين وكلتاهما إلزاميتان: التحديث إلى الإصدار 0.29.13 كحد أدنى (docker compose pull && docker compose up -d)، وتوليد قيمة جديدة لـBETTER_AUTH_SECRET في ملف .env (openssl rand -base64 48). إحداهما دون الأخرى لا يُغلق إلا نصف السطح.
بعد التحديث، قيِّد الوصول الشبكي لواجهة الإدارة، فعِّل MFA، وإذا كانت النسخة مكشوفة خلال نافذة الثغرة، دوِّر جميع أسرار التطبيقات المستضافة.