هجوم انتحال الأحرف في DevTap npm

هجوم انتحال الهوية عبر DevTap npm: ست حزم خبيثة تستهدف محطات عمل المطورين

TL؛ DR

بين 1 أبريل و3 مايو 2026، ناشر واحد لـ npm، user0001مسجلة بعنوان بريد إلكتروني غير موثق على Gmail tanvisoul9@gmail.com، قام بهدوء بدفع ست حزم بأسماء باهتة متعمدة، تبدو وكأنها خاصة بالبنية التحتية: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtimeو node-env-resolve.

أحدث إصدارين من node-env-resolveتم الإبلاغ عن الإصدارين 1.0.7 و 1.0.8 بواسطة نظام الإنذار المبكر للبرامج الضارة (MEW) التابع لشركة Xygeni في 2 مايو وتم تأكيد كونهما ضارين في 3 مايو.

إن هذه الزرعة غير عادية لما لا تحتويه: فلا توجد روبوتات تيليجرام، ولا ردود اتصال OAST، ولا التشويشولا توجد أي محاولة للحصول على بيانات اعتماد AWS أثناء التثبيت. بدلاً من ذلك، postinstall.js يقوم هذا البرنامج بإنشاء إدخال استمرارية تمهيد نظام التشغيل ويندوز، باستخدام مفتاح تشغيل HKCU الذي يقوم بتشغيله. wscript.exe مقابل برنامج VBS صغير. ثم يقوم بإنشاء وكيل Node.js منفصل يقوم بتجميع وحدات لالتقاط الميكروفون، وسرقة سجل المتصفح، والتقاط لقطات الشاشة، ومحاكاة الماوس/لوحة المفاتيح.

نطلق على هذه المجموعة اسم ديفتاببعد تثبيت المجموعة، يتم تشغيلها على جهاز المطور.

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

المجموعة: ست حزم، ناشر واحد

حساب الناشر user0001 غير موثق. ليس لديه أي معلومات SCM التحقق، وعدم وجود بريد إلكتروني مرتبط بنطاق معين، وعدم وجود سجل سابق. اسم مستخدم Gmail tanvisoul9 لا يظهر في أي سجل ناشر آخر في npm تمكنا من العثور عليه.

جميع الحزم الست تدرج نفس المسؤول، وتم نشرها من نفس الحساب، وتشترك في نفس package.json نص نمطي. لا يوجد repository، لا homepage، و لا description أطول من سطر واحد.

تكمن أهمية استراتيجية التسمية في هذا الجانب. فبخلاف حملات التضليل التقليدية المتعلقة بالتبعيات أو حملات انتحال الأسماء الخاطئة، لا تستهدف أي من هذه الأسماء مكتبةً أصليةً محددة. بل صُممت لتندمج بسلاسة في بيئة حقيقية. package.json or npm ls الناتج.

فئة الإشتراك نشرت لأول مرة احدث اصدار إصدارات الدور في المجموعة
سنترالوغ 2026-04-01 12:46 UTC 1.0.9 5، من 1.0.5 إلى 1.0.9 غلاف "أداة التسجيل" الخاصة بالمجموعة؛ تاريخ النشر الأقدم
dom-utils-lite 2026-04-14 07:36 UTC 1.0.3 3 غطاء مساعد DOM عام
node-fetch-lite 2026-04-19 10:22 UTC 1.0.2 3 يحاكي عائلة node-fetch
وكيل التوصيل 2026-04-25 05:12 UTC 1.0.0 1 الاسم العام "وكيل"
وقت تشغيل node-gyp 2026-04-25 05:17 UTC 1.0.0 1 يحاكي أدوات بناء الوحدات الأصلية
node-env-resolve 2026-04-25 05:21 UTC 1.0.9 10، من 1.0.0 إلى 1.0.9 قطارة فعالة؛ زرع كامل

أسماء مثل centralogger, node-fetch-liteو node-gyp-runtime صُممت هذه العناصر لتبدو غير مثيرة للجدل في مراجعة الكود. تبدو وكأنها عناصر موجودة بالفعل في شجرة تبعيات المشروع.

بالإضافة إلى ناشر جديد غير موثق وروابط مستودع مفقودة، تشكل هذه العوامل نمطًا واضحًا: جهة فاعلة تقوم بزرع أسماء سهلة الاستخدام في السجل، ثم تُجري تعديلات سريعة على الاسم المهم. في هذه الحالة، node-env-resolve تلقيت عشر نسخ في ثمانية أيام.

