Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-5061 — تحقق قالب Consul من المكان الذي يشير إليه الارتباط الرمزي (symlink) أثناء تقييم القالب، لكن جلب التبعية اللاحق قرأ المسار الأصلي. إعادة توجيه الارتباط بين هاتين العمليتين حوّلت مرجع ملف داخل الصندوق الرملي إلى كشف ملف خارج الصندوق الرملي. | Kitploit
أدوات/GitHubGitHub/0xmrma/cve-2026-5061
تحليل الثغرات الأمنيةتحليل الكودالاستغلالتسريب البياناتالتعلم والتعليم
GitHub0xmrma/cve-2026-5061

CVE-2026-5061

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

عرض المستودع
13منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-5061

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

مقدمة

عثرت على هذه المشكلة أثناء مراجعة HashiCorp Consul Template، ومعي سؤال أمني محدد جدًا:

إذا كان sandbox_path يتحقق من رابط رمزي أثناء تقييم القالب، فهل تبقى قراءة الملف اللاحقة مرتبطة بنفس الهدف المُتحقَّق منه؟

في هذه الحالة، كانت الإجابة: لا.

محلّل القالب file حلّ المسار وطبّق الصندوق الرملي المُعدَّل أثناء تقييم القالب. ولكن بعد ذلك الفحص، أنشأ اعتماد ملف (dependency) باستخدام المسار الخام الأصلي.

تم جلب ذلك الاعتماد لاحقًا.

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

أصبحت تلك المشكلة CVE-2026-5061.

نشرة HashiCorp: HCSEC-2026-12
نشرة IBM: النشرة الأمنية CVE-2026-5061
CVE: CVE-2026-5061
تم الإصلاح في: 0.42.0

photo0


سلسلة الهجوم

رابط رمزي داخل الصندوق الرملي يتحكم فيه المهاجم -> تحقق الصندوق الرملي يحلّه إلى هدف آمن -> يخزّن الاعتماد المسار الخام الأصلي -> المهاجم يعيد توجيه الرابط خارج الصندوق الرملي -> جلب الاعتماد يقرأ ملفًا خارجيًا -> المهاجم يستعيد الرابط الآمن -> ينجح التحقق التالي -> يُعرض المحتوى الخارجي المخزَّن مؤقتًا


ما يفعله Consul Template

Consul Template هو أداة عرض قوالب لبيانات Consul وVault.

يمكنه العمل باستمرار، ومراقبة تغييرات الاعتمادات، وعرض البيانات في ملفات أو متغيرات بيئة لتستهلكها التطبيقات.

محلّل القالب file يقرأ ملفًا محليًا ويدرج محتوياته في المخرجات المعروضة.

نظرًا لأن قراءة الملفات المحلية قد تكشف أسرارًا يمكن للعملية قراءتها، يوفر Consul Template خيار sandbox_path كحدود لهذا المحلّل.

الخاصية الأمنية الموثّقة واضحة:

  • المسارات الممرَّرة إلى file يجب أن تقع داخل الصندوق الرملي المُعدَّل
  • المسارات النسبية يجب ألا تخرج من الصندوق الرملي
  • الأهداف المرتبطة يجب ألا تحوّل مسارًا مسموحًا إلى قراءة ملف خارجي

هذا يجعل sandbox_path حدودًا أمنية حقيقية.

السؤال المهم لم يكن ما إذا كان المسار يبدو واقعًا تحت الصندوق الرملي.

السؤال الحقيقي كان:

هل يبقى الملف الذي تتم قراءته هو نفس الملف الذي اجتاز تحقق الصندوق الرملي؟

في الإصدارات المعرضة للثغرة، لم يكن كذلك.


لماذا كان هذا السطح جديرًا بالفحص

غالبًا ما تفشل الصناديق الرملية لنظام الملفات عند الفجوة بين التحقق من المسار والوصول إلى الملف.

النمط الشائع هو:

  • التحقق من مسار
  • إعادة التحكم إلى نظام الملفات
  • استخدام المسار مرة أخرى لاحقًا
  • افتراض أنه ما زال يشير إلى نفس الكائن

