security

Plugin4Shell: قم بترقيع وتحصين وكيل البرمجة الخاص بك (2026)

٢١ سبتمبر ٢٠٢٦

Plugin4Shell: Patch and Harden Your Coding Agent (2026)

Plugin4Shell هي ثغرة من نوع "zero-click" في طريقة تثبيت الإضافات في كل من Claude Code و OpenAI Codex و GitHub Copilot CLI و Gemini CLI: حيث تقوم الأدوات الأربعة بسحب إضافة عند commit SHA محدد، ولكنها لا تتحقق أبداً مما إذا كانت عملية السحب قد تمت بالفعل عند ذلك الـ SHA، مما يسمح لمالك المستودع بتقديم كود مختلف تحت غطاء "pin" يبدو سليماً1. قامت Claude Code و Codex بإصدار إصلاحات؛ بينما لم يفعل Copilot CLI و Gemini CLI ذلك. يغطي هذا المنشور ما الذي تغير، وما الذي لم يتغير، والإعدادات الدقيقة التي تقلل من تعرضك للخطر في الأدوات الأربعة.

ملخص

كشف الباحثون الأمنيون في AIR عن Plugin4Shell في 17 سبتمبر 2026: وهي عملية تخطي لـ SHA-pinning تؤثر على Claude Code و Codex و GitHub Copilot CLI و Gemini CLI، تم اكتشافها في مايو وتم الإبلاغ عنها سراً لجميع الموردين الأربعة في يونيو1. قامت Anthropic بترقيع Claude Code في الإصدار 2.1.179 (صدر في 16 يونيو، وتم تأكيد الإصلاح في 17 يونيو)12. وقامت OpenAI بترقيع Codex في الإصدار 0.146.0 (صدر في 29 يوليو، وتم التحقق من الإصلاح في 12 أغسطس)، والإصلاح مذكور كـ commit مسمى في سجل التغييرات العام: "Verify Git plugin SHA checkouts"3. لم تقم Microsoft بإصدار إصلاح من جهة العميل لـ Copilot CLI، على الرغم من أن GitHub تجادل بشكل منفصل بأن استضافتها الخاصة تمنع بالفعل مسار الهجوم الرئيسي؛ بينما رفضت Google ترقيع Gemini CLI الذي تم إيقافه تماماً وتوجه المستخدمين إلى Antigravity بدلاً من ذلك14. لم يتم تعيين أي CVE حتى وقت كتابة هذا المقال5. لا تتطلب الثغرة أي تفاعل من المستخدم لأنها تعتمد على نفس التحديث التلقائي في الخلفية الذي يبقي الإضافات محدثة — مسار التحديث، وليس مسار التثبيت، هو ما يجعلها "zero-click"1.

ما ستتعلمه

  • ما الذي تكسره Plugin4Shell فعلياً، بدون استغلال عملي — خطوة التحقق المفقودة، وليس آلية الـ pinning نفسها
  • أي إصدارات من الوكلاء (agents) تم ترقيعها، وأيها لم يتم، وكيف تتحقق من الإصدار المثبت لديك الآن
  • لماذا تقوم GitHub و GitLab بنيوياً بمنع أحد أنواع هذه الثغرة بينما لا يفعل Bitbucket وخوادم git المستضافة ذاتياً ذلك
  • كيفية قفل Claude Code على قائمة مسموح بها من متاجر الإضافات الموثوقة باستخدام strictKnownMarketplaces
  • كيفية تثبيت إضافات GitHub Copilot CLI عن طريق commit SHA وإيقاف التحديث التلقائي للإضافات غير المراقب
  • سكربت تحقق يقارن إصدارات الوكلاء المثبتة لديك مع حدود الإصدارات المرقعة

ماذا حدث، ومتى

