ثغرة SkillLeak، سرقة بيانات اعتماد المتصفح عبر مهارة MCP

SkillLeak: أداة لفك تشفير بيانات اعتماد المتصفح يتم تسليمها من خلال مهارة MCP

TL؛ DR

@szc-ft/mcp-szcd-client هو عميل بروتوكول سياق النموذج (MCP) منشور على npm يقوم بتهيئة مساعدي البرمجة بالذكاء الاصطناعي تلقائيًا - وهو نوع من حزم الربط التي يقوم المطور بتثبيتها حتى يتمكن وكيل بيئة التطوير المتكاملة (IDE) من التواصل مع خدمة مكتبة المكونات. لديه تاريخ إصدارات طويل وعادي المظهر (إصدارات 71) وخطوة تثبيت بسيطة. لا يتم التعامل مع بيانات الاعتماد في مرحلة ما بعد التثبيت.

يوجد سلوك قراءة بيانات الاعتماد في طبقة أعمق، ضمن مهارة MCP مجمعة تسمى local-browser-testعندما تكون تلك المهارة connect() عند تشغيل الروتين، فإنه يستدعي _decryptCredentials() — الذي يفك التشفير جميع كلمات المرور المحفوظة في ملف تعريف Chrome/Edge المحلي (جميع المواقع، وليس التطبيق المحدد الذي يستهدفه اختبار المتصفح) باستخدام واجهة برمجة تطبيقات حماية بيانات ويندوز (DPAPI) و AES-256-GCM. تُكتب المجموعة التي تم فك تشفيرها كنص عادي إلى ~/.szcd-mcp/deps/decrypted-creds.json وتم إرجاعها داخل نتيجة أداة MCP الخاصة بالمهارة، والتي تتدفق إلى خادم MCP البعيد الافتراضي للحزمة، mcp.szcd-mcp.top.

هذا نمط من أنماط سلسلة التوريد يستحق التسمية: لا توجد إمكانية حساسة في خطاف التثبيت (حيث ينظر معظم الماسحين والمراجعين) ولكن في مهارة MCP التي لا تُنفذ إلا عندما يُوجه المشغل الأداة إلى متصفحه قيد التشغيل. نسميها سكيل ليك. تصنيف MEW @szc-ft/mcp-szcd-client (الإصدارات 0.38.0 و 0.39.0) باعتباره خبيثًا.

مذكرة الفصل الدراسي — مهارة MCPحزمة متكاملة من التعليمات والبرامج النصية المساعدة التي يوفرها خادم MCP لوكيل الذكاء الاصطناعي كخاصية قابلة للاستدعاء. يستدعيها الوكيل كأداة، وتُشغَّل البرامج النصية على جهاز المطور.

تشريح الهجوم

يُظهر الغلاف وجهين مختلفين تماماً.

الوجه الذي يراه المراجع أولاً هو مسار التثبيت. يُعلن البيان postinstall: node scripts/postinstall.jsوهذا البرنامج النصي يفعل بالضبط ما هو مذكور في ملف README: إنه يقوم بتوصيل MCP يتكامل مع بيئات التطوير المتكاملة (IDEs) ويقوم بتثبيت حزمة شقيقة، @szc-ft/sketch-mcp-serverلا يصل البرنامج أبدًا إلى رمز الاعتماد. إنه ماسح ضوئي يتوقف عند التثبيت. hooks — المكان الذي يُعتبر تاريخياً الأكثر أهمية للبحث — يرى أداة تطوير نظيفة وغير مميزة. وقد تم تقييم هذه الحزمة بالفعل على أنها آمنة في مراجعة سابقة.

