Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-35204 — إثبات مفهوم يوضح ثغرة اجتياز المسار (CVE-2026-35204) في تثبيت إضافات Helm، مما يسمح بكتابة ملفات عشوائية عبر بيانات وصفية معدّة. | Kitploit
أدوات/GitHubGitHub/h3ck13r/cve-2026-35204
أمن الحاوياتتحليل الثغرات الأمنيةالاستغلالأمن السحابةأمن سلسلة التوريدالتعلم والتعليم
GitHubh3ck13r/cve-2026-35204

CVE-2026-35204

إثبات مفهوم يوضح ثغرة اجتياز المسار (CVE-2026-35204) في تثبيت إضافات Helm، مما يسمح بكتابة ملفات عشوائية عبر بيانات وصفية معدّة.

عرض المستودع
112منذ 3 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-35204

يمثل هذا المستودع إثباتًا عمليًا (PoC) لثغرة CVE-2026-35204

الوصف

"Helm هو مدير حزم لمخططات Kubernetes. من الإصدار 4.0.0 إلى 4.1.3، عند تثبيت أو تحديث إضافة Helm مصممة بشكل خاص، سيتسبب Helm في كتابة محتويات الإضافة إلى موقع عشوائي في نظام الملفات. لمنع ذلك، تحقق من أن ملف plugin.yaml الخاص بإضافة Helm لا يحتوي على حقل version: يحتوي على فواصل مسار POSIX للنقطتين أي "/../". تم إصلاح هذه الثغرة في الإصدار 4.1.4."

يوضح هذا الإثبات العملي أن metadata.Version يُستخدم لبناء مسار أرشيف الإضافة، مما يسمح باجتياز المسار وكتابة ملف plugin.tgz الذي تم تنزيله خارج دليل الإضافة المقصود. لا يزال يتم استخراج محتويات الإضافة إلى دليل التخزين المؤقت المخصص قبل تثبيتها، لذلك لا يوضح هذا الإثبات العملي استخراجًا عشوائيًا أو الكتابة فوق ملفات المضيف بشكل عشوائي.

تُصنف الثغرة على أنها CWE-22 - التقييد غير الصحيح لاسم المسار إلى دليل محظور ('اجتياز المسار')

كيف يعمل

يحتوي مثبّت إضافة Helm على واجهة بأربعة تطبيقات (HTTP، محلي، VCS و OCI). يركز هذا الإثبات العملي على مثبّت HTTP. على عكس مثبّتات HTTP/OCI، لا يبني مثبّت VCS مسار tarball من metadata.Version على الإطلاق. إليك كتلة كود تُعدّ tarballPath:

filename := fmt.Sprintf("%s-%s.tgz", metadata.Name, metadata.Version)
tarballPath := helmpath.DataPath("plugins", filename)

حيث metadata.Version هو المتغير الذي نتحكم فيه في plugin.yaml. لتشغيل الثغرة، تحتاج إلى حزم إضافتك المصممة في أرشيف .tgz، حيث إن metadata.Version الخاص بها هو الذي يتم استخراجه بواسطة plugin.ExtractTgzPluginMetadata وتنزيله عبر مثبّت HTTP/OCI/المحلي. لذلك، لتحقيق اجتياز المسار، يمكننا استخدام http_installer، الذي يجلب الإضافات كأرشيف يقدمه خادم ويب.

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

./helm plugin install http://0.0.0.0:8000/evil.tar.gz
Verifying plugin signature...
WARNING: No provenance file found for plugin. Plugin is not signed and cannot be verified.
filename ->  evil-2.2.2.tgz
tarballPath ->  /home/s0m3body/.local/share/helm/plugins/evil-2.2.2.tgz
i.CacheDir ->  /home/s0m3body/.cache/helm/plugins/http-0.0.0.0-8000-evil.tar.gz
i.Path() ->  /home/s0m3body/.local/share/helm/plugins/evil
Installed plugin: evil
./helm plugin install http://127.0.0.1:8000/evil.tar.gz
Verifying plugin signature...
WARNING: No provenance file found for plugin. Plugin is not signed and cannot be verified.
filename ->  evil-../../../../../../.ssh/pwn3d.tgz
tarballPath ->  /home/s0m3body/.ssh/pwn3d.tgz
i.CacheDir ->  /home/s0m3body/.cache/helm/plugins/http-127.0.0.1-8000-evil.tar.gz
i.Path() ->  /home/s0m3body/.local/share/helm/plugins/evil
Installed plugin: evil

تُظهر تتبعات وقت التشغيل أن اجتياز المسار يؤثر فقط على الموقع الذي يتم فيه وضع أرشيف الإضافة الذي تم تنزيله، وهو أساسًا متغير البيئة HELM_PLUGINS. يبقى التخزين المؤقت (i.CacheDir) والاستخراج النهائي (i.Path()) دون تغيير. مع أخذ ذلك في الاعتبار، يمكننا التلاعب بوجهة الأرشيف المؤقت واسمه مما يؤدي إلى كتابة ملف.

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

أثناء تحليلي لمثبّت HTTP، لاحظت أن استخراج الأرشيف يحدث في i.CacheDir، بينما التثبيت (fs.CopyDir) ينسخ الملفات من i.CacheDir إلى i.Path(). لم أجد مسار كود حيث يؤثر tarballPath المتأثر بالاجتياز على محتوى الأرشيف. لذلك، بناءً على تتبع وقت التشغيل المُحلَّل، فإن وجهة استخراج الأرشيف مستقلة عن tarballPath المتحكم فيه بالاجتياز.

يذكر التنبيه كلاً من التثبيت والتحديث. بالنسبة لمثبّتات HTTP/المحلي/VCS، لم يتم تنفيذ Update()؛ ينفذ مثبّت OCI التحديث عن طريق استدعاء Install() بعد إزالة الإضافة السابقة.

إليك طريقة Update() من مثبّت HTTP:

func (i *HTTPInstaller) Update() error {
	return fmt.Errorf("method Update() not implemented for HttpInstaller")
}

للتخفيف من الثغرة، تمت إضافة دالة isValidSemver، والتي يتم استدعاؤها الآن عند استدعاء Validate() داخل metadata.go.

"github.com/Masterminds/semver/v3"

func isValidSemver(v string) bool {
	_, err := semver.NewVersion(v)
	return err == nil
}

if m.Version != "" && !isValidSemver(m.Version) {
    errs = append(errs, fmt.Errorf("invalid plugin version %q: must be valid semver", m.Version))
}

كما ترى، إذا لم يكن الإصدار semver صالحًا (و ../../../../ ليس كذلك)، فسنحصل على خطأ أثناء عملية تثبيت إضافة helm الخبيثة.

المتطلبات

  • ملف helm الثنائي مثبّت
  • مفسّر python مثبّت

الاستخدام

لتشغيل الإثبات العملي يمكنك استخدام سكربت scripts/pos.sh:

./scripts/poc.sh

والذي سينتج شيئًا كهذا:

gifs/helm-cve-2026-35204-1.png gifs/helm-cve-2026-35204-2.png

المراجع

  • NVD - CVE-2026-35204
  • Github Advisory databse - GHSA-vmx8-mqv2-9gmg

الترخيص

MIT

تنزيل الأداة