دودة npm بحزم testmetest: شو بتسرق، وليش ما تلغي التوكن قبل التنظيف

15 حزمة npm بآخر اسمها testmetest، والإصدارات الخبيثة منهن فيها دودة بتسرق مفاتيح SSH وnpm والسحابة وأدوات الذكاء الاصطناعي، وبتمسح مجلدك الرئيسي إذا لغيت توكن GitHub المسروق قبل ما تنظّف.

نُشر في آخر تحديث 5 دقائق قراءة#أمن سلسلة التوريد#أدوات المطورين

بين 19 و22 تشرين الأول 2026 حدا نشر 15 حزمة على npm أسماءها بتخلص بـ testmetest، والإصدارات الخبيثة منهن فيها دودة بتسرق بيانات الدخول وبتنشر حالها لحزم ومستودعات تانية. SafeDep حللتها يوم 22 تشرين الأول، وما لقت ولا ضحية برّا حسابات المشغّل نفسه. بآخر المقال بتعرف إذا جهازك أو مستودعاتك فيها أثر منها، وبأي ترتيب بتنظّف لحتى ما تمسح الدودة ملفاتك.

شو هي حزم testmetest، ولسا موجودة على npm؟

حزم testmetest هي 15 حزمة npm انرفعت بين 19 و22 تشرين الأول 2026 بـ 44 إصدار، وبعض إصداراتها فيها دودة بتسرق بيانات الدخول. يوم 23 تشرين الأول ما عاد في ولا إصدار من إصداراتهن على npm.

حسب تحليل SafeDep، كل حزمة مرقت بتلات مراحل: إصدار فاضي 0.0.0-stage، بعدين إصدار 1.0.0 نضيف للتمويه، بعدين إصدار patch خبيث متل 0.0.1 بيصير هو latest. وقت ما نشرت SafeDep تحليلها، 11 حزمة كانت انشالت يوم 21 تشرين الأول، و4 لسا موجودة، ووحدة بس منهن مسلّحة: event-bus-lite-testmetest@0.0.1، يلي انرفعت الساعة 10:59 بتوقيت UTC يوم 22.

يوم 23 تشرين الأول، سجل npm بيورجي إنو 13 حزمة منهن ممسوحة، والتنتين الباقيين (sdk-utils-testmetest وkvarzo8f3atestmetest) صار مكانهن إصدار 0.0.1-security فاضي من npm. وGitHub نشرت لهالتنتين تنبيه برمجية خبيثة (GHSA-m6qq-33mj-mv9w وGHSA-8vpc-rm6r-5m6c)، وفيه: «Any computer that has this package installed or running should be considered fully compromised.»

SafeDep بتقول إنو الكود بيشارك كود مع حملة Miasma «Phantom Gyp» من حزيران 2026، وإنو آلية المسح عند إلغاء التوكن جاية من Mini Shai-Hulud. بس هي نفسها ما أكّدت النسب، وما نسبت الحملة لمشغّلي Miasma الأصليين.

كيف بتشتغل الدودة بلا سكربت تثبيت؟

الحزمة الخبيثة ما فيها ولا سكربت بـ package.json. فيها ملف binding.gyp، وnpm بيشغّل node-gyp rebuild لحاله لأي حزمة فيها هالملف، والدودة حاطة الأمر يلي بيشغّلها جوّا حقل sources بالملف.

توثيق npm للسكربتات بيقول إنو إذا في binding.gyp بجذر الحزمة وما في سكربت install أو preinstall، npm بيخلي أمر التثبيت node-gyp rebuild. وسجل OSV للحزمة data-pipeline-testmetest بيورجي الحقل نفسه:

<!(env node index.js >/dev/null 2>&1; echo stub.c)

node-gyp بيشغّل هالأمر وهو عم يجهّز البناء، فبيشتغل index.js، وهو محمّل مشفّر بيفك الحمولة وبيمرّقها لـ Bun (وبينزّله إذا مش موجود).

أما --ignore-scripts، فهو بيوقف هالحيلة مع npm. بكود npm نفسه (rebuild.js)، الحزمة يلي فيها binding.gyp بتاخد node-gyp rebuild كسكربت install، وسكربتات install ما بتشتغل مع --ignore-scripts. الحيلة موجّهة لأي أداة أو شخص بيحكم على الحزمة من قسم scripts بـ package.json: هونيك ما في شي.

شو بتسرق الدودة، ووين بتزرع حالها؟

دودة testmetest بتسرق مفاتيح SSH، وبيانات دخول npm وPyPI وGit، وملفات .env، وكلمات سر المتصفح، وبيانات دخول Claude وCodex وGemini وCopilot، وأسرار AWS وGCP وAzure وVault وKubernetes.

بيانات أدوات الـ AI صارت هدف ثابت بهالحملات: نسخة LiteLLM 1.107.0 الخبيثة كانت تسرق نفس النوع بنفس الأسبوع. وحسب SafeDep، الدودة بتعمل كمان هالشغلات:

وين

شو بتعمل

GitHub Actions

بتقرا الأسرار من ذاكرة عملية Runner.Worker، وبتقتل StepSecurity Harden-Runner عن طريق docker.sock وبتوجّه *.stepsecurity.io لـ localhost، وإذا فشلت بتطلع

الجهاز

بتركّب خدمتين للمستخدم: net-health-checker وpkg-runtime (systemd على Linux وLaunchAgents على macOS)

npm

بتحط المحمّل بحزمك إنت وبتنشر إصدار patch جديد باسمك

PyPI وRubyGems وJFrog

بتعيد نشر الحزم

SSH

بتنسخ حالها للأجهزة يلي بملف known_hosts عند كل مستخدم

GitHub وGitLab

بتعمل commit لـ workflow مزيّف باسم CodeQL، ولملفات وكلاء: .claude/settings.json و.cursor/mcp.json وCLAUDE.md وAGENTS.md و.vscode/tasks.json، ولمحمّل Windows بـ .github/init.ps1

ملفات الوكلاء بدها انتباه لحالها: SafeDep كاتبة إنها «infect the host again»، يعني بترجع تصيب الجهاز. هالملفات بيقراها Claude Code وCursor وVS Code، فأي commit بيلمسها بدو مراجعة متل الكود.

للتواصل، pkg-runtime بيدوّر كل ساعة بـ commits على GitHub عن النص msync-3f7a، وبينزّل سكربت Python من رابط موقّع بمفتاح RSA تبع المهاجم وبيشغّله. والمسروقات بتطلع لمستودع عام بحسابك، اسمه متل smart-workers-48213 ووصفه project-utils، وcommits بتبلّش بـ AutoSyncComplete:. وفي عنوان احتياطي: aiarmor[.]website.

ليش إلغاء توكن GitHub أول شي ممكن يمسح ملفاتك؟

خدمة net-health-checker بتفحص توكن GitHub المسروق كل 45 ثانية، و48 ساعة ورا بعض. إذا رجع 401 أو 403، يعني التوكن انلغى، بتشغّل rm -rf ~/; rm -rf ~/Documents وبتمسح مجلدك الرئيسي.

يعني الخطوة يلي بتعملها عادة أول شي، إنك تلغي التوكن المسروق، هي نفسها الزناد. سجل OSV بيقولها صريحة: شيل ~/.local/bin/net-health-checker.sh والـ systemd unit أو الـ LaunchAgent تبعه قبل ما تلغي التوكن. وتنبيه GitHub بيقول دوّر كل الأسرار «from a different computer». المنطق نفسه بأي حادثة تسريب أسرار: ترتيب تدوير الأسرار بيفرق متل التدوير نفسه.

كيف تفحص جهازك ومستودعاتك وتنظّف بالترتيب؟

الفحص والتنظيف ست خطوات، والترتيب جزء من الحل:

  1. فتّش ملفات القفل بمشاريعك عن أي حزمة testmetest:

grep -rln "testmetest" --include=package-lock.json --include=npm-shrinkwrap.json --include=yarn.lock --include=pnpm-lock.yaml .
  1. شوف إذا خدمات الدودة موجودة على الجهاز. هالمسارات من تحليل SafeDep:

# Linux
systemctl --user status net-health-checker pkg-runtime
ls -la ~/.local/bin/net-health-checker.sh ~/.config/net-health-checker ~/.local/share/runtimes /var/tmp/.fontconfig_state
# macOS
ls -la ~/Library/LaunchAgents/com.user.net-health-checker.plist ~/Library/LaunchAgents/com.user.pkg-runtime.plist
  1. إذا لقيت شي، افصل الجهاز عن الشبكة، وشيل الخدمتين قبل أي شي تاني. هي أوامر SafeDep متل ما هي، وعلى macOS امسح ملفي الـ .plist بعد أمر launchctl:

# Linux
systemctl --user disable --now net-health-checker pkg-runtime
rm -rf ~/.local/bin/net-health-checker.sh ~/.config/net-health-checker \
  ~/.config/systemd/user/{net-health-checker,pkg-runtime}.service \
  ~/.local/share/runtimes /var/tmp/.fontconfig_state
# macOS
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.user.{net-health-checker,pkg-runtime}.plist
  1. من جهاز تاني نضيف، لغي ودوّر كل بيانات الدخول: GitHub وGitLab، وnpm وPyPI وRubyGems، ومفاتيح السحابة وVault وKubernetes، ومفاتيح SSH، ومفاتيح مزوّدي الـ AI.

  2. افحص حساباتك: مستودعات جديدة وصفها project-utils، وإصدارات patch ما نشرتها إنت، وcommits بتبلّش بـ AutoSyncComplete:، وcommits بتضيف .claude/ أو .cursor/ أو .gemini/ أو .vscode/tasks.json أو CLAUDE.md أو AGENTS.md، وأي workflow باسم CodeQL ما ضفته إنت. ولحتى ما يتغيّر شي بـ GitHub Actions بلا ما تنتبه، شوف كيف تقفل الـ actions على commit محدد.

  3. SafeDep بتنصح تعيد تثبيت نظام التشغيل على الجهاز المصاب، وتنبيه GitHub بيقول إنو ما في ضمانة إنو شيل الحزمة بيشيل كل البرمجيات الخبيثة.

وللجاي: SafeDep نشرت قاعدة كشف بتطبّقها على كل حزمة: ملف binding.gyp حقل sources فيه <!(node وبيخبّي المخرجات، بحزمة ما فيها ملفات C أو C++. وإذا مشاريعك ما بتحتاج بناء أصلي، --ignore-scripts مع npm بالـ CI بيسكّر هالباب. وإذا بدك حدا يفحص منصتك وخط الـ CI والأسرار تبعك قبل ما يوصلها هجوم متل هاد، هاد شغل مُحَصَّن.

آخر مرة راجعت فيها AGENTS.md أو .claude/settings.json بمستودعاتك متل ما بتراجع الكود، إمتى كانت؟

أسئلة شائعة

هل الدودة عم تنتشر هلق؟

ما في دليل على هيك. لحد 22 تشرين الأول، SafeDep ما لقت ولا حزمة لطرف تالت انصابت ولا ضحية، وكل النشاط كان على حسابات المشغّل التجريبية. ويوم 23 تشرين الأول ما عاد في ولا إصدار من إصداراتهن على npm.

بيحميني --ignore-scripts من هالدودة؟

إي، مع npm. npm بيعامل بناء binding.gyp كسكربت install، و--ignore-scripts بيوقف سكربتات install. الحيلة بالدودة إنو package.json ما فيه ولا سكربت، فيلي بيحكم على الحزمة من قسم scripts بس ما بيشوف شي.

ما ثبّتت ولا حزمة منهن، في شي لازم أعمله؟

شي بسيط: فحص قصير لملفات القفل بيكفي لهالحزم. بس الطريقة نفسها، binding.gyp بيشغّل كود وقت التثبيت، ممكن ترجع بأسماء تانية، فقاعدة الفحص يلي نشرتها SafeDep بتستاهل تنضاف لأدوات CI عندك.

لقيت خدمة net-health-checker على جهازي، شو أول شي؟

افصل الجهاز عن الشبكة، وشيل الخدمتين وملفاتهن قبل ما تلغي أي توكن. بعدين لغي ودوّر كل بيانات الدخول من جهاز تاني نضيف، وSafeDep بتنصح تعيد تثبيت نظام التشغيل.

شارك المقال

مقالات أخرى