الوجه الذي يهم لا يمكن الوصول إليها إلا من خلال المهارة المجمعة. السلسلة:

  • يتولى المطور إدارة اختبار المتصفح المحلي هذه هي الطريقة الموثقة لاستخدام هذه المهارة على خادم Chrome/Edge الذي تم تشغيله باستخدام منفذ تصحيح الأخطاء عن بُعد.
  • المهارة الاتصال () (lib/browser-engine.js) المكالمات _decryptCredentials() في السطر 246.
  • _decryptCredentials() المكالمات decryptAllPasswords({ filter: '%' }). '%' الفلتر هو التفصيل الذي يحول سهولة الاختبار إلى حصاد: فهو يطابق كل أصل مخزن بدلاً من الموقع الوحيد قيد الاختبار.
  • lib/decrypt-passwords.js يقرأ المتصفح os_crypt مفتاح مشفر، يعمل باور شيل … ProtectedData::Unprotect (DPAPI) لاستعادة مفتاح AES، ثم يقوم AES-256-GCM بفك تشفير كل بيانات اعتماد محفوظة.
  • يتم كتابة المجموعة الكاملة التي تم فك تشفيرها إلى ~/.szcd-mcp/deps/decrypted-creds.json بنص واضح، ثم يتم إرجاعها كمهارة أداة MCP نتيجة.
  • تنتقل تلك النتيجة عبر قناة MCP إلى الخادم الافتراضي للحزمة، mcp.szcd-mcp.top — نفس المضيف الموثق في ملف README وفي scripts/lib/common.js.

ملاحظة موجزة حول سبب نجاح الخطوة الرابعة. في نظام ويندوز، لا يخزن متصفحا كروم وإيدج كلمات المرور المحفوظة كنص عادي: بل يتم تشفير كل بيانات اعتماد باستخدام مفتاح AES-256-GCM، ويتم ختم هذا المفتاح نفسه باستخدام DPAPI، الذي يربطه بحساب المستخدم الحالي. لذلك، تتطلب استعادة كلمة المرور خطوتين - أولاً ProtectedData::Unprotect لاستعادة مفتاح AES (وهو ما ينجح لأن الكود يعمل بصلاحيات المستخدم المسجل دخوله، وهو بالضبط السياق الذي توفره محطة المطور)، ثم فك تشفير GCM لكل كائن ثنائي كبير مخزن تمت قراءته من المتصفح os_cryptمخزن محمي. هذا مفهوم جيدًا، ويعمل دون اتصال بالإنترنت، وبصمت: لا يتطلب إدخال كلمة مرور رئيسية، ولا يتطلب تفاعلًا مع المتصفح، ولا يتطلب أي اتصال بالشبكة حتى يتم إرسال النتائج. إنه نفس الأسلوب الأساسي الذي يستخدمه العديد من لصوص المعلومات - الجديد هنا هو فقط الغلاف الذي يحمله.

إن أداة فك التشفير ليست عرضية.يتم تجميعها ثلاث مرات - تحت standard-مهارة/, امتداد الكود المفتوح/و qwen-extension/ — نسخة واحدة لكل سطح مساعد مدعوم بالذكاء الاصطناعي، بحيث تنتقل هذه الإمكانية مع أي مساعد قام المطور بتوصيله.

التناقض مع اختبار المتصفح التلقائي الشرعيlogin هذه هي القصة كاملة. يقوم برنامج مساعد اختبار حقيقي بفك تشفير بيانات الاعتماد الخاصة بـ صورة واحدة؟ التطبيق هو تمرينcisيستخدم البرنامج هذه البيانات داخل العملية نفسها، ولا يقوم بتخزينها أو إعادة توجيهها. هنا، يقوم البرنامج بفك تشفير كل شيء، وكتابته على القرص بشكل غير مشفر، وإعادته عبر حدود الشبكة إلى خادم بعيد.

الجدول الزمني والمحفز 

هناك سلوكان مهمان لفهم التعرض.

يتم تفعيل هذه الخاصية باختيار المستخدم، وليس بشكل تلقائي. لا يتطلب تثبيت الحزمة قراءة أي بيانات اعتماد. يتم تشغيل عملية فك التشفير فقط عندما يقوم المطور باستدعاء البرنامج بشكل فعلي. اختبار المتصفح المحلي مهارة ضد متصفح قاموا بتشغيله في وضع تصحيح الأخطاء عن بُعد. هذا يقلل بشكل كبير من عدد المتضررين مقارنةً بـ بعد التثبيت حمولة تطلق النار على كل تركيب npm.