ما الذي يستقر على جهاز تطوير ويندوز

سلسلة الخبث على node-env-resolve:1.0.8 هو قصير ومباشر وغني بالميزات بشكل غير عادي بالنسبة لبرنامج npm RAT.

ما بعد التثبيت: استمرارية الوكيل المنفصل

package.json يُعلن عن خطاف تثبيت واحد:

{ "scripts": { "postinstall": "node postinstall.js" } }

postinstall.js يقوم بثلاثة أشياء بالترتيب.

أولاً، يقوم بإنشاء دليل تثبيت خارج شجرة npm. يتم حساب المسار في وقت التشغيل في البرنامج النصي كـ INSTALL_DIRثم يقوم بتشغيل عملية داخلية execSync('npm install --production --silent ...') يتم داخله سحب تبعيات وقت تشغيل الزرع. هذا يضع الوكيل على القرص في مكان ما، دليل المستخدم node_modules لن يجد التدقيق أي شيء.

ثانيًا، يقوم بكتابة برنامج تشغيل VBS وتسجيله لضمان استمرارية عملية الإقلاع:

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \
    /v ${AGENT_NAME} \
    /t REG_SZ \
    /d "wscript.exe \"${vbsPath}\"" /f

wscript.exe هو برنامج Windows Script Host، وهو ملف تنفيذي موقّع من Microsoft يعمل .vbs الملفات بدون نافذة وحدة تحكم. هذا قبلcisولهذا السبب تحديدًا يُفضّل استخدامه في عمليات التشغيل التلقائي.

يوجد أيضًا ما يطابق reg delete المسار الداخلي src/index.jsمما يشير إلى أن الزرعة مصممة بحيث يمكن إزالتها بسهولة بناءً على طلب المشغل.

ثالثًا، يقوم بإنشاء عملية فرعية منفصلة:

spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], {
  detached: true,
  env: { ...process.env, SERVER_URL }
})

هناك تفصيلان مهمان هنا.

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

كذلك، يرث الطفل الناتج بيئة الأب بالكامل. لذلك، أي NPM_TOKEN, AWS_*, GITHUB_TOKEN، أو أن مقبس SSH-agent الموجود في واجهة المطور أثناء التثبيت ينتقل إلى ذاكرة الوكيل طويل الأمد.

محتويات العبوة

المجمعة src/ تتضمن الشجرة ثلاثة وحدات، واسمها وحده يحكي القصة: audioCapture.js, browserHistory.jsو systemInfo.js.

قائمة التبعيات في وقت التشغيل، التي يتم حلها أثناء مرحلة التشغيل npm install، مما يؤكد ذلك.

يحوّل هذا النهج الحادثة الفوضوية إلى استجابة مضبوطة.

بدلاً من رد الفعل الأعمى، تعمل الفرق بـ تحديد الأولويات بوضوح والمعالجة السريعة.

التبعية ما الغرض منه في هذا السياق؟
لقطة شاشة سطح المكتب التقاط الشاشة بشكل دوري
@nut-tree-fork/nut-js أتمتة الفأرة ولوحة المفاتيح / محاكاة الإدخال
أفضل سكلايت 3 قراءة مباشرة لقواعد بيانات SQLite الخاصة بسجلات المتصفحات Chrome و Edge و Firefox
adm-zip تجميع القطع الأثرية التي تم جمعها قبل إخراجها
حاد تغيير حجم/ضغط لقطات الشاشة والتشوهات الناتجة عن الصور
عميل socket.io قناة C2 ثنائية الاتجاه مستمرة
معرف الجهاز العقدة بصمة ثابتة لكل مضيف لتتبع الضحايا

systemInfo.js المكالمات os.networkInterfaces() لإجراء بصمات إضافية قبل أول منارة.

لماذا تُعدّ خاصية التقاط الصوت الإشارة الأبرز؟

معظم برامج الوصول عن بُعد (RATs) التي نحللها في MEW تتوقف عند مرحلة سرقة البيانات السرية أثناء التثبيت. وهي تقرأ ~/.npmrc، وقراءة ~/.aws/credentials، اكشط process.envإرسال طلب POST إلى رابط ويب، ثم الخروج. هذا يتناسب مع نموذج اقتصادي قائم على الاختراق السريع. بيانات الاعتماد لها عمر قصير، ويحتاج المهاجم إلى تحقيق الربح بسرعة.

node-env-resolve يختلف في الشكل.

