
# ماسح للقراءة فقط لإعدادات git التي تسمح لمستودع بتشغيل كود في وكلاء البرمجة (Claude Code, Codex, Cursor, Copilot). يغطي فئة GitSpawn وCVE-2026-45033. بدون تبعيات، بدون شبكة، بدون تتبع.
مستودع يمكن أن يجعل وكيل البرمجة الخاص بك ينفّذ كودًا بمجرد فتح المجلد. GuardSkill يتحقق من ذلك قبل أن تفعل.
npx guardskill .
للقراءة فقط. لا اتصالات شبكة، لا تتبع، لا إعدادات، لا حساب. يقرأ إعدادات git وسكربتات الخطافات، يطبع ما وجده، ثم يخرج.
وكلاء البرمجة يجمعون السياق بتنفيذ أوامر git عادية — git status, git diff — بمجرد فتحهم لمشروع. يقرأ git إعداداته من .git/config الخاص بالمستودع، والعديد من هذه الإعدادات تسمّي برنامجًا لينفّذه git. ضع أمرًا في core.fsmonitor وسيتم تنفيذه بصلاحياتك، خارج أي صندوق حماية، قبل أن تكتب أي شيء.
قطعتان من الأبحاث العامة تجعلان هذا ملموسًا:
.git/config لا يُنقل عبر الاستنساخ. يجب أن يصل المستودع كملفات مع دليل بداخلها بالفعل — ملف مضغوط، محرك أقراص مشترك، مجلد مزامنة، ذاكرة USB، وكيل يفكّ أرشيفًا. (, ).git@github/copilot 1.0.43 بفرض safe.bareRepository=explicit. (GitHub Advisory)التخفيف الموصى به من جانب المستخدم في كلا التقريرين هو نفسه: افحص إعداد git قبل فتح الدليل بوكيل. هذا أمر ممل للقيام به يدويًا عبر شجرة. هذه الأداة تفعله في ثانية.
يتجول GuardSkill في الشجرة ويجد كل إعداد git يمكن أن يلتقطه وكيل: .git الخاص بالمشروع، أي .git متداخل وصل كمحتوى، أي مستودع عارٍ مخفي في دليل فرعي، ملف .git الذي تتركه وحدة فرعية أو شجرة عمل مرتبطة، والإعدادات التي يحتفظ بها git بجانب الرئيسي — config.worktree وكل .git/modules/<name>/config. يتم فحص كل منها.
| الفئة | الفحوصات |
|---|---|
| مفاتيح تنفيذ مباشر | core.fsmonitor, core.sshCommand, core.gitProxy, core.pager, core.editor, sequence.editor, diff.external, uploadpack.packObjectsHook |
| مفاتيح تنفيذ غير مباشر | filter.*.clean / .smudge / .process, diff.*.textconv, merge.*.driver, mergetool.*.cmd, difftool.*.cmd, credential.helper |
| أسماء مستعارة للصدفة | أي alias.* تبدأ قيمته بـ ! |
| إعدادات محمّلة من مكان آخر | include.path, includeIf.*.path |
| الخطافات | تجاوزات core.hooksPath، سكربتات نشطة (غير .sample) في .git/hooks، وسكربتات خطافات تنقل تنزيلًا إلى صدفة أو تفكّك base64 قبل تشغيله |
| النقل | protocol.allow و protocol.<name>.allow معاد ضبطها على always، وأي عنوان remote أو وحدة فرعية يستخدم نقل ext::، الذي يسلّم بقية السطر إلى صدفة |
| البنية | مستودعات عارية داخل الشجرة (ناقل CVE-2026-45033)، دلائل .git متداخلة ليست وحدات فرعية مسجلة، ملفات .git تشير إلى دليل git داخل الشجرة |
npx guardskill . # فحص المشروع الحالي
npx guardskill ~/code/some-project # فحص مسار محدد
npx guardskill . --json # قابل للقراءة آليًا
npx guardskill . --out report.md # كتابة تقرير Markdown أيضًا
npx guardskill . --fail-on critical # إفشال البناء فقط على الاكتشافات الحرجة
npx guardskill . --exclude test/fixtures # تخطي دليل
رموز الخروج: 0 لا شيء عند العتبة أو فوقها، 1 اكتشافات عندها أو فوقها (العتبة الافتراضية: high)، 2 فشل الفحص نفسه.
في CI:
- name: Check for git execution vectors
run: npx guardskill . --fail-on high
مثال على المخرجات:
GuardSkill - git execution-vector scan (read-only)
Path: /Users/dev/projects/inherited-project
Git configurations inspected: 2 Directories walked: 148
[CRITICAL] vendor/payload.git - Bare git repository found inside the project tree
what Git discovers bare repositories while walking directories and applies their
configuration, including keys that execute commands.
found bare repository at vendor/payload.git
do Do not open this project with a coding agent until you have inspected the directory.
[CRITICAL] vendor/payload.git/config:3 - core.fsmonitor runs an external command
found core.fsmonitor = /tmp/.x/run.sh
2 critical, 0 high, 0 medium, 0 low.
Nothing was changed - this scan only reads.
أداة أمان تصرخ "ذئب!" تُلغى. تعمل المجموعة ضد 29 مستودعًا نظيفًا واقعيًا — git-lfs, git-crypt, husky, اصطلاح .githooks, وحدات فرعية مسجلة، مساعدات اعتماد، محررات وصفحات مخصصة، إعداد توقيع — ويفشل البناء إذا أنتج أي منها اكتشافًا فوق المستوى المعلوماتي. تعمل ضد 22 مستودعًا مبنيًا حول نمط هجوم معروف وتفشل إذا فاتها أي منها، أو التُقطت بقاعدة خاطئة.
فوق ذلك توجد مجموعة مراوغة: كل حالة فيها وُجدت بمهاجمة نسخة من GuardSkill كانت قد اجتازت اختباراتها بالفعل، وتعمل على كل commit حتى لا يعيد تغيير مستقبلي فتح واحدة بصمت. تغطي نفس المفتاح المكتوب بكل طريقة لا يزال git يقبلها (حالة الأحرف، الاقتباس، استمرار الأسطر، CRLF، علامة ترتيب البايت، مفتاح على سطر القسم)، حمولات مسماة بأدوات مألوفة، دلائل خطافات مسماة .husky لتبدو روتينية، وإعدادات مخفية حيث لم تنظر النسخة الأولى أبدًا. مجموعة متانة تغذيها بملفات إعداد ثنائية وفارغة ومبتورة وبطول 200,000 سطر، دلائل غير قابلة للقراءة، حلقات روابط رمزية ومؤشرات موجهة خارج الشجرة، وتتطلب تقريرًا بدل تتبع مكدس.
خياران تصميميان متعمدان:
.githooks يُبلَّغ عنها كمعلوماتية (low) بدل كونها خطرًا — لكن GuardSkill ما زال يقرأ السكربتات، ويرفع إلى critical إذا جلب أحدها كودًا أو فكّ تشفيره قبل تشغيله.include / includeIf يُبلَّغ عنه دائمًا. يمكن أن يُدخل include أي مفتاح في هذه القائمة لاحقًا، وهذا بالضبط كيف ستخفي واحدًا. ~/.gitconfig مشترك كتبته بنفسك هو اكتشاف عادي يمكن تجاهله..husky يشغّل npm test معلوماتي، والاكتشاف يسرد ما سيعمل. نفس الدليل يشغّل شيئًا من /tmp ليس كذلك.لا يعدّل أي شيء، أبدًا. لا ينفّذ أي شيء يجده. لا يقوم بأي اتصالات شبكة ولا يجمع أي تتبع — شغّله دون اتصال وسيتصرف بشكل مطابق. لا يفحص تبعيات npm، .claude/settings.json, .vscode/tasks.json أو تعريفات خادم MCP بعد؛ تلك هي الفئة التالية، ليست هذه. وهو إشارة، ليس حكمًا: اقرأ الاكتشاف، انظر إلى الدليل، قرر بنفسك.
SKILL.md في هذا المستودع يسمح لوكيل برمجة بتشغيل الفحص بنفسه قبل فتح مشروع غير مألوف. انسخ الدليل إلى مجلد مهاراتك، أو وجّه وكيلك إلى المستودع.
npm test # يعيد توليد الوحدات التجريبية، ثم يشغّل المجموعة
الوحدات التجريبية مولّدة بكود (test/fixtures/generate.js)، غير ملتزمة يدويًا، لذا توسيع المجموعة النظيفة أو الضعيفة هو بضعة أسطر. قواعد الاكتشاف الجديدة توضع في rules/git-exec-keys.json — قاعدة بدون وحدة تجريبية على الجانبين لن تُدمج.
المراقبة المستمرة، تنبيهات Slack/Teams وطلبات سحب الإصلاح التلقائي مخطط لها كطبقة مدفوعة. الماسح نفسه يبقى مجانيًا ومرخصًا بـ MIT. قواعد الاكتشاف تبقى في المستودع المفتوح — أداة أمان لا يمكنك قراءة قواعدها ليست أداة يجب أن تثق بها.
MIT. مبني ومُصان بواسطة Helios IT Solutions، مزود خدمات تكنولوجيا معلومات هولندي. القضايا الأمنية: انظر SECURITY.md.