Claude Code يحفظ الرموز المميزة في ملف، و1122 مستودعًا كشفتها علنًا
عندما يضغط المطوّر في Claude Code على «Yes, and don't ask again»، يكتب الوكيل الأمر كاملًا في الملف .claude/settings.local.json. وإذا كان فيه رمز مميز أو كلمة مرور فإنه يبقى داخل الملف. ولا يضيف Claude الحماية من git إلا في قائمة الاستبعاد العامة على الحاسوب المحمول، ولذلك يُرفع الملف في commit دون عوائق. ووفق Apiiro، عُثر في المستودعات العامة على 104185 نسخة، وفي 1122 منها سرّ واحد على الأقل.
معالج بواسطة الذكاء الاصطناعي من GitLab Blog؛ بتحرير Hamidun News
موقف مألوف: يطلب الوكيل إذنًا لتشغيل أمر shell، وقد مللتَ من تأكيد الشيء نفسه مرارًا فتضغط «Yes, and don't ask again». يتذكر Claude Code اختيارك ويكتب الأمر في الملف .claude/settings.local.json داخل المشروع. المشكلة أن الأمر يُحفظ حرفيًا. فإذا استدعيتَ واجهة API عبر curl مع الترويسة PRIVATE-TOKEN، فسيظهر الرمز المميز في هذا الملف بصيغة مكشوفة.
لماذا ينتقل الملف إلى المستودع
لكي لا يصل الملف إلى git، يضيفه Claude Code إلى قائمة الاستبعاد العامة الشخصية للمطوّر (global exclude)، لا إلى .gitignore الخاص بالمشروع. وهذه الحماية تعيش على حاسوب محمول واحد ولا تنتقل مع المستودع. أما الزميل أو بيئة CI أو الحاسوب الثاني فلا يعرف شيئًا عن هذا الاستثناء. فيلتقط الأمر git add . الملف، ويذهب إلى حيث يوجد المستودع.
قدّرت شركة Apiiro حجم المشكلة في مطلع نوفمبر 2026. ففي المستودعات العامة وُجدت 104185 نسخة من الملف، وكان في 1122 منها سرّ واحد على الأقل. وبقيت مئات الأسرار الأخرى في السجل فقط، داخل ملفات حُذفت بالفعل. وحذف الملف لا يلغي التسريب: فالرمز المميز يظل في الـ commits القديمة.
دليل GitLab مكتوب لمن يخزّنون شيفرتهم لديهم، لكن منطقه ينطبق على أي استضافة git. وتؤكد GitLab في الوقت نفسه أن أسرار بنيتها التحتية محمية.
كيف تسدّ الثغرة: أربع طبقات
تُضبط المجموعة مرة واحدة، ثم تعمل الحماية من تلقاء نفسها. والطبقات مرتبة من الأبسط إلى الأعقد.
1. .gitignore. الخيار الأقل كلفة: سطر .claude/settings.local.json في كل مستودع. وفي باقتَي Premium وUltimate يمكن وضعه في .gitignore الخاص بمشروع القالب في المجموعة، فترثه كل المشاريع الجديدة تلقائيًا.
2. قاعدة push (Premium وUltimate). في إعدادات المجموعة، في قسم أسماء الملفات المحظورة، يُدخل التعبير النمطي (^|/)\\.claude/settings\\.local\\.json$. وأي push يحتوي على هذا الملف، في الجذر أو في مجلد فرعي، وعلى أي فرع، سيُرفض، وسيرى المطوّر رسالة تتضمن النمط.
3. Secret Push Protection (Ultimate). لا تنظر هذه الطبقة إلى اسم الملف بل إلى محتوى الـ push. فإذا عُثر على رمز مميز بصيغة معروفة رُفض الـ push. وهذا ينقذك أيضًا إذا وصل السرّ إلى ملف باسم مختلف.
4. سياسة الفحص (Ultimate). تشغّل سياسة على المستوى الأعلى للمجموعة أداة Secret Detection في كل مشروع، حتى بدون .gitlab-ci.yml، ولا تستطيع المشاريع المنفردة تعطيلها. وتعمل إحدى القاعدتين مع كل pipeline، والأخرى وفق جدول أسبوعي. ومع المتغير SECRET_DETECTION_HISTORIC_SCAN: 'true' يفحص الجدول السجل كاملًا، لا الـ commits الجديدة فقط.
مطبّات
لقواعد push قيدان. أولًا، هي تفحص إضافة الملفات فقط، لا تعديل الملفات المتتبَّعة أصلًا، ولذلك يجب أولًا إزالة النسخ الموجودة. وثانيًا، تُنسخ قاعدة المجموعة فقط إلى المشاريع التي أُنشئت بعد ظهورها. أما المشاريع القديمة فيجب ضبطها بشكل منفصل، مثلًا عبر API: POST /api/v4/projects/<id>/push_rule مع المعامل file_name_regex. وإذا كان للمشروع قواعده الخاصة فاستخدم PUT، وإلا ستحصل على الخطأ 422 Project push rule exists.
كيف تعرف إن كانت لديك مشكلة
تحتاج أولًا إلى قائمة بالمستودعات المتأثرة. وهناك ثلاث طرق:
- GitLab Duo Agentic Chat. تطلب من الدردشة العثور على كل مشاريع المجموعة التي وُجد فيها هذا الملف يومًا، بما في ذلك النسخ المحذوفة والفروع الأخرى. ويستغرق ذلك بضع دقائق لمجموعة من نحو مئة مشروع. لكنه يجد ما لا يراه البحث.
- البحث في الشيفرة (Premium وUltimate). سريع، لكنه يرى الفرع الافتراضي فقط بحالته الحالية. ويعتمد بناء الجملة على المحرك: في exact code search استخدم
file:\\.claude/settings\\.local\\.json$مع التعبيرات النمطية، وفي advanced search استخدمfilename:settings.local.json path:.claude. وفي API أبقِexclude_forks=false، وإلا اختفت الـ forks من النتائج. - Commits API (جميع الباقات). الطلب
repository/commits?path=.claude/settings.local.json&all=trueلكل مشروع يُظهر هل وُجد الملف على أي فرع. والرد الفارغ يعني أن الملف لم يوجد قط. وتُفحص الـ forks مثل المشاريع العادية.
ماذا تفعل عمليًا
ابدأ بالبحث في السجل لا في الحالة الراهنة: فالملفات المحذوفة هي الأخطر لأنها تُنسى. وكل ما عُثر عليه في الملف اعتبره مخترقًا وأعد إصداره، حتى لو كان المستودع خاصًا. ثم فعّل الحماية: على الأقل .gitignore وقاعدة push، ومع Ultimate أضف أيضًا فحص المحتوى.
وثمة فكرة خاصة للفرق التي تعتمد الوكلاء: زر «لا تسأل مرة أخرى» يحوّل إذنًا لمرة واحدة إلى سجل دائم للأوامر، وتنتقل الأسرار الموجودة في هذه الأوامر إليه معها. لا تمرّر الرموز المميزة إلى الوكيل كوسائط في سطر الأوامر، بل استخدم متغيرات البيئة أو مدير أسرار، وعندها يكون الأمر المحفوظ آمنًا.
تنبيه: في النص المتاح ينقطع الدليل قبل القسم الخاص بالتنظيف الشامل، ولذلك ينبغي الرجوع إلى المصدر الأصلي لمعرفة ترتيب تنظيف السجل.
- 12 نوفمبر 2026جنسن هوانغ يتنحى عن منصب الرئيس التنفيذي لـNvidia: الشركة تفقد 1.4 تريليون دولار خلال أسبوعين
- 12 نوفمبر 2026Claude in Chrome يطلب إذنًا لكل نقرة على المواقع المصنّفة ضمن الفئة 3
- 12 نوفمبر 2026AWS Quick يحصل على ستة وكلاء لمديري المنتجات: من شكاوى العملاء إلى المواصفات
- 12 نوفمبر 2026اعتبارًا من 12 نوفمبر: Anthropic تغلق Claude أمام الشركات الروسية، حتى لو كان كيانها القانوني مسجَّلًا في الخارج
أسئلة وأجوبة حول الخبر
ما أبرز التفاصيل حول لماذا ينتقل الملف إلى المستودع؟
لكي لا يصل الملف إلى git، يضيفه Claude Code إلى قائمة الاستبعاد العامة الشخصية للمطوّر (global exclude)، لا إلى .gitignore الخاص بالمشروع. وهذه الحماية تعيش على حاسوب محمول واحد ولا تنتقل مع المستودع. أما الزميل أو بيئة CI أو الحاسوب الثاني فلا يعرف شيئًا عن هذا الاستثناء. فيلتقط الأمر git add . الملف، ويذهب إلى حيث يوجد المستودع. قدّرت شركة Apiiro حجم المشكلة في مطلع نوفمبر 2026. ففي المستودعات العامة وُجدت 104185 نسخة من الملف، وكان في 1122 منها سرّ واحد على الأقل.
ما أبرز التفاصيل حول كيف تسدّ الثغرة: أربع طبقات؟
تُضبط المجموعة مرة واحدة، ثم تعمل الحماية من تلقاء نفسها. والطبقات مرتبة من الأبسط إلى الأعقد. 1. .gitignore. الخيار الأقل كلفة: سطر .claude/settings.local.json في كل مستودع. وفي باقتَي Premium وUltimate يمكن وضعه في .gitignore الخاص بمشروع القالب في المجموعة، فترثه كل المشاريع الجديدة تلقائيًا. 2. قاعدة push (Premium وUltimate). في إعدادات المجموعة، في قسم أسماء الملفات المحظورة، يُدخل التعبير النمطي (^|/)\\.claude/settings\\.local\\.json$.
ما أبرز التفاصيل حول مطبّات؟
لقواعد push قيدان. أولًا، هي تفحص إضافة الملفات فقط، لا تعديل الملفات المتتبَّعة أصلًا، ولذلك يجب أولًا إزالة النسخ الموجودة. وثانيًا، تُنسخ قاعدة المجموعة فقط إلى المشاريع التي أُنشئت بعد ظهورها. أما المشاريع القديمة فيجب ضبطها بشكل منفصل، مثلًا عبر API: POST /api/v4/projects/<id>/push_rule مع المعامل file_name_regex. وإذا كان للمشروع قواعده الخاصة فاستخدم PUT، وإلا ستحصل على الخطأ 422 Project push rule exists.
Build & Ship Production AI Agents Without Boilerplate Code
Start your free 72-hour trial at Hamidun Academy (academy.hamidun.com) — interactive lessons on Claude Code & Cursor, live Tech Radar, and production agent templates.
أهم ما في عالم الذكاء الاصطناعي — مرة كل أسبوع
سبع قصص مهمة فعلاً هذا الأسبوع، مختارة بعناية. بلا ضجيج ولا بيانات صحفية.
تم! تحقق من بريدك للتأكيد.