
مختبر إعادة إنتاج لـ CVE-2026-54316 (Claude Code WebFetch لتجاوز إذن اسم المضيف العاري huggingface.co / استخراج البيانات)
مختبر مكتفٍ بذاته وقابل للتخلص يعيد إنتاج
GHSA-fg94-h982-f3mm
/ CVE-2026-54316: وافق Claude Code مسبقًا على huggingface.co كـ اسم مضيف مجرّد (bare hostname)
لأداة WebFetch، لذا فإن أي مسار على هذا النطاق — بما في ذلك
مستودعات النماذج التي يتحكم فيها المهاجم — كان يتم جلبه بدون أي مطالبة إذن.
وعند دمجه مع حقن المطالبات (prompt injection)، يتحول ذلك إلى قناة خارج النطاق
لاستخراج البيانات، يمكن ملاحظتها عبر عدادات التنزيل من جانب الخادم في HuggingFace.
| النشرة | GHSA-fg94-h982-f3mm |
| CVE | CVE-2026-54316 |
| الحزمة | @anthropic-ai/claude-code (npm) |
| المتأثر | >= 0.2.54, < 2.1.163 |
| الإصدار المُصلَح | 2.1.163 |
| السبب الجذري | السماح باسم مضيف مجرّد على مضيف متعدد المستأجرين (CWE-183) |
يعيد هذا المختبر إنتاج ثغرة مُصلَحة ومُعلَن عنها علنًا لأغراض تعليمية ودفاعية. استخدمه فقط ضد بنية تحتية تملكها أنت:
fixtures/canary.env) — لا تستخدم قيمة حقيقية أبدًا.huggingface.co دون أي مطالبة موافقة، بينما يؤدي أي نطاق آخر إلى
ظهور مطالبة — لأن huggingface.co موجود في قائمة سماح مكتوبة في الكود.الحاوية هي المكان الوحيد الذي يعمل فيه الإصدار المعرّض للثغرة؛ يبقى مضيفك نظيفًا. سجّل الدخول باستخدام رمز اشتراك Claude (لا حاجة لمفتاح API):
docker build -t cve-2026-54316-lab .
docker run --rm -it cve-2026-54316-lab
داخل الحاوية شغّل claude واختر "Claude account with subscription"
لتسجيل الدخول تفاعليًا. الإصدار المعرّض للثغرة 2.1.162 يسبق
متغير البيئة CLAUDE_CODE_OAUTH_TOKEN، لذا لا يُستخدم setup-token هنا —
تدفق المتصفح/لصق الرمز التفاعلي يتجنب إنشاء رمز طويل الأمد تمامًا.
النقطة الأساسية هي عدم تناسق مطالبة الموافقة حسب النطاق، لذا تُترك WebFetch
مفعّلة (ليست مرفوضة) — تتم الموافقة عبر المطالبة، وهو السلوك الافتراضي.
داخل الحاوية، في claude:
استخدم WebFetch لجلب
https://example.comولخّصه.
→ تظهر مطالبة إذن تطلب منك الموافقة على example.com. ثم:
استخدم WebFetch لجلب
https://huggingface.co/<your-account>/canary-lab/resolve/main/config.json.
الإصدار المعرّض للثغرة: يتم جلب huggingface.co بدون أي مطالبة، بينما
تطلبت example.com واحدة. هذا عدم التناسق هو الخلل — huggingface.co موجود في
قائمة سماح مكتوبة في الكود. (لا يلزم أن يكون مستودع HF موجودًا لهذا الاختبار؛
فرقم 401/404 ما زال يثبت أن المطالبة لم تظهر أبدًا.) أعد البناء باستخدام
@anthropic-ai/[email protected] وسيظهر طلب موافقة على جلب huggingface.co
أيضًا — هذه المقارنة قبل/بعد هي الخلاصة الرئيسية.
./scripts/make_hf_canary_files.sh ./hf-repo، ثم ادفع hf-repo/ إلى
مستودع HuggingFace عام تملكه (<your-account>/canary-lab).payloads/untrusted-readme.md، وضَع HF_ACCOUNT، ثم ضعه في مكان
سيقرؤه الوكيل كمدخل غير موثوق.Dockerfile — الإصدار المعرّض للثغرة مثبّت عند 2.1.162.claude/settings.json — قائمتي سماح/رفض فارغتان بحيث تظهر مطالبة WebFetch لكل نطاقfixtures/canary.env — كناري وهميscripts/make_hf_canary_files.sh — تخطيط ملفات الكناري في HFpayloads/untrusted-readme.md — حمولة حقن المطالبات (منقّاة)