العبوة متينة، وليست للاستخدام لمرة واحدة. أصدرت دار النشر 71 إصدارًا وتحافظ على نطاق أوسع @szc-ft مجموعة مكتبات المكونات MCP. يوجد برنامج فك تشفير بيانات الاعتماد في كلا الإصدارين المميزين (0.38.0 و0.39.0) ببصمة متطابقة، ويتم استدعاؤه من نفس المصدر. browser-engine.js:246 نقطة الدخول. لا تزال الحزمة متاحة على npm وقت كتابة هذا التقرير.

هذا المزيج تحديدًا - ناشر معروف، وخطوة تثبيت بسيطة، وخاصية لا تُفعّل إلا ضمن مسار اشتراك محدد - هو ما جعل المصنف الآلي يصنف التطبيق على أنه "آمن"، وهو ما أكدته مراجعة سابقة. ولا يُحلّ هذا السلوك إلا بقراءة يدوية لبرامج المساعدة الخاصة بالتطبيق.

مؤشرات التسوية

النوعمؤشر
فئة الإشتراك@szc-ft/mcp-szcd-client (npm) — الإصدارات 0.38.0, 0.39.0
الانرنيتخادم MCP البعيد الافتراضي mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18)
تم إسقاط الملف~/.szcd-mcp/deps/decrypted-creds.json — بيانات اعتماد تم فك تشفيرها كنص عادي
ملف (حمولة).../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (مضمنة تحت standard-skill/, opencode-extension/, qwen-extension/)
السلوكيةbrowser-engine.js:246 _decryptCredentials()decryptAllPasswords({ filter: '%' }) (نطاق الموقع بأكمله)
السلوكيةيدعم متصفحي Chrome و Edge os_crypt مفتاح؛ يتطلب متصفحًا تم تشغيله بواسطة --remote-debugging-port
خطاف التثبيتpostinstall: node scripts/postinstall.js - حميدة (تكوين IDE MCP + تثبيت الحزمة الشقيقة)؛ لا يصل إلى وحدة فك التشفير

تدقيق المدافعين أدوات MCP ينبغي أن يعالج مهارة الدليل ضمن النطاق، وليس فقط ملف البيان ونصوص التثبيت.

الإسناد والسلوك الملاحظ

نحن نصف السلوك، وليس الدافع.

تم نشر الحزمة تحت حساب npm مُنشأ مسبقًا مع حزمة متعددة متناسقة. @szc-ft مجموعة برامج MCP وتاريخ إصدارات طويل. لا توجد قناة تحكم وأوامر سرية مخصصة: يتم إرجاع بيانات الاعتماد التي تم فك تشفيرها من خلال خادم MCP الموثق الخاص بالحزمة. mcp.szcd-mcp.topبدلاً من إرسالها إلى نقطة تسليم مجهولة. خطوة التثبيت بسيطة للغاية.

ما يحوّل هذا من "ميزة تسهيل عدوانية" إلى تصنيف خبيث هو الجمع الملحوظ بين النطاق والوجهة: يقوم الروتين بفك التشفير الكل بيانات اعتماد المتصفح المحفوظة بدلاً من التطبيق الوحيد الذي سيخضع للاختبارcisأي، يقوم بتخزينها على القرص كنص عادي، ثم يرسلها من المضيف عبر قناة MCP. اختبار تلقائي للمتصفح-login إن الميزة التي تتصرف بهذه الطريقة ستكون غير قابلة للتمييز، في الواقع، عن جمع بيانات الاعتماد - وهذا هو التأثير الذي يجب على المدافع التفكير فيه.

نلاحظ بصدق أن تفعيل هذه الميزة يتم باختيار المستخدم، وأن الناشر مُحدد؛ وكلا الأمرين موثقان في السجل أعلاه. ولا يُغير أيٌّ من هذين الأمرين النتيجة الملحوظة للمطور الذي يُشغّل هذه الميزة: وهي أن كلمات المرور المحفوظة لكل موقع في ملف تعريف المتصفح الخاص به تُنقل من جهازه.

التأثير والاتجاهات وتوجيهات المدافعين

يُعدّ SkillLeak حادثة حزمة واحدة، لكنّ نقطة الضعف تكمن في سطح التسليم الذي يستخدمه.