تم إعداد خاصية استمرارية البيانات بحيث تبقى البيانات محفوظة حتى بعد إعادة التشغيل. يعمل البرنامج بشكل منفصل ويستمر لفترة طويلة تحت wscript.exe. إن المعدات التي يحملها مخصصة للتواجد على جهاز المطور، وليس لأخذها وتركها: مسجل ميكروفون، وبرنامج تشغيل لوحة المفاتيح/الماوس، واستيعاب سجل المتصفح بالكامل، والتقاط الشاشة، وقناة Socket.IO تفاعلية للعودة إلى C2 قابل للتكوين.

إن التقاط الميكروفون على وجه الخصوص هو الخط الذي تتجاوزه هذه الحملة والذي لا تتجاوزه معظم البرامج الضارة التي تستخدم npm.

أصبحت محطة عمل المطورين، بشكل متزايد، هي نفسها المحطة التي يعقد فيها المطورون اجتماعاتهم اليومية، ومكالماتهم مع العملاء، ومناقشات التصميم، ويتواصلون مع العملاء عبر الهاتف. إن جهاز تسجيل الميكروفون ليس في الواقع متعلقًا برمز npm الخاص بالمطور، بل بما يقوله المطور أمام حاسوبه المحمول.

إن مجموعة القدرات هذه، بالإضافة إلى عدم وجود تشويش وعدم وجود أي تسريب بيانات مبهر أثناء التثبيت، تبدو وكأنها تهيئة مسبقة للوصول المستهدف بدلاً من سرقة بيانات الاعتماد الانتهازية.

لا نؤكد المسؤولية بناءً على هذا وحده، بل نشير إلى الملف التشغيلي.

هجوم انتحال أسماء الملفات في npm - DevTab

وتيرة التكرار التي تستغرق ثمانية أيام node-env-resolve وهي أهم التفاصيل المتعلقة بالعمليات في الجدول الزمني.

هذا ليس برنامجًا يُطلق ويُنسى. الناشر يُجري صيانة دورية لأداة التثبيت، وهذا يعني عادةً أحد أمرين: إما أنه يُجري تحسينات عليها في بيئات اختبارية قبل نشرها على نطاق أوسع، أو أنه يتلقى بالفعل بيانات تتبع التثبيت ويستجيب لها.

لم تشهد الحزم الخمس الأخرى أي تغييرات تُذكر بعد نشرها الأولي. وهذا يتوافق مع نمط "التثبيت لمرة واحدة، وتركه باسمه" للمجموعة الداعمة، بينما يتركز الجهد الهندسي على الحزمة التي تؤدي المهمة.

الإسناد: أدلة ضئيلة، لا حكم قاطع

عام OSINT الإشارات ضعيفة، ولن نقوم بتمديدها. ما يمكن ملاحظته:

اسم المستخدم على Gmail tanvisoul9 يشبه جزئياً اسماً شائعاً في جنوب آسيا، وهو "تانفي". هذه إشارة ضعيفة. معرفات جيميل ليست دليلاً على الهوية، واللاحقة soul9 هذا عام. ليس من الآمن استنتاج الموقع الجغرافي من جزء محلي في البريد الإلكتروني وحده.

أسلوب كتابة الكود في Node.js غير مميز: standard استدعاءات المكتبة مثل os, child_process, spawnو reg addلا يوجد أي تمويه، ولا تغيير في سلاسل البيانات، ولا منطق مضاد للتصحيح. يبدو أن المؤلف مُلِمٌّ بأساسيات سجل ويندوز وتنسيق العمليات الفرعية المنفصلة، ​​ولكنه لا يبدو أنه يسعى إلى استخدام أساليب أكثر خفاءً يُمكن أن يستخدمها.

التبعيات جاهزة تمامًا ومعروفة جيدًا: screenshot-desktop, nut-js, better-sqlite3و socket.io-clientلا يوجد بروتوكول مخصص، ولا حزمة تحكم/خادم تم إنشاؤها من الصفر، ولا حيلة جديدة للاستمرارية تتجاوز ما هو موجود في الكتب الدراسية. مفتاح تشغيل HKCUهذا مُكامل كفء، وليس مؤلف أدوات.

لم نجد سلاسل نصية غير إنجليزية، أو تعليقات مضمنة، أو بيانات محلية، أو بصمات المنطقة الزمنية لمخرجات المترجم داخل القطع الأثرية المنشورة.