هذا الافتراض غير آمن عندما يمكن للمهاجم تعديل رابط رمزي أو أي تحويل ملفات مكافئ بين العمليتين.

جعل Consul Template هذا السطح مثيرًا للاهتمام بشكل خاص لأن تقييم القالب وجلب الاعتمادات كانا مرحلتين منفصلتين.

ذلك الانفصال خلق السؤال الأمني الصحيح:

هل جلب الاعتماد مرتبط بالهدف المُتحقَّق منه، أم أنه يحلّ المسار الذي يتحكم فيه المهاجم مرة أخرى؟

كانت تلك هي الحدود التي ركزت عليها.


السبب الجذري

كان السبب الجذري عبارة عن عدم تطابق بين وقت الفحص ووقت الاستخدام (TOCTOU) بين:

  • تحقق الصندوق الرملي في template/funcs.go
  • قراءة الاعتماد اللاحقة في dependency/file.go

في النسخة المختبرة، كان fileFunc() يقوم بما يلي:

root@kitploit:~
normalized := strings.TrimSpace(s)
err := pathInSandbox(sandboxPath, normalized)
if err != nil {
    return "", err
}

d, err := dep.NewFileQuery(s)

محلّل التحقق حلّ الروابط الرمزية بشكل صحيح قبل فحص الاحتواء:

root@kitploit:~
sandboxResolved, err := filepath.EvalSymlinks(filepath.Clean(sandbox))
targetResolved, err := filepath.EvalSymlinks(filepath.Clean(path))

rel, err := filepath.Rel(sandboxResolved, targetResolved)
if rel == ".." || strings.HasPrefix(rel, ".."+string(filepath.Separator)) {
    return fmt.Errorf("'%s' is outside of sandbox", path)
}

إذًا فحص الصندوق الرملي نفسه فهم الهدف المُحلَّل.

لكن ذلك الهدف المُحلَّل تم تجاهله.

NewFileQuery() خزّن السلسلة الأصلية بدلًا من ذلك:

root@kitploit:~
return &FileQuery{
    stopCh: make(chan struct{}, 1),
    path:   s,
}, nil

ثم قرأ جلب الاعتماد اللاحق ذلك المسار مرة أخرى:

root@kitploit:~
data, err := os.ReadFile(d.path)

هذه هي الثغرة بالكامل.

الرمز فحص حلًا واحدًا لنظام الملفات، ثم استخدم حلًا آخر لاحقًا.

لماذا هذا قابل للاستغلال

لأن الرابط الرمزي قابل للتغيير.

لا يحتاج المهاجم إلى جعل هدف خارج الصندوق الرملي يجتاز pathInSandbox() مباشرة.

يحتاج فقط إلى تغيير ما يحلّ إليه المسار الخام المعتمد مسبقًا بعد التحقق وقبل أن يقوم Fetch() بالقراءة.

التسلسل هو:

  • الرابط يحلّ إلى ملف آمن أثناء pathInSandbox()
  • ينجح التحقق
  • FileQuery يسجّل مسار الرابط الخام
  • يتم استبدال الرابط أو إعادة توجيهه إلى ملف خارجي
  • os.ReadFile(d.path) يحلّ الرابط مرة أخرى
  • تتم قراءة الملف الخارجي
  • القيمة المجلوبة تُخزَّن مؤقتًا في ذاكرة القالب (template brain)
  • تتم استعادة الرابط قبل تقييم القالب التالي
  • ينجح التحقق مرة أخرى
  • يتم إرجاع المحتوى الخارجي المخزَّن مؤقتًا وعرضه

تلك الخطوة الأخيرة مهمة.

استعادة الرابط الآمن لم تُزل السر الذي تم جلبه بالفعل من ذاكرة التخزين المؤقت للاعتمادات.


ما الذي يجعل هذه مشكلة أمنية، وليس مجرد سباق نظام ملفات

التمييز المهم هو تجاوز ضابط أمني صريح.