تتم معايرة ردود فعل سلسلة التوريد في هذه الصناعة لتنفيذ عمليات التركيب في وقت التركيب: التثبيت المسبق/بعد التثبيت hooks، منارات التشويش على التبعية، ومواقع وهمية تحتوي على حمولة في index.js. يُغير MCP الهندسةيمكن لحزمة MCP أن توفر بيانًا وخطوة تثبيت نظيفين تمامًا مع الاحتفاظ بسلوكها التبعي داخل مهارة — حزمة يستدعيها وكيل الذكاء الاصطناعي لاحقًا، بناءً على تعليمات المطور نفسه، باستخدام موارد المطور. تأتي هذه الخاصية مع تكامل المساعد وتبقى غير نشطة حتى يتم تفعيلها من خلال سير عمل عادي المظهر ("تشغيل اختبار المتصفح").

للفرق التي تعتمد أدوات MCP:

  • مهارات التدقيق، وليس مجرد قوائم الشحن. توسيع نطاق مراجعة الحزمة ليشمل مهارات/, *-امتداد/والمجلدات المكافئة. قد لا يظهر الكود الأكثر حساسية أبدًا في خطاف التثبيت.
  • انتبه لتضخم نطاق الرؤية. قدرة تدّعي غرضًا محدودًا (اختبار تطبيق واحد) ولكنها تعمل على نطاق واسع (فلتر: '%' (على جميع الأصول المخزنة) هو علامة تحذير بغض النظر عن النية.
  • تعامل مع نتائج أداة MCP كقناة خروج. تُرسل البيانات المُسترجعة من المهارة من المضيف إلى خادم MCP المُهيأ له العميل. قم بجرد هذه الوجهات كما تفعل مع أي اتصال صادر.
  • إعادة مراجعة تحديثات إصدارات حزم MCP "الموثوقة". إن وجود ناشر راسخ وتاريخ إصدارات طويل لا يغني عن قراءة الكود الذي يتم شحنه في كل إصدار - كما توضح هذه الحالة، التي تعكس تقييمًا آمنًا سابقًا.

بشكل ملموس، كان من الممكن الكشف عن هذه الحزمة بثلاثة فحوصات منخفضة التكلفة قبل أن يقوم المطور بتشغيل المهارة. أولاً، فحص محتوى أدلة المهارات بحثًا عن إمكانية الوصول إلى مخزن بيانات الاعتماد المحلي - إشارات إلى os_crypt, البيانات المحمية/DPAPI، أو واجهة برمجة تطبيقات المتصفح Login البيانات الملف — يشير إلى الإمكانية بغض النظر عن خطاف التثبيت الموجود. ثانيًا، فحص النطاق على أي روتين فك تشفير/قراءة يقبل محددًا عامًا (فلتر: '%' وما يعادلها) بدلاً من مُعرِّف مُقيَّد، مما يُساعد على رصد تضخّم البيانات من الاختبار إلى الحصاد. ثالثًا، يُساعد تفريق مجموعة الأجهزة المُضيفة التي يُمكن أن تصل إليها الحزمة (هنا، mcp.szcd-mcp.top) مقابل الوجهات التي تدعي وثائقها أنها ضرورية، يحول قناة نتائج MCP إلى نقطة خروج قابلة للتدقيق. لا يتطلب أي من هذه العمليات تشغيل الكود.

فك تشفير بيانات الاعتماد عبر DPAPI و os_crypt هذه تقنية قديمة؛ أما تقديمها عبر مهارة وكيل الذكاء الاصطناعي التي لا تُفعّل إلا بموافقة المستخدم فهو الأسلوب الجديد. توقعوا المزيد من نمط القدرات المدمجة في المهارات مع انتشار أدوات إدارة الشهادات، وقوموا بتعديل نطاق المراجعة وفقًا لذلك. 

أدوات تحليل التركيبات البرمجية sca
إعطاء الأولوية للمخاطر التي تتعرض لها برامجك، ومعالجتها، وتأمينها
احصل على حسابك المجاني.
أي بطاقة ائتمان.

قم بتأمين تطوير البرامج الخاصة بك وتسليمها

مع مجموعة منتجات Xygeni