لقد تحققنا من وجود تداخل في التعليمات البرمجية مع الحملات السابقة التي نتتبعها بالفعل، بما في ذلك شاي حلود, أوليفيون، وBuildkite، وheibai / الأخيرة claude-code-best عائلة استنساخ Anthropic-CLI. لم نجد أيًا منها: لا أنماط C2 مشتركة، ولا تخطيطات ملفات مشتركة، ولا مصطلحات مشتركة.

ما لا يمكننا قوله: أن هذا جهة فاعلة تابعة لدولة، أو جماعة معروفة، أو مرتبط جغرافياً بأي دولة معينة.

يتوافق النمط التشغيلي مع فريق صغير ذي مهارات متوسطة يقوم بمراقبة محطات عمل المطورين. ومن المرجح أن يكون الدافع مالياً من خلال الاستخدام اللاحق لصلاحيات الوصول، ولكن ربما أيضاً من خلال تقديم خدمات الاستطلاع لمشترٍ آخر.

هناك نقطتان غير مباشرتين تدعمان هذا التفسير: تجنب آليات استخراج البيانات التي تجذب الانتباه والتي من شأنها أن تحرق المجموعة بسرعة، مثل روبوتات تيليجرام، oastify.comأو رموز الكناري، وأسماء الحزم البسيطة المتعمدة، والتي تفضل عمليات التثبيت الهادئة طويلة الأمد على الارتفاع السريع عالي الحجم.

مؤشرات الاختراق والكشف

الحزم والناشر
الحقل بعد التخفيض
ناشر npm user0001
البريد الإلكتروني للناشر tanvisoul9@gmail.com، غير موثق
الباقات centralogger، dom-utils-lite، node-fetch-lite، connector-agent، node-gyp-runtime، node-env-resolve
تم التأكد من أنها خبيثة node-env-resolve@1.0.7، node-env-resolve@1.0.8
آثار المضيف
النوع بعد التخفيض
مفتاح الثبات HKCU\Software\Microsoft\Windows\CurrentVersion\Run
قيمة الاستمرارية اسم المتغير؛ بيانات على شكل wscript.exe \\ .vbs"
خطاف التثبيت postinstall: node postinstall.js في بيان الحزمة
وحدات الزرع src/audioCapture.js، src/browserHistory.js، src/systemInfo.js
دليل التجهيز تم تحديد INSTALL_DIR خارج مجلد node_modules الخاص بالمشروع؛ تم تحديد الموقع بواسطة postinstall.js أثناء التثبيت.
الانرنيت
النوع بعد التخفيض
شركة سي 2 للنقل socket.io-client، قناة ثنائية الاتجاه مستمرة
نقطة نهاية C2 يتم توفيرها للوكيل من خلال متغير البيئة SERVER_URL؛ وليست مضمنة بشكل ثابت في العناصر المنشورة

ملاحظات الكشف

هناك قاعدتان تمكنان هذه العائلة من التعرف عليها دون الحاجة إلى نقطة النهاية C2.

أولاً، قم بتحديد البرامج النصية التي تقوم بعملية ما بعد التثبيت الداخلية npm install في مسار خارج دليل الحزمة نفسه. أي برنامج تنزيل مُثبّت مسبقًا شرعي، مثل node-gyp يقوم بإعادة بناء أو تنزيل الملفات الثنائية الجاهزة، ويكتب داخل الحزمة أو في النظام الأساسي-standard مسارات التخزين المؤقت ذات التجزئات المُتحقق منها. لا يتم الكتابة في ملف تم إنشاؤه حديثًا INSTALL_DIR في مكان آخر على القرص.

ثانيًا، قم بتحديد البرامج النصية التي تصدر بعد التثبيت reg add HKCU\…\Run مع wscript.exe بصفتها مشغل التطبيقات. هذا الأمر غير شرعي بتاتاً من حزمة npm. يجب الإبلاغ عنها وعزلها.

هناك طريقة استدلالية ثالثة مفيدة لاكتشاف الحزمة الشقيقة التالية قبل تأكيدها: ناشر npm جديد بدون SCM التحقق، بريد إلكتروني من Gmail، لا repository إن نشر أسماء حزم قصيرة وعامة ومتعددة ذات طابع بنيوي خلال أيام قليلة من بعضها البعض، في حد ذاته، يكفي لتبرير المراجعة اليدوية.

تم الإبلاغ إلى سجل npm. سنقوم بتحديث هذا المنشور عند إزالة حساب الناشر.

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

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

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