وجد فريق البحث في AIR — Or Nevo و Dor Granat و Niv Hoffman — الثغرة في مايو 2026 مع نماذج استغلال (proof-of-concept) تعمل ضد جميع الوكلاء الأربعة، وأفصحوا عنها لـ Anthropic و OpenAI و Google و Microsoft تحت إطار الإفصاح المنسق في الشهر التالي1. هذا الجدول الزمني مهم: بحلول الوقت الذي نشرت فيه AIR تقريرها العام في 17 سبتمبر، كان Claude Code قد حمل إصلاحاً صامتاً لمدة ثلاثة أشهر، و Codex لمدة سبعة أسابيع تقريباً. إذا كنت تستخدم تثبيتاً محدثاً تلقائياً لأي من الوكيلين منذ منتصف الصيف، فمن المرجح جداً أنك كنت محمياً بالفعل قبل انتشار هذه القصة1.

التاريخالحدث
مايو 2026AIR تكتشف الثغرة، وتبني نماذج إثبات مفهوم (PoCs) تعمل ضد جميع الوكلاء الأربعة
يونيو 2026تم الإفصاح عن الثغرة لشركات Anthropic و OpenAI و Google و Microsoft
2026-06-17Anthropic تؤكد الإصلاح، وتم شحنه في Claude Code 2.1.179
2026-08-04Google تؤكد أنه لن يتم إصدار إصلاح؛ وتم إيقاف دعم Gemini CLI
2026-08-12AIR تتحقق من إصلاح Codex 0.146.0
2026-09-17AIR تنشر الإفصاح العام؛ ولا يزال GitHub Copilot CLI بدون إصلاح

المصدر: الجدول الزمني لإفصاح AIR1.

كيف تعمل عملية التجاوز، على المستوى المهم للدفاع

تسمح جميع الوكلاء الأربعة بتوسيع قدراتهم باستخدام إضافات (plugins) يتم سحبها من متجر — وهو عبارة عن مستودع git يحتوي على بيان (manifest) يسرد الإضافات المتاحة، ولكل منها commit SHA قام مشرف المتجر بمراجعته وتثبيته (pinned). والوعد من عملية التثبيت هذه هو أنه بمجرد اجتياز الإضافة للمراجعة، لا يمكن تغييرها دون أن يلاحظ أحد ذلك.

يوضح التقرير الفني لـ AIR الخلل الأساسي بوضوح: كل وكيل "يقوم بعمل checkout للـ commit المثبت ولكن لا يتحقق أبداً مما إذا كان قد وصل إلى هناك بالفعل"1. وبشكل ملموس، يمكن للمهاجم الذي يسيطر على المستودع الأصلي للإضافة — إما عن طريق نشر إضافة تبدأ كإضافة حميدة حقاً ثم تحويلها إلى خبيثة لاحقاً، أو عن طريق الاستيلاء على المستودع الخاص بإضافة يثق بها الآخرون بالفعل — أن ينشئ مرجعاً (ref) في ذلك المستودع يتصادم مع التثبيت (pin). بالنسبة لـ Claude Code و Codex و GitHub Copilot CLI، يكون هذا التصادم عبارة عن فرع (branch) مسمى حرفياً باسم الـ SHA المثبت المكون من 40 حرفاً، ويتم تعيينه كفرع افتراضي للمستودع. أما بالنسبة لـ Gemini CLI، الذي يقوم بالتثبيت باستخدام git fetch ثم يشغل git checkout FETCH_HEAD، فإن التصادم يكون فرعاً افتراضياً مسمى حرفياً FETCH_HEAD1. في كلتا الحالتين، فإن شجرة العمل (working tree) التي ينتهي الوكيل بتشغيلها ليست مضمونة أن تكون هي الـ commit الذي يقول البيان أنه تمت مراجعته، ويبلغ الوكيل عن تثبيت ناجح عند الـ SHA المثبت بغض النظر عن ذلك.

