قام عميل وهمي بتمرير مستودع GitHub خبيث إلى بريدي الوارد هذا الأسبوع، وبمجرد تشغيل نص البدء (starter script)، ضاع عمل يومين كاملين وانكشفت كل كلمات المرور التي أحفظها في متصفحي.
نشر "العميل" إعلانًا لوظيفة مهندس أول براتب مرتفع، وتواصل معي بسرعة، وأرسل مستودعًا (repo) يبدو احترافيًا. كان الطلب بسيطًا: قم بعمل clone، ثم شغل npm run dev وأرسل لقطة شاشة لإثبات أن العرض التجريبي يعمل — دون عقد، ودون فحص للخلفية. وفي اللحظة التي بدأ فيها خادم التطوير (dev server)، اتصل كود مخفي في ملف إعدادات بخادم تحكم وسيطرة (C2)، وجلب حمولة (payload) من المرحلة الثانية وبدأ في سحب بيانات الاعتماد من الجهاز المحلي.
كيف وقع الهجوم
كانت الحمولة الخبيثة موجودة في postcss.config.js ، وهو ملف يمر عليه معظم المطورين مرور الكرام لأنه يحتوي عادةً على عدد قليل من قواعد معالجة CSS البسيطة. في هذه الحالة، أضاف المهاجم سطرًا من لغة JavaScript مموهة (obfuscated) في أقصى يمين جملة برمجية مشروعة، مع إضافة مسافات لدمجه بسلاسة. وعندما قام أمر npm run dev بتنفيذ مسار PostCSS، تم تشغيل السطر المخفي دون ملاحظة.
قام البرنامج الضار بثلاث خطوات متتالية وبسرعة:
- الاتصال بخادم C2 – فتح اتصال شبكة بخادم يتحكم فيه المهاجم وأعلن عن المضيف المخترق.
- تحميل المرحلة الثانية – سحب كودًا إضافيًا يحتوي على المنطق الحقيقي لسرقة البيانات.
- سرقة بيانات اعتماد المتصفح – على نظام macOS، استعلم عن مفتاح Chrome Safe Storage المخزن في سلسلة مفاتيح النظام (keychain). وإذا وافق المستخدم على طلب سلسلة المفاتيح، قام المهاجم بحصد كل كلمة مرور محفوظة في Chrome.
وبعيدًا عن السرقة الفورية، قامت الحمولة بكتابة نفسها في العديد من أدوات المطورين الشائعة — VS Code و npm و Discord — بحيث يؤدي أي تشغيل مستقبلي لهذه التطبيقات إلى إعادة تفعيل الكود الخبيث. ولم تؤدِ مجرد إعادة التشغيل إلى القضاء على العدوى؛ إذ إن عملية npm install التالية أو فتح المحرر أعاد إحياء الباب الخلفي (backdoor).
علامات تحذيرية غالبًا ما يتم تجاهلها
- طلبات تشغيل الكود قبل توقيع أي عقد. تتضمن عمليات التوظيف المشروعة عادةً اتفاقية رسمية قبل مشاركة أي عمل مملوك.
- الملفات المضغوطة التي تتنكر في شكل "ملخصات مشاريع". يمكن لأرشيفات Zip أو RAR إخفاء سكربتات قابلة للتنفيذ أو ملفات ثنائية خبيثة.
- طلبات الحصول على عناوين البريد الإلكتروني الشخصية لـ "تجاوز فلاتر المنصة". تهدف هذه الحيلة إلى نقل المحادثة خارج المنصة المحمية حيث يمكن الإبلاغ عن الإساءة.
- أوصاف الوظائف التي تطلب من المرشح تمويل محفظة عملات مشفرة أو شراء رموز اختبار (test tokens). مثل هذه المطالب غير معتادة في أعمال التطوير الحقيقية.
خطوات عملية للبقاء آمنًا
- لا تقم أبدًا بتشغيل كود شخص غريب دون فحصه. افتح المستودع في عرض "للقراءة فقط" (على سبيل المثال، عبر عرض الملف الخام (raw) على GitHub) وافحص كل سكربت، خاصة ملفات الإعدادات ومدخلات
scriptsفيpackage.json. - تعامل مع جميع المرفقات كنصوص مجردة. إذا تم إرسال ملف zip، فقم باستخراجه في بيئة معزولة (sandboxed environment) وافحص المحتويات قبل فتح أي شيء.
- استخدم مدير كلمات مرور مخصصًا بدلاً من تخزين المتصفح. حتى لو تم اختراق سلسلة مفاتيح المتصفح، تظل خزنة مدير كلمات المرور معزولة.
- قم بتشغيل الكود غير الموثوق به في آلة افتراضية (virtual machine) أو حاوية (container) معزولة بدون وصول إلى الشبكة. هذا يمنع قدرة المهاجم على الوصول إلى خادم C2.
- قم بتفعيل المصادقة الثنائية (2FA) على جميع الحسابات. إذا سُرقت كلمة المرور، فإن العامل الثاني يمنع عمليات تسجيل الدخول غير المصرح بها.
- حافظ على تحديث أدوات التطوير وفعّل عمليات التحقق التلقائي من السلامة حيثما توفر ذلك. تحذر بعض المحررات الآن عند تعديل الملفات الأساسية بشكل غير متوقع.
إذا كنت تشك في أنك قمت بتشغيل كود خبيث، فافترض أن النظام قد تم اختراقه. قم بعمل نسخة احتياطية للبيانات الأساسية، وامسح القرص الصلب، وأعد تثبيت نظام التشغيل. لن تؤدي عملية إعادة التشغيل البسيطة إلى القضاء على آلية الاستمرارية (persistence mechanism) التي تعيد كتابة الملفات في التطبيقات الشائعة.
الخلاصة: يمكن لسطر واحد من لغة JavaScript المخفية أن يحول عرضًا تجريبيًا روتينيًا إلى عملية سرقة بيانات اعتماد كاملة. تعامل مع كل مستودع على أنه غير موثوق حتى تتحقق منه، واجعل العزل جزءًا افتراضيًا من سير عملك. إن تكلفة التسرع للحظة تفوق بكثير الجهد المبذول في التحقق المزدوج من الملف.