لم يكن هذا مجرد:

"الملف تغيّر بينما كان Consul Template يراقبه"

مراقبة الملفات للتغييرات سلوك متوقع.

المشكلة الحقيقية كانت:

مسار اجتاز قيد الصندوق الرملي الموثّق يمكن استخدامه لاحقًا لقراءة ملف خارج ذلك الصندوق الرملي

هذا فشل مباشر لحدود الثقة.

كان التطبيق قد اتخذ بالفعل قرارًا أمنيًا:

  • هذا الهدف داخل الصندوق الرملي
  • لذلك من الآمن تسجيله وجلبه

لكن الجلب اللاحق لم يكن مرتبطًا بالهدف الذي برّر ذلك القرار.

هذا هو ما حوّل قابلية تغيّر نظام الملفات العادية إلى ثغرة أمنية.


إثبات المفهوم

بنيت أداة إعادة إنتاج مستقلة حول التسلسل الدقيق لتقييم القالب وجلب الاعتماد.

الإعداد المتحكم به استخدم:

  • دليل صندوق رملي مُعدَّل
  • ملفًا آمنًا داخل ذلك الصندوق الرملي
  • ملفًا سريًا خارج الصندوق الرملي
  • مسار رابط رمزي مُراقَب داخل الصندوق الرملي
  • تبديلات رابط حتمية حول جلب الاعتماد

مسار إعادة الإنتاج كان:

  1. وجّه الرابط الرمزي المُراقَب إلى الملف الآمن داخل الصندوق الرملي.
  2. قيّم محلّل file بحيث ينجح تحقق الصندوق الرملي ويُسجَّل المسار الخام كاعتماد.
  3. أعد توجيه الرابط الرمزي المُراقَب إلى السر الخارجي قبل جلب الاعتماد.
  4. شغّل جلب الاعتماد واترك os.ReadFile(d.path) يقرأ عبر الرابط المعاد توجيهه.
  5. خزّن القيمة المجلوبة في ذاكرة القالب المؤقتة.
  6. استعد الرابط الرمزي إلى الملف الآمن داخل الصندوق الرملي.
  7. قيّم القالب مرة أخرى.
  8. أكّد أن تحقق الصندوق الرملي ما زال ينجح.
  9. أكّد أن المخرجات المعروضة تحتوي السر الخارجي الذي تم جلبه سابقًا.

السلوك المرصود كان:

  • تحقق الصندوق الرملي الأولي نجح
  • الاعتماد احتفظ بمسار الرابط الأصلي
  • الجلب قرأ الملف خارج الصندوق الرملي بعد تغيير الرابط
  • الهدف الآمن تمت استعادته قبل العرض التالي
  • فحص الصندوق الرملي التالي نجح
  • المخرجات المعروضة طابقت السر الخارجي تمامًا عبر SHA-256

تلك المقارنة بالتجزئة كانت مهمة.

أثبتت أن القيمة المعروضة النهائية لم تكن محتوى آمنًا قديمًا، أو أثر اسم ملف، أو أثرًا جانبيًا لمسار خطأ.

كانت المحتوى الحرفي (byte-exact) للملف خارج الصندوق الرملي.


لماذا اختير إثبات المفهوم بهذه الطريقة

أقوى إثبات لمشكلة TOCTOU يجب أن يتحكم في الخط الزمني.

مجرد إظهار أن رابطًا رمزيًا يمكن أن يشير خارج الصندوق الرملي سيكون أضعف لأن pathInSandbox() كان يرفض بالفعل هدفًا خارجيًا عندما يرصده.

الادعاء الأمني اعتمد على إثبات كل هذه الحالات بالترتيب:

  • آمن وقت التحقق
  • غير آمن وقت الجلب
  • آمن مرة أخرى وقت العرض
  • المحتوى الخارجي ما زال يُستهلك من ذاكرة التخزين المؤقت

لهذا فصلت أداة إعادة الإنتاج بين تحقق القالب، وجلب الاعتماد، واستعادة الرابط، ثم العرض التالي بشكل صريح.

لم يعتمد إثبات المفهوم على توقيت عشوائي أو تخمين متكرر.

قاد دورة الحياة المعرضة للثغرة بشكل حتمي.

هذا جعل الدفاع عن السبب الجذري والتأثير أسهل بكثير.


متطلبات الاستغلال والنطاق

تتطلب هذه المشكلة تأثيرًا محليًا على نظام الملفات.

يحتاج المهاجم إلى وصول كافٍ لإنشاء الرابط الرمزي المعني أو استبداله أو إعادة توجيهه، أو أي مسار مرتبط مكافئ، خلال النافذة المعرضة للثغرة.

كما يجب أن تكون عملية Consul Template:

  • لديها إذن لقراءة الهدف الخارجي
  • تقيّم قالبًا يستخدم المسار المتأثر بالمهاجم
  • تعرض النتيجة المعروضة في مكان يمكن للمهاجم استرجاعه أو التأثير على استخدامه

تلك المتطلبات مهمة.

لم تكن هذه قراءة ملف عشوائية عن بُعد غير مصادق عليها من أي نشر افتراضي.

لكن ضمن نموذج الثقة المحلي المتأثر، كان التأثير ذا معنى:

  • تجاوز قيد sandbox_path الموثّق
  • كشف ملفات محلية خارج الصندوق الرملي
  • احتمال كشف أسرار يمكن لعملية Consul Template قراءتها

يزداد الخطر عندما تعمل العملية مع إمكانية الوصول إلى بيانات اعتماد حساسة، أو إعدادات الخدمة، أو الرموز، أو المفاتيح الخاصة.


الخطورة والتصنيف

صنّف HashiCorp المشكلة على النحو التالي:

  • CWE-59: تحسين غير صحيح لتحليل الروابط قبل الوصول إلى الملف (Improper Link Resolution Before File Access)
  • CVSS 3.1:
root@kitploit:~
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:N

الدرجة الأساسية المنشورة هي:

root@kitploit:~
4.7 / Medium

تعكس هذه الدرجة القيود الحقيقية:

  • ناقل هجوم محلي
  • امتيازات منخفضة مطلوبة للتأثير على المسار
  • تعقيد هجوم مرتفع لأن الرابط يجب أن يتغيّر خلال نافذة دورة الحياة ذات الصلة
  • لا يتطلب تفاعل الضحية
  • تأثير سرية مرتفع إذا تم جلب ملف حساس يمكن للعملية قراءته

هذا تصنيف معقول.

المشكلة ضيقة من حيث المتطلبات المسبقة للمهاجم، لكن تجاوز الصندوق الرملي وكشف الملفات الناتج كلاهما ملموس.


الإصدارات المتأثرة

نشرة HashiCorp تسرد:

root@kitploit:~
Affected: consul-template up to 0.41.4
Fixed:    consul-template 0.42.0

تم شحن الإصلاح في إصدار 0.42.0 بتاريخ 15 أبريل 2026.


تحليل الإصلاح

كان الإصلاح صغيرًا وعالج الارتباط المكسور مباشرة.

بدلًا من التحقق من الهدف المُحلَّل ثم بناء الاعتماد من المدخلات الخام، يعيد الرمز المُصحَّح المسار المُحلَّل ويعطيه إلى NewFileQuery():

root@kitploit:~
resolvedPath, err := resolveSandboxedPath(
    sandboxPath,
    strings.TrimSpace(s),
)
if err != nil {
    return "", err
}

d, err := dep.NewFileQuery(resolvedPath)

الخاصية الأمنية تغيّرت من:

  • تحقق من الهدف المُحلَّل
  • تجاهل الهدف المُحلَّل
  • الجلب لاحقًا عبر المسار الخام

إلى:

  • تحقق من الهدف المُحلَّل
  • الاحتفاظ بالهدف المُحلَّل
  • الجلب عبر ذلك المسار المُتحقَّق منه

هذا يغلق مسار إعادة توجيه الرابط المبلغ عنه لأن تغيير الرابط الأصلي لم يعد يغيّر المسار المخزَّن بواسطة الاعتماد.

أضاف التصحيح أيضًا اختبار انحدار مركّزًا يغطي التسلسل الدقيق:

  • رابط آمن أثناء التحقق
  • رابط خارجي أثناء الجلب
  • رابط آمن مستعاد قبل الاستدعاء التالي
  • السر الخارجي المخزَّن مؤقتًا يجب ألا يُعاد

هذا هو نوع المعالجة الذي تريده لهذه الثغرة:

  • إصلاح الارتباط المكسور بين التحقق والاستخدام
  • الحفاظ على سلوك الصندوق الرملي
  • إضافة اختبار انحدار لدورة حياة السباق الكاملة

الإفصاح

أبلغت عن هذه المشكلة بشكل خاص إلى أمن HashiCorp في 20 مارس 2026.

تضمن التقرير:

  • تحليل السبب الجذري على مستوى الكود المصدري
  • تسلسل TOCTOU من التحقق إلى الجلب
  • أداة إعادة إنتاج حتمية مستقلة
  • مخرجات وقت التشغيل
  • أدلة SHA-256 تُظهر أن البيانات المعروضة طابقت السر الخارجي
  • تفاصيل النسخة المتأثرة

أصلح HashiCorp المشكلة في 0.42.0 ونشر HCSEC-2026-12 بتاريخ 12 مايو 2026.

نشرت IBM نشرة أمنية مقابلة لنفس CVE.

اعترفت النشرتان الرسميتان بالتقرير باسم:

Mohamed Abdelaal (0xmrma)


ما الذي تعلّمه هذه الثغرة حقًا

الدرس الرئيسي بسيط:

التحقق من المسار ليس كافيًا إذا كانت عملية الملف اللاحقة يمكن أن تحلّ ذلك المسار إلى كائن مختلف

تلك القاعدة تنطبق أبعد من Consul Template بكثير.

إنها مهمة في أي مكان يقوم فيه الكود بما يلي:

  • فحوصات الصندوق الرملي
  • فحوصات وجهة الرفع
  • استخراج الأرشيف
  • قراءات الأسرار المحلية
  • التعامل مع الملفات المؤقتة
  • عمليات الملفات المفصولة بالامتيازات

الخاصية الأمنية الأعمق ليست:

"سلسلة المسار بدت آمنة مرة واحدة"

إنها:

الكائن المستخدم في العملية الحساسة يجب أن يكون الكائن الذي اجتاز التحقق

في هذه الحالة، تحقق Consul Template من حلّ وجلب حلًا آخر.

تلك الفجوة كانت كافية.


النقاط الرئيسية

  • كان sandbox_path حدودًا أمنية صريحة للملفات المحلية
  • pathInSandbox() حلّ وتحقق من هدف الرابط الرمزي بشكل صحيح
  • تم تجاهل الهدف المُحلَّل بعد التحقق
  • FileQuery احتفظ بالمسار الأصلي المتأثر بالمهاجم
  • جلب الاعتماد حلّ ذلك المسار مرة أخرى لاحقًا عبر os.ReadFile
  • استعادة الرابط الآمن لم تُزل المحتوى الخارجي المخزَّن مؤقتًا بالفعل
  • أثبت إثبات المفهوم كشفًا خارج الصندوق الرملي مطابقًا بالبايت عبر SHA-256
  • الإصدار 0.42.0 أصلح الثغرة بربط الاعتماد بالمسار المُحلَّل والمُتحقَّق منه

كلمات أخيرة

لم تكن هذه الثغرة عن تجاوز فحص بادئة سلسلة.

كانت عن الزمن والهوية.

تحقق Consul Template من أين يشير الرابط أثناء تقييم القالب. طلب جلب الاعتماد لاحقًا من نظام الملفات نفس السؤال مرة أخرى. يمكن للمهاجم تغيير الإجابة بين هاتين اللحظتين.

لهذا أصبحت CVE-2026-5061.

تم الإصلاح في consul-template 0.42.0.

تنزيل الأداة