لن يقوم هذا الموقع بشرح خطوات تحليل git الدقيقة التي تجعل عملية التبديل تحدث — فهذا هو الجزء من تقرير AIR الذي يعمل كتفاصيل للاستغلال، وقد أشار محللون مستقلون بالفعل إلى أن حتى صياغة AIR لميكانيكا git الداخلية محل نقاش في التغطية الفنية اللاحقة6. ما لا خلاف عليه عبر جميع المصادر هو الشكل العملي للأمر: يتم التحقق من التثبيت مرة واحدة عند التثبيت، ثم يتم إعادة تشغيل منطق checkout نفسه في التحديث التلقائي في الخلفية دون تدخل المستخدم — وهو الوضع الافتراضي في Claude Code و Codex — ولا يوجد شيء بعد عملية checkout تلك يقارن الـ commit الذي وصل بالفعل مقابل الـ SHA الذي كان من المفترض أن يصل15. وهذا ما يجعلها ثغرة "صفر-نقرة" (zero-click): إضافة قمت بتثبيتها بالفعل، من متجر تثق به بالفعل، يمكن استبدالها دون أي طلب أو تنبيه للمستخدم1.

من تم إصلاحه

العميل (Agent)الحالةالإصدار المحدث (Patched)المصدر
Claude Codeتم التحديث2.1.179 (16 يونيو 2026)تم التأكيد عبر صفحة إصدار GitHub2
OpenAI Codexتم التحديث0.146.0 (29 يوليو 2026)الإصلاح موجود في PR #34644، "Verify Git plugin SHA checkouts"3
GitHub Copilot CLIلا يوجد إصلاح للعميلتقول GitHub إن استضافتها الخاصة تقلل من مخاطر المتغير الرئيسي4
Gemini CLIلن يتم تحديثهقامت Google بإيقاف المنتج1

تأكد مما تقوم بتشغيله فعلياً قبل الوثوق بهذا الجدول — أرقام التحديثات تساعد فقط إذا كنت قد تجاوزتها:

claude --version    # need 2.1.179 or later
codex --version     # need 0.146.0 (rust-v0.146.0) or later
copilot --version   # no patched version exists yet — see mitigations below

سكربت صغير لفحص الثلاثة معاً وتنبيهك لأي إصدار أقل من حد التحديث المطلوب:

#!/usr/bin/env bash
# plugin4shell-version-check.sh — flags coding agents below Plugin4Shell's patched versions.
set -euo pipefail

version_lt() { [ "$1" != "$(printf '%s\n%s' "$1" "$2" | sort -V | tail -n1)" ]; }

check() {
  local name="$1" cmd="$2" min="$3" ver
  if ! command -v "$cmd" >/dev/null 2>&1; then
    echo "  $name: not installed, skipping"
    return
  fi
  ver=$("$cmd" --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1 || echo "unknown")
  if [ "$ver" = "unknown" ]; then
    echo "  $name: could not parse version from '$cmd --version'"
  elif version_lt "$ver" "$min"; then
    echo "  $name: $ver — BELOW patched version $min, update now"
  else
    echo "  $name: $ver — at or above patched version $min"
  fi
}

echo "Plugin4Shell version check ($(date -u +%Y-%m-%d)):"
check "Claude Code" claude 2.1.179
check "Codex"       codex  0.146.0
echo "  Copilot CLI: no patched version exists as of 2026-09 — pin plugins by SHA and disable auto-update (see below)"
echo "  Gemini CLI: will not be patched — plan a migration to Antigravity"

هذا السكربت يفحص أرقام الإصدارات فقط. لا يلمس المتاجر (marketplaces) الخاصة بك، ولا يفحص الـ commit الفعلي لأي plugin، ولا يقوم بأي اتصالات بالشبكة — لذا فهو آمن للتشغيل كما هو.

تخفيف مخاطر الاستضافة الذي قد يحميك بالفعل — والذي لا يحميك

بما أن الفحص المفقود يتم تشغيله داخل العميل (agent)، فلا يمكن لأي متجر إغلاق هذه الثغرة بالكامل بمفرده — ولكن أحد متغيرات الخطأ يعتمد على القدرة على تسمية فرع (branch) بسلسلة سداسية عشرية (hex string) مكونة من 40 حرفاً، وهناك اثنان من كبار مستضيفي git يرفضون السماح بذلك. تنص وثائق GitHub الخاصة بها على ذلك مباشرة: فهي تقيد أسماء الفروع والوسوم (tags) "التي تبدو مثل معرفات كائنات Git (40 حرفاً تحتوي فقط على 0-9 و A-F)"، وتحديداً لمنع الخلط بينها وبين مراجع الـ commit الفعلية7. وتحمل وثائق الفروع في GitLab القاعدة ذاتها — "أسماء الفروع التي تحتوي على 40 حرفاً سداسي عشر محظورة"8 — لأنها تشبه هاشات (hashes) الـ Git commit، ويتم فرض ذلك كفحص من جانب الـ push. وقد أشارت تغطيات مستقلة نُشرت بعد إفصاح AIR نفسه إلى أن GitLab تم تصنيفه مع المستضيفين غير المحميين في بعض التقارير المبكرة، وهو أمر غير صحيح — فالحماية نفسها موجودة في كليهما6.

يترك هذا فئتين معرضتين لمتغير اسم الفرع (branch-name variant): Bitbucket، الذي أكدت AIR أنه يسمح بأسماء فروع على شكل SHA، وخوادم git المستضافة ذاتياً — أي شيء بدءاً من مستودع bare repo خلف SSH وصولاً إلى Bitbucket Data Center أو Gitea — والتي تسمح بذلك ما لم يقم شخص ما بتكوين قاعدة رفض بشكل محدد16. توثيقات Anthropic نفسها تدرج صراحة Bitbucket و git المستضاف ذاتياً كخلفيات مدعومة للمتجر (marketplace backends)1. توثيقات متجر Copilot CLI الخاص بـ GitHub أقل تحديداً — فهي تصف المتاجر بأنها قابلة للتثبيت من GitHub.com، أو "أي خدمة استضافة Git أخرى عبر الإنترنت"، أو نظام ملفات محلي، دون تسمية Bitbucket أو git المستضاف ذاتياً بشكل مباشر، رغم أن اللغة العامة تشملهما بنفس الطريقة6. في كلتا الحالتين، هذا هو بالضبط السبب في أن المتجر الداخلي الذي تديره المؤسسة هو التعرض الواقعي، وليس الكتالوجات العامة. كما أن التخفيف على مستوى المضيف لا يفعل شيئاً على الإطلاق لمتغير FETCH_HEAD المنفصل في Gemini CLI، والذي لا يعتمد على اسم على شكل hash في المقام الأول1.

الخلاصة العملية: إذا كان كل متجر إضافات أضافه فريقك يشير إلى github.com أو gitlab.com، فأنت غير معرض لمتغير اسم الفرع بغض النظر عن إصدار العميل (agent) الذي تشغله — ولكن لا يزال يجب عليك التحديث، لأن هذه الحماية من جانب المضيف ليست شيئاً يتحكم فيه تكوين العميل الخاص بك، وهي تتغير بمجرد أن يتغير المتجر.

راجع متاجر الإضافات الخاصة بك قبل الوثوق بأي منها

قم بذلك قبل تغيير أي إعدادات، لأن ذلك سيخبرك ما إذا كان لديك أي شيء لإصلاحه بخلاف التحديث:

  1. أدرج كل متجر قمت بتسجيله. بالنسبة لـ Claude Code، تحقق من extraKnownMarketplaces في كل ملف إعدادات مدار (managed)، أو مشروع، أو مستخدم لديك. بالنسبة لـ Copilot CLI، قم بتشغيل copilot plugin marketplace list9.
  2. فرز النتائج حسب مضيف git. أي شيء على github.com أو gitlab.com مغطى بالحظر من جانب المضيف الموصوف أعلاه. أي شيء آخر — بديل GitLab داخلي، أو bare repo، أو Bitbucket — هو مجموعة التعرض الفعلية الخاصة بك. إذا كان لديك واحد، فمن المرجح أن يكون المتجر الداخلي الذي لم يفكر أحد في تصنيفه كحد أمني، تحديداً لأنه لم يكن أبداً في كتالوج عام.
  3. تحقق يدوياً من تثبيت (pin) واحد. في النسخة المحلية من إضافة مثبتة، قم بتشغيل git rev-parse HEAD وقارن المخرج بـ SHA المعلن في بيان (manifest) المتجر. هذه هي المقارنة الدقيقة التي يتخطاها العملاء — القيام بذلك مرة واحدة يخبرك ما إذا كان التثبيت في بيئتك قد تم فرضه فعلياً في أي وقت.

قفل Claude Code على قائمة سماح باستخدام strictKnownMarketplaces

يدعم Claude Code قائمة سماح للإعدادات المدارة لمتاجر الإضافات، ونقطة إنفاذها تتماشى مع هذه الثغرة: يتم تشغيل الفحص "قبل أي عملية شبكة أو نظام ملفات"، عند إضافة متجر وعند كل تثبيت للإضافات، أو تحديث، أو تنشيط، أو تحديث تلقائي10. يمكن للمؤسسة تقييد المتاجر بمستودعات محددة، أو ملاك GitHub بالكامل، أو أي مضيف يطابق تعبيراً نمطياً (regex):

{
  "strictKnownMarketplaces": [
    { "source": "github", "repo": "anthropics/claude-plugins-official" },
    { "source": "github", "repo": "acme-corp/*" },
    { "source": "hostPattern", "hostPattern": "^gitlab\\.example\\.com$" }
  ]
}

المصدر github مع استخدام العلامة العامة owner/* يطابق كل مستودع تحت هذا المالك؛ أما hostPattern فيطابق عبر regex ضد مضيف المتجر (marketplace)، وهو المدخل الذي يجب استخدامه إذا لم يكن مضيف git الخاص بمؤسستك هو GitHub — وهذا مفيد تحديداً لأنه يسمح لك بإضافة "نسخة GitLab الخاصة بنا" إلى القائمة البيضاء دون الحاجة لسرد كل مستودع عليها10. التحكم العكسي، blockedMarketplaces، يدعم نفس العلامة العامة owner/* بدءاً من إصدار Claude Code v2.1.22310. ضبط strictKnownMarketplaces كمصفوفة فارغة يحظر كل المتاجر، بما في ذلك متجر Anthropic نفسه — وهذا مفيد كنقطة بداية تفتحها بعد ذلك عمداً، وليس كإعداد دائم.

بما أن هذا يقع ضمن الإعدادات المدارة، فلا يمكن للمطورين الأفراد أو التكوينات على مستوى المشروع تخطيه10. اربطه بـ extraKnownMarketplaces في نفس الملف لتسجيل المتاجر التي تسمح بها القائمة البيضاء مسبقاً، لأن القائمة البيضاء وحدها لا تضيف أي شيء للمستخدمين تلقائياً.

التحديث التلقائي في الخلفية يختلف افتراضياً بناءً على مصدر المتجر: متجر Anthropic الرسمي، ومعظم الكتالوجات الأخرى التي تديرها Anthropic، والمتاجر المضافة من claude.ai يكون التحديث فيها مفعلاً افتراضياً، بينما المتاجر الخارجية ومتاجر التطوير المحلية يكون التحديث التلقائي فيها معطلاً افتراضياً — حتى يقوم المستخدم بتفعيله لهذا المتجر، أو يقوم المسؤول بضبط "autoUpdate": true في مدخل extraKnownMarketplaces الخاص به في الإعدادات المدارة11. هذا الافتراض يصب في مصلحتك بالنسبة لمتجر داخلي لم يختر أحد التحديث التلقائي فيه؛ ويتوقف عن ذلك في اللحظة التي يقوم فيها شخص ما بتفعيل هذا المفتاح من أجل الراحة، وهو بالضبط الهدف من وجود هذا الإعداد.

تثبيت وإغلاق GitHub Copilot CLI

لا يوجد حتى الآن إصلاح على مستوى الإصدار لـ Copilot CLI، لذا فإن الضوابط المتاحة هي التثبيت (pinning) وسلوك التحديث بدلاً من رفع الإصدار. كل من إدخالات الإضافات المستمدة من github و url تقبل حقل sha، والموثق مباشرة كوسيلة للحصول على "تثبيتات قابلة للتكرار ومحصنة ضد عمليات force-push أو تغييرات الـ tag/branch" — وهو بالضبط الضمان الذي يقوضه Plugin4Shell عندما لا يكون مقترناً بحظر من جهة المضيف9:

{
  "source": {
    "source": "github",
    "repo": "owner/repo",
    "sha": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
    "path": "plugins/my-plugin"
  }
}

بالنسبة للتحديث التلقائي: الإضافات الرسمية من متاجر Copilot المدمجة يتم تحديثها تلقائياً في بداية كل جلسة في دليل عمل موثوق، وأي متجر مخصص أضفته يمكنه اختيار نفس السلوك عن طريق ضبط autoUpdate: true في مدخل extraKnownMarketplaces — مما يعني أيضاً أنه خيار "إلغاء الاشتراك" وليس "اشتراك" لأي شيء قمت بتفعيله عمداً. اضبط autoUpdate: false في تكوين Copilot CLI الخاص بك، أو قم بتصدير COPILOT_AUTO_UPDATE=false، لتحويل التبديل غير المراقب إلى أمر يجب على شخص ما تشغيله وملاحظته.

إذا كنت تستخدم Gemini CLI

موقف Google واضح تماماً بشأن الإصلاح: لا يوجد إصلاح قادم، لأن Gemini CLI المستقل قد تم إيقافه لصالح Antigravity1. ما لا يذكره إشعار الانتقال الخاص بـ Google هو أي شيء عن الصيانة الأمنية للحسابات التي يصفها بأنها لا تزال مدعومة — حيث تحتفظ المؤسسات التي لديها ترخيص Gemini Code Assist Standard أو Enterprise بالوصول إلى CLI وتستمر في تلقي تحديثات النماذج بعد موعد التوقف للمستخدمين الأفراد، دون وجود بيان منفصل حول ما إذا كان ذلك يشمل إصلاحاً لهذا الخطأ البرمجي تحديداً. إذا كان فريقك يمتلك هذا الترخيص، فإن السؤال المفتوح الذي يستحق طرحه كتابياً على فريق إدارة حسابك هو ما إذا كان "الدعم" يمتد ليشمل هذه الثغرة الأمنية تحديداً، وليس مجرد الوصول إلى النماذج. الانتقال إلى Antigravity هو المسار الموصى به من قبل المورد وهو يزيل بالفعل سطح الهجوم الخاص بهذا الخطأ البرمجي، بما أن Antigravity لا يمتلك آلية SHA-pinning لإضافات المتجر يمكن تجاوزها1 — ولكن تعامل مع الأمر كعملية انتقال حقيقية تتطلب مراجعتها الخاصة، وليس مجرد استبدال سريع في نفس اليوم.

الدفاع المتعمق: تقييد ما يمكن للإضافة الوصول إليه

عمليات الـ Pinning والقوائم البيضاء (allowlisting) تقلل من الكود الذي يتم تشغيله؛ لكنها لا تحد من ما يمكن لهذا الكود فعله بمجرد تشغيله. يدعم الـ sandbox الخاص بـ Claude Code قائمة بيضاء network.allowedDomains تقيد الاتصالات الخارجية بغض النظر عن الإضافة التي أصدرتها، كما أن إعداد sandbox_workspace_write.network_access في Codex معطل افتراضياً، مما يتطلب موافقة صريحة قبل أن يحصل أي أمر داخل الـ sandbox على أي وصول إلى الشبكة على الإطلاق. لا يوجد أي من هذين الإعدادين مخصص لهذا الخطأ البرمجي، ولا يعتبر أي منهما بديلاً عن ضوابط مستوى المتجر المذكورة أعلاه — ولكن كلاهما يعني أنه حتى لو تم استبدال إضافة ما، فإن قدرتها على الوصول ستكون محدودة.

التحقق

تم التحقق من كل رقم إصدار وحقل تكوين في هذا المنشور مقابل مصدر أساسي بدلاً من الملخصات الثانوية. جاء الإصدار المحدث وتاريخ إصدار Claude Code من صفحة إصدارات GitHub الخاصة بشركة Anthropic، والتي تم جلبها مباشرة2. أما الإصدار المحدث لـ Codex وتاريخ إصداره والـ commit المحدد للإصلاح فقد جاءت من صفحة إصدارات GitHub الخاصة بشركة OpenAI لـ rust-v0.146.0، والتي تدرج "Verify Git plugin SHA checkouts" بالاسم في سجل التغييرات الخاص بها3. تم تأكيد قيود تسمية الفروع في GitLab من خلال جلب صفحة توثيق GitLab مباشرة، وليس من خلال الاعتماد على تقارير ثانوية عنها8. كما تم تأكيد صيغة strictKnownMarketplaces في Claude Code، ونقاط التنفيذ، ومتطلبات الإصدار لـ wildcard الـ owner/* من خلال جلب توثيق plugin-marketplaces الخاص بشركة Anthropic مباشرة وقراءة أمثلة التكوين بالكامل10. وتم تأكيد حقل sha في GitHub Copilot CLI، وسلوك autoUpdate/COPILOT_AUTO_UPDATE، وأمر copilot plugin marketplace list مقابل وثائق مرجع CLI الخاصة بـ GitHub9. كما تم تأكيد إعدادات التحديث التلقائي الافتراضية المعتمدة على المتجر في Claude Code مباشرة من توثيق Anthropic11. تمت مراجعة هذا المنشور في 2026-09-22 بعد جولة تحقق ثانية: حيث كانت إحدى الحواشي تشير إلى مصدر خاطئ بخصوص ادعاء عدم تعيين CVE (تم تصحيحها إلى المصدر الذي ينص على ذلك بالفعل)، وتمت إضافة فقرة إعدادات التحديث التلقائي أعلاه بعد أن كشفت مراجعة المصدر المباشرة عن هذا التفصيل. لم يتم بناء أو تشغيل أو تضمين أي ثغرة (exploit) أو إثبات مفهوم (proof-of-concept) في أي مكان في هذا المنشور — سكريبت التحقق من الإصدار أعلاه يقرأ فقط سلاسل الإصدارات المثبتة محلياً ولا يقوم بأي طلبات شبكة أو عمليات git.

الخلاصة

إن Plugin4Shell عبارة عن تأكيد مفقود (missing assertion)، وليس خللاً في بدائية تشفيرية: كل عميل متأثر يقوم بسحب commit ويثق في أن شجرة العمل تطابقها، دون التأكد من ذلك لاحقاً. قام موردان بسد هذه الفجوة في كودهما الخاص قبل أشهر من الكشف العلني؛ واثنان لم يفعلا ذلك لأسباب مختلفة — أحدهما استشهد بتخفيف من جانب المضيف يغطي جزءاً فقط من الثغرة، والآخر لأن المنتج نفسه يتم إيقافه. لا شيء من هذا يغير ما يمكنك التحكم فيه هذا الأسبوع: تحقق من الإصدارات المثبتة لديك مقابل الجدول أعلاه، وجرد مضيفي git الذين تعيش عليهم متاجر الإضافات الخاصة بك فعلياً، وحوّل ضوابط القائمة البيضاء والتثبيت (pinning) التي يشرحها هذا المنشور من "موثقة ولكن غير مستخدمة" إلى "مهيأة". كان التثبيت قوياً فقط بقدر قوة الشيء الذي يتحقق منه، ولشهور، كان الشيء الذي يتحقق منه مجرد قاعدة تسمية على مضيف git تابع لشخص آخر.

Footnotes

  1. AIR Security, "Plugin4Shell – Zero Click RCE Vulnerability found in top 4 most popular coding agents" — https://www.air.security/blog-posts/plugin4shell (by Or Nevo, Dor Granat, Niv Hoffman; published 2026-09-17; primary disclosure including technical mechanism, affected agents, mitigation status, and full timeline table; fetched 2026-09-21) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

  2. GitHub, "Release v2.1.179 · anthropics/claude-code" — https://github.com/anthropics/claude-code/releases/tag/v2.1.179 (released 2026-06-16 by ashwin-ant; primary source for Claude Code's patched version and release date; fetched 2026-09-21) 2 3 4

  3. GitHub, "Release 0.146.0 · openai/codex" — https://github.com/openai/codex/releases/tag/rust-v0.146.0 (released 2026-07-29; changelog lists PR #34644, "Verify Git plugin SHA checkouts"; primary source for Codex's patched version, release date, and fixing commit; fetched 2026-09-21) 2 3 4

  4. InfoWorld, "A zero-click RCE flaw in AI coding agents could have exposed enterprise systems" — https://www.infoworld.com/article/4223907/a-zero-click-rce-flaw-in-ai-coding-agents-could-have-exposed-enterprise-systems.html (published 2026-09-18, Anirban Ghoshal; reports GitHub's statement to The Register that its branch-naming restriction blocks the reported vulnerability on GitHub; fetched 2026-09-21) 2

  5. The Hacker News, "Plugin4Shell Lets Repository Owners Swap Pinned Plugin Code Across Four AI Coding Agents" — https://thehackernews.com/2026/09/plugin4shell-lets-repository-owners.html (published 2026-09-18, Swati Khandelwal; independent verification that no CVE identifier had been assigned and no vendor had published a security advisory as of September 18; fetched 2026-09-22) 2 3

  6. THE DAILY BRIEF (beri.net), "The Pinned Commit Was a Branch. Check Your Git Host." — https://www.beri.net/article/plugin4shell-sha-pin-bypass-coding-agent-plugin-git-host-inventory (by Rajesh Beri, published 2026-09-20; independent follow-on analysis correcting the GitLab-as-unprotected claim in earlier coverage and providing the host-inventory framing; fetched 2026-09-21) 2 3 4

  7. GitHub Docs, "Dealing with special characters in branch and tag names" — https://docs.github.com/en/get-started/using-git/dealing-with-special-characters-in-branch-and-tag-names (states GitHub restricts branch/tag names "which look like Git object IDs (40 characters containing only 0-9 and A-F)"; fetched directly 2026-09-22, confirmed against the doc's raw source) 2

  8. GitLab Docs, "Branches" — https://docs.gitlab.com/user/project/repository/branches/ ("Branch names with 40 hexadecimal characters are prohibited, because they are similar to Git commit hashes"; fetched directly 2026-09-21) 2 3

  9. GitHub Docs, "GitHub Copilot CLI plugin reference" — https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference (documents the sha pinning field, copilot plugin marketplace list command, and --json output shape; fetched directly 2026-09-21) 2 3

  10. Claude Code Docs, "Plugin marketplaces" — https://code.claude.com/docs/en/plugin-marketplaces (documents strictKnownMarketplaces, blockedMarketplaces, the owner/* wildcard's v2.1.223 requirement, hostPattern/pathPattern sources, and the background auto-update mechanism; fetched directly 2026-09-21) 2 3 4 5

  11. Claude Code Docs, "Discover and install prebuilt plugins through marketplaces" — https://code.claude.com/docs/en/discover-plugins (documents that the official Anthropic marketplace, most other Anthropic-run catalogs, and marketplaces added from claude.ai have auto-update enabled by default, while third-party and local development marketplaces default to disabled, and that administrators can override this per marketplace via autoUpdate: true on an extraKnownMarketplaces entry; fetched directly 2026-09-22) 2

الأسئلة الشائعة

ثغرة أمنية من نوع zero-click كشفت عنها AIR Security في 17 سبتمبر 2026، وتؤثر على Claude Code و OpenAI Codex و GitHub Copilot CLI و Gemini CLI. تقوم جميع هذه الأدوات الأربعة بسحب plugin عند commit SHA محدد ولكنها لا تتحقق أبداً مما إذا كانت عملية السحب قد تمت على ذلك الـ commit بالضبط، مما يسمح لمالك المستودع بتقديم كود مختلف تحت pin يبدو سليماً 1 .