QuietPolyfill، أداة تحميل NPM التي عادت للظهور

QuietPolyfill: أداة تحميل ملفات NPM التي عادت للظهور

TL؛ DR

عشرون حزمة npm نُشرت على مدار يومين في أواخر يوليو وأوائل أغسطس 2026، تُقدّم نفسها على أنها مكتبات مكونات واجهة مستخدم داخلية وأدوات مساعدة مشتركة للخادم. لا تُنفّذ أيٌّ منها الوظائف المُعلن عنها. كل حزمة تُرفق فئةً وهمية، وملف README يصف الحزمة بأنها داخلية، وملفًا يُسمى _polyfill.js.

الجزء المثير للاهتمام هو من أين يتم استدعاء هذا الملف. إنها ليست أداة تثبيت — لا تُعلن ملفات البيان عن أي تثبيت مسبق أو تثبيت أو تثبيت لاحق على الإطلاق. بدلاً من ذلك، السطر الأخير من index.js على ما يلي: try { require("./_polyfill"); } catch (_) {}يتم تشغيل الحمولة عند استيراد حزمة التعليمات البرمجية للتطبيق لأول مرة. التثبيت باستخدام --ignore-scriptsأطلقت حملة standard نصائح لتقليل مخاطر سلسلة التوريد أثناء التركيب، لا يمنع ذلك.

ابحث عن _polyfill.js تتمثل وظيفة هذه العملية في استرجاع ملف تنفيذي خاص بالمنصة من أحد مضيفي Cloudflare Workers الثلاثة، وكتابته في دليل مؤقت باسم عشوائي، ووضع علامة عليه كملف تنفيذي، وتشغيله بشكل منفصل عن العملية الأصلية. هذا الملف التنفيذي هو نفسه برنامج تحميل: فهو يسرد منتجات أمان نقاط النهاية حسب اسم العملية، ويتحقق من اسم المستخدم الحالي مقابل حسابات بيئة التحليل المعروفة، ويُحدّث واجهات AMSI وETW للقياس عن بُعد في الذاكرة، ويُثبّت خاصية الثبات تحت اسم مكون صوتي لنظام Windows، ويسترجع ملفًا ثنائيًا ثالثًا بحجم عدة ميغابايت. تصل المرحلة الثالثة مُشفّرة وهي يتم فك تشفيرها وتنفيذها في الذاكرة بدلاً من كتابتها على القرص.

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

الباقات20 اسمًا في npm، وحوالي 74 إصدارًا منشورًا
مواضيع التسميةbeaver-ui-* (13) accounts-* (3)، بالإضافة إلى afisha-storybook-default, bcore-bravo-eslint-config, arbocrate-sla-prober-arbocrate-sla-prober-core, a.poltoradnev-package-c
تحفيز عمليةاستيراد الوحدة (require), ليس نصًا برمجيًا لدورة حياة npm
المرحلة رقم 1_polyfill.js — الاسترجاع والإطلاق
المرحلة رقم 2مُحمِّل مرتبط ثابتًا، مُغلَّف بصيغة UPX على نظام لينكس؛ تعداد أمان نقاط النهاية، وتصحيح AMSI/ETW، والاستمرارية
المرحلة رقم 3beacon_linux.bin / beacon_mac.bin / update_win.exe4-13 ميجابايت؛ يتم تسليمها مشفرة، ويتم تنفيذها في الذاكرة
بلاتفورملينكس x64 و arm64، ماك أو إس العالمي، ويندوز x64
الناشرين حسابان، قاعدة بيانات واحدة
الحالة19 من أصل 20 اسماً لم يتم نشرها بواسطة المشغل؛ تمت إعادة نشر 1 ونشرها؛ البنية التحتية للتسليم متاحة

تشريح الهجوم

المرحلة الأولى - الحزمة

كل عضو يقوم بشحن نفس الشكل المكون من ثلاثة ملفات. index.js يُصدّر فئة مع فيه() ذلك يحدد قيمة منطقية، إصدار()، و configure() هذا يدمج كائن الخيارات. لا شيء آخر. README.md يُعطي سطر تثبيت، تطلب السطر، والجملة "حزمة داخلية. راجع ملف CONTRIBUTING.md للاطلاع على الإرشادات" — المساهمة. md ليس موجوداً في ملف tarball.

_polyfill.js يبلغ حجمه أقل بقليل من 5 كيلوبايت، ويُقرأ كشفرة برمجية عادية للبنية التحتية. ويُفتح بثلاثة فحوصات بيئية:

if (process.env.DISABLE_TELEMETRY ||
    process.env.ANALYTICS_OPT_OUT ||
    process.env.DO_NOT_TRACK)
  return;

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

ثم يأتي ختم التشغيل لمرة واحدة: ملف في /tmp/.analytics_state أو حالة التحليلات مع ٪مؤقت٪ في نظام ويندوز، تتم مقارنة وقت التعديل مع نافذة زمنية مدتها 20,357 ثانية. ضمن هذه النافذة، تعود الوحدة فورًا، لذا فإن عمليات الاستيراد المتكررة أثناء عملية البناء تُنتج محاولة استرجاع واحدة بدلًا من عشرات المحاولات.

لا يتم عرض المضيفين الوجهة كقيم حرفية، بل يتم تجميعهم أثناء التشغيل من أجزاء:

["oob-worker.cf102-","baf.workers.d","ev"].join("")

يتم إنشاء ثلاثة مضيفين بهذه الطريقة وإعادة ترتيبهم عشوائيًا قبل الاستخدام، لذا يختلف الترتيب في كل عملية تنفيذ. عملية الاسترجاع هي طلب HTTPS GET مثبت على IPv4 مع عامل المستخدم of node-fetch/2.6 — قيمة معقولة يمكن أن تُصدرها عملية Node. يتم تجاهل أي استجابة أقل من 1,000 بايت، ويتم تجربة المضيف التالي.

إذا فشلت جميع الطرق الثلاث، يعود النظام إلى نظام أسماء النطاقات (DNS). ويقوم بإصدار استعلام TXT لـ ج. للحصول على عدد الأجزاء، ثم يطلب 0. من خلال ن. يقوم البرنامج بدمج الإجابات في مجموعات من عشرة، ثم يفك تشفير النتيجة باستخدام ترميز Base64. يحمل هذا المسار نفس الملف التنفيذي عبر سجلات DNS TXT، مما يضمن استمرارية عمله حتى في البيئات التي يتم فيها تصفية طلبات HTTP الصادرة دون تصفية نتائج DNS.

تُكتب البايتات المسترجعة إلى /var/tmp/.cache_<8-hex> على نظام يونكس، أو %TEMP%\dotnet_diag_<8-hex>.exe في نظام ويندوز، يُقرأ اسم الملف على أنه ملف تشخيصي لـ .NET. أما في نظام يونكس، فيُمنح الملف الوضع 0755. التشغيل هو نسل مع منفصل: صحيح, stdio: "ignore"و unref()وبالتالي، يستمر البرنامج الفرعي في العمل بعد انتهاء عملية Node التي بدأته؛ في نظام Windows، يضيف الاستدعاء windowsHide: true.

تفصيلان يكملان الصورة. المساعد يُعرَّف بأنه const _l = (…a) => process.stderr.write(“”) يتم استدعاء هذه الدالة في كل خطوة من خطوات الاسترجاع، حيث تكتب سلسلة نصية فارغة وتتجاهل وسائطها، لتشغل بذلك الموضع الذي كان من المفترض أن يكون فيه التسجيل. وتحتوي كل حزمة على ملف بحجم 81 كيلوبايت. lib/telemetry.js يصف تعليق العنوان "مجموعة أدوات تطوير برمجية للتحليلات" تتضمن "نقل HTTPS مع تدوير نقاط النهاية وإعادة المحاولة" و"اكتشاف الخدمة القائم على نظام أسماء النطاقات (DNS) للتعافي من الأعطال". لا يتطلب الإصدار الحالي أي شيء منها.

المرحلة الثانية - اللودر

ملف Linux x64 الثنائي عبارة عن ملف ELF مرتبط بشكل ثابت ومضغوط باستخدام UPX 3.96. أما إصدار macOS فهو ملف ثنائي شامل يغطي x86_64 و arm64؛ بينما إصدار Windows عبارة عن ملف تنفيذي مُجرّد من نوع PE32+ يعمل في سطر الأوامر. تم استرجاع الملفات الأربعة وفحصها بشكل ثابت، ولم يتم تشغيل أي منها.

توضح واردات وجدول السلاسل في إصدار ويندوز سلوكه بوضوح. وهو يحل هل المصحح موجود, تحقق من وجود مصحح الأخطاء عن بعدو عملية استعلام المعلومات NtQueryويقرأ SYSTEM\CurrentControlSet\Services\Disk\Enum — مسار في سجل النظام تحدد قيمه وحدات تحكم الأقراص الافتراضية. ويستدعي GetDiskFreeSpaceExW و حالة الذاكرة العالمية، بما يتوافق مع التحقق مما إذا كانت موارد المضيف تتطابق مع مثيل تحليل قصير الأجل.

يحتوي على قائمة بأسماء المستخدمين: المستخدم الحالي, مسؤول تكنولوجيا المعلومات, هونغ لي, صندوق اختبار, hapubws, ميلوز, تيمي, مشرف, البرمجيات الخبيثة, عينة, فيروس, بيئة. العديد من هذه الأشياء هي نتاج بيئات تحليل موثقة علنًا.

كما يحتوي على قائمة بمنتجات أمن نقاط النهاية وأسماء عملياتها، مُرقمة من خلال CreateToolhelp32Snapshot و العملية 32 الأولى غربًا/Process32NextW:

  • CrowdStrike فالكون (csfalconservice, CSFalconContainer)
  • أسود الكربون (cb.exe)
  • Cylance (cylancesvc.exe)
  • برنامج BitDefender (bdagent.exe)
  • Kaspersky (avp.exe, kavfs.exe)
  • تريند مايكرو وديب سيكيوريتي (coreServiceShell, ds_agent.exe)
  • فاير آي/تريليكس (xagt.exe)
  • Tanium (taniumclient.exe)
  • HitmanPro (hmpalert.exe)
  • مرن (elastic-agent.exe, elastic-endpoint, filebeat.exe, winlogbeat.exe)
  • وازوه و أوسيك (wazuh-agent.exe, ossec-agent.exe)
  • نقطة تفتيش
  • برنامج Windows Defender

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

يظهر برنامج Persistence مرتين على نظام ويندوز. يتم نسخ الملف التنفيذي إلى %APPDATA%\Microsoft\Windows\Themes\SystemSoundsService.exeوتشير إليه آليتان: قيمة أقل من SOFTWARE\Microsoft\Windows\CurrentVersion\Run، ومهمة مجدولة مسجلة باسم

schtasks /Create /F /SC ONLOGON
  /TN "\Microsoft\Windows\Multimedia\SystemSoundsService"
  /TR "\"%s\""
  /RL HIGHEST

مسار المهمة واسم المهمة واسم الملف التنفيذي كلها تعكس مكون الصوت الأصلي لنظام التشغيل Windows. أعلى مستوى /RL يطلب أعلى مستوى امتياز متاح.

يتبع إصدار macOS نفس النمط مع أسماء مناسبة للنظام الأساسي: فهو يكتب قائمة خصائص إلى ~/Library/LaunchAgents/com.apple.windowserver.helper.plist ويضع ملفها التنفيذي في ~/.local/share/runtime/com.apple.runtime. يتحقق من /التطبيقات/VMware Fusion.app و /المكتبة/دعم التطبيقات/أدوات VMware.

تشمل إمكانيات الشبكة ثلاثة أنواع من النقل: WinINET.dll لبروتوكول HTTPS مع https://%s:%d%s سلسلة التنسيق، WS2_32.dll المقابس، و DNSAPI.dll مع DNSQuery_A جنبا إلى جنب مع ج.%س.%س سلسلة التنسيق — نفس شكل استعلام عدد الأجزاء الذي تستخدمه المرحلة الأولى.

الوصف أعلاه يوضح ما تُظهره عمليات الاستيراد والسلاسل ومسارات التسجيل في الملف الثنائي عند فحصه. يُضيف تحليلٌ عامٌ متعدد المحركات لنفس عينة ويندوز تفاصيل لا يُمكن الحصول عليها من قراءة ثابتة لجدول الاستيراد بمفردها، وقد نُسبت هذه التفاصيل هنا بدلاً من إعادة ذكرها كملاحظة مباشرة. يُشير هذا التحليل إلى أن مراجع AMSI وETW لم تُحل فحسب، بل تم ترقيعها أيضاً. AmsiScanBuffer in amsi.dll و EtwEventWrite in ntdll.dll — مما يمنع فحص محتوى الذاكرة وتتبع الأحداث للعملية. ويُبلغ عن عمليات التحقق من مكافحة التحليل على أنها تعتمد على التوقيت بالإضافة إلى تحقق من وجود مصحح الأخطاء عن بعدويحدد GetThreadContext يتم استدعاء هذه الوظيفة كفحص لنقاط التوقف في الأجهزة، وذلك بقراءة سجلات التصحيح. كما أنها تُبلغ عن وجود قفل تبادلي أحادي النسخة. Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}والأسماء خدمة أصوات النظام كقيمة مفتاح التشغيل. لم تكن قيمة mutex هذه من بين السلاسل المستردة هنا - حيث استبعد مرشح الاستخراج الرموز السداسية الكبيرة بين قوسين - وقد تم تسجيلها في جدول المؤشرات بناءً على هذا التحليل العام بدلاً من الملاحظة المباشرة.

المرحلة رقم 3

يشير برنامج التحميل إلى مجموعة أخرى من المسارات على نفس المضيفين. وقد كانت جميعها قابلة للوصول أثناء التحليل. beacon_linux.bin بحجم 5.3 ميجابايت، beacon_mac.bin بحجم 13.3 ميجابايت، update_win.exe بحجم 10.3 ميجابايت، و arm.bin بحجم 4.3 ميجابايت. لم يتم استرجاع هذه الملفات، وسلوكها غير معروف.

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

 

الخط الزمني

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

متىابحث عن
2026-07-31 09:25:05 → 09:29:56تم إنشاء عشرة أسماء، يبدأ كل منها بالإصدار 0.0.1بفارق زمني يقارب ثلاثة عشر ثانية.
2026-08-01 09:38 → 11:29تتطور الأسماء الحالية عبر أرقام إصدارات متضخمة، 6.1.9 من خلال 6.1.12, 9.9.9 من خلال 9.9.12, 8.9.3 من خلال 8.9.6, 5.4.6 من خلال 5.4.9.
2026-08-01 13:04:14 → 13:04:18تسعة أخرى beaver-ui-* أسماء تم إنشاؤها في دفعة مدتها أربع ثوانٍ، كل منها تم نشره مباشرة في إصدار 12.x بدون أي سجل سابق.
2026-08-01 ~13:00–14:30تم تصنيف الإصدارات على أنها ضارة بعد المراجعة اليدوية.
2026-08-01 17:39:49 → 17:40:14تسعة عشر اسماً من أصل عشرين اسماً لم يتم نشرها في غضون خمس وعشرين ثانية، بالتسلسل، بفارق حوالي 1.2 ثانية بين كل اسم وآخر.
2026-08-02 18:58:41a.poltoradnev-package-c تم إنشاؤه مرة أخرى تحت حساب صيانة مختلف، إصدار 0.0.2.
2026-08-02 19:20:28التجريبية 33.9.5 نُشرت بنفس الاسم.
2026-08-02 20:14جميع مضيفي التسليم الثلاثة يخدمون المرحلتين الثانية والثالثة؛ استجابة نظام أسماء النطاقات الاحتياطية مع عدد الأجزاء.

هناك اثنتان من هذه المدخلات تستحقان التوقف عندهما.

أدى الهجوم الذي وقع في تمام الساعة 13:04 إلى تسجيل تسع حزم في السجل خلال أربع ثوانٍ، كل منها بإصدار واحد في نطاق 12 ثانية، ولا يوجد أي إصدار آخر. 0.0.1 أسفل ذلك. أرقام الإصدارات بهذا الحجم، على أسماء عمرها يوم واحد، لا تصف تاريخ الإصدار.

تتم عملية إلغاء النشر بنفس الآلية: تسعة عشر اسمًا، وخمس وعشرون ثانية، مع تباعد متساوٍ. يسجل npm هذه الأحداث كعمليات إلغاء نشر عادية بدلاً من العنصر النائب الذي يتركه حذفٌ بدأه السجل، مما يجعل الإجراء مرتبطًا بحساب النشر وليس بالسجل.

 

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

تم تعطيل الوصول إلى المضيفين والمسارات. لا تقم بحلها أو استردادها من نظام الإنتاج.

النوعبعد التخفيض
مضيف توصيلoob-worker[.]cf99-9b3[.]workers[.]dev
مضيف توصيلoob-worker[.]cf102-baf[.]workers[.]dev
مضيف توصيلoob-worker[.]cf103-070[.]workers[.]dev
نقل نظام أسماء النطاقات (DNS)tin[.]dl[.]well1[.]site (لينكس x64)، tina[.] (arm64)، ldr[.] (نظام macOS) ، win[.] (ويندوز) — عدد الأجزاء في c.<domain>البيانات في <n>.<domain>
مسارات المرحلة الثالثة/pkg/package, /pkg/package-arm64, /pkg/loader_mac, /pkg/package.exe
مسارات المرحلة الثالثة/pkg/beacon_linux.bin, /pkg/beacon_mac.bin, /pkg/update_win.exe, /pkg/arm.bin
مسار الإسقاط (يونكس)/var/tmp/.cache_<8-hex>
مسار الإفلات (ويندوز)%TEMP%\dotnet_diag_<8-hex>.exe
خاصية الثبات (ويندوز)%APPDATA%\Microsoft\Windows\Themes\SystemSoundsService.exe؛ مهمة \Microsoft\Windows\Multimedia\SystemSoundsServiceقيمة مفتاح التشغيل SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SystemSoundsService
Mutex (Windows)Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}
الاستمرارية (macOS)~/Library/LaunchAgents/com.apple.windowserver.helper.plistثنائي في ~/.local/share/runtime/com.apple.runtime
طابع يعمل مرة واحدة/tmp/.analytics_state, %TEMP%\analytics_state (نافذة زمنية مدتها 20,357 ثانية)
طلب التوقيعHTTPS GET، IPv4-pinned، User-gent: node-fetch/2.6
ملف المرحلة 1_polyfill.js، SHA-256 392dc9ec85042ce1796bfa9b8c7bf6e05c7710579aab8b7b1eb73788683883af
ملف غير مرجعيlib/telemetry.js، SHA-256 2266c9b8e199daebe31a9afcb61d9b0d76706b63c92312fc8223d22de42e63c7
المرحلة الثانية (لينكس 64 بت)SHA-256 7e486657f30594afda379b97030252a09a19fe8055e25c9e371544f59bd8e9e3
المرحلة الثانية (لينكس arm64)SHA-256 aafc37589c0d21fb729761a1579ca3b278b95bce152aacfa29243ffd27f5eeb7
المرحلة الثانية (نظام التشغيل macOS)SHA-256 c214746c74cae8ece8bdaf69aa05da4db6ce013f9e77452d1eed1a002fd9ba00
المرحلة الثانية (ويندوز)SHA-256 d632c2c0c7801c3da57cf849fe4b4ca8351d9a7fe73c31050bf5dbcc96a16791

أسماء الحزمة

درج واجهة المستخدم beaver-ui-drawer زر إجراءات واجهة المستخدم beaver بطاقة beaver-ui-large منتقي نطاق التاريخ beaver-ui نموذج واجهة المستخدم beaver-ui-form نموذج واجهة المستخدم beaver-ui-form-modal كائن نموذج واجهة المستخدم beaver-ui شبكة واجهة المستخدم beaver-ui-grid رأس واجهة المستخدم beaver-ui-header beaver-ui-hooks قفل أيقونة واجهة المستخدم beaver-ui عناصر واجهة المستخدم الخاصة بـ beaver-ui-items-with-more تخطيط واجهة المستخدم beaver-ui-layout الحسابات - الصيغة النهائية حالة تحميل الحسابات الجدول الزمني للحسابات afisha-storybook-default bcore-bravo-eslint-config arbocrate-sla-prober-arbocrate-sla-prober-core a.poltoradnev-package-c

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

هناك حسابان على npm متورطان في الأمر. تم نشر الأسماء التسعة عشر غير المنشورة بواسطة حساب واحد؛ a.poltoradnev-package-c أُعيد تسجيلها في 2 أغسطس باسم حساب مختلف ونطاق بريد إلكتروني مختلف. يحمل كلا التسجيلين نفس التسلسل البرمجي، ويحمل التسجيل الثاني نفس خوادم التسليم، ونفس نطاقات النسخ الاحتياطي لنظام أسماء النطاقات، ونفس بنية مسار التسليم، ونفس ختم التشغيل لمرة واحدة.

يُظهر الإصدار المُعاد نشره أيضًا كيفية تجميعه. الإصدارات 0.0.2 و 33.9.5 متطابقة على مستوى البايت باستثناء سلسلة الإصدار في package.json، و index.js تم شحنها كما هي 0.0.2 يعلن const VERSION = “33.9.5”تم قطع القطعتين الأثريتين من شجرة مصدر واحدة وترقيمهما لاحقًا. لا يوجد 0.0.2 تاريخ تطور 0.0.2 إصدار للتمثيل.

يتبع ترقيم الإصدارات في المجموعة بأكملها نفس المنطق. تُقرأ أسماء الحزم في هذه الحملة على أنها أشياء موجودة داخل مؤسسة وليست في سجل عام: مجموعة مكونات واجهة المستخدم، أو إعدادات ESLint، أو أداة فحص اتفاقية مستوى الخدمة، أو حزمة تحمل اسم شخص. عندما يحل إصدارٌ ما تبعيةً بالاسم ويستشير سجلًا عامًا إلى جانب سجل خاص، يُعتمد رقم الإصدار الأعلى. اسم تم إنشاؤه في 0.0.1 يوم الاثنين وحمل 12.9.6 يوم الثلاثاء هو الموعد المناسب لإجراء تلك المقارنة.

تختلف موجتا النشر أيضًا بطريقة تشير إلى التكرار. فقد أطلق الكود السابق اسم ملف الحمولة الخاص به. setup.js وتم إدراج خمسة مضيفين للتسليم؛ الملف الحالي مسمى _polyfill.js ويسرد ثلاثة. كان الإصدار السابق يزيل الملف المحذوف بعد خمس ثوانٍ من التشغيل، تاركًا العملية قيد التشغيل من عقدة بيانات محذوفة؛ أما الإصدار الحالي فلا يفعل ذلك. غير المشار إليه lib/telemetry.js لا تزال موجودة في ملف القطران عبر كليهما، ولا تزال تُشحن، ولم تعد موصولة بالأسلاك.

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

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

إن النتيجة العملية لتفعيل وقت الاستيراد ضيقة وتستحق الذكر بشكل منفصل. npm install --ignore-scripts يمنع هذا الإجراء تشغيل نصوص دورة حياة التطبيق، وهي نصيحة سليمة. لكنه لا يؤثر هنا، لأن هذا الكود لا يستخدم نص دورة حياة. يتم تشغيل الحمولة عندما يستورد كود التطبيق، أو تشغيل الاختبار، أو أداة التجميع، أو أداة التدقيق اللغوي الوحدة النمطية أولاً. في بيئة التكامل المستمر التي تُثبّت ثم تُنشئ مباشرةً، يفصل بين العمليتين ثوانٍ معدودة.

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

  • نقطة دخول الوحدة التي تكون عبارتها النهائية هي حاول { استدعاء(“./x”); } catch (_) {} حول ملف ليس جزءًا من واجهة برمجة التطبيقات المصدرة. تستورد الحزمة التي تحتوي على مكتبة polyfill أصلية هذه المكتبة في بداية الملف وتستخدم نتيجتها. أما تجاهل كل خطأ ناتج عن استيرادها في نهاية الملف فلا يُعدّ معالجة للأخطاء.
  • سلاسل المضيف التي تم تجميعها بواسطة .ينضم("") من مجموعة من الأجزاء. لا يوجد سبب في الكود السليم لتقسيم اسم المضيف عبر عناصر المصفوفة.
  • حزمةٌ تكون تبعياتها المعلنة فارغة، ولكنها تسعى إلى HTTPS, DNSو عملية الطفل عند وقت الاستيراد. إن عملية الاسترجاع بالإضافة إلى التنفيذ في حزمة تُعلن عن مكون واجهة المستخدم هي النتيجة الكاملة.
  • أرقام الإصدارات غير متوافقة مع عمر الحزمة. إن الاسم الذي نُشر لأول مرة قبل أيام في إصدار رئيسي مكون من رقمين، دون أي إصدارات وسيطة، يصف شيئًا آخر غير عملية تطويره.
  • يكتب إلى / فار / tmp or ٪مؤقت٪ تليها شمود حتى الساعة 07:55 ونقطة تفرع منفصلة. التسلسل قصير ومنظم ونادراً ما يكون حميداً معاً.

توجد على أنظمة ويندوز طريقتان للتحقق من البيانات بتكلفة منخفضة وموثوقية عالية. تتمثل البيانات المتبقية في سلاسل نصية ثابتة، ولا مكان لأي منها على نظام نظيف: مهمة مجدولة في \Microsoft\Windows\Multimedia\SystemSoundsService، قيمة مفتاح التشغيل المسماة خدمة أصوات النظام، وملف تنفيذي بهذا الاسم بموجب %APPDATA%\Microsoft\Windows\Themes\لا توجد خدمة الصوت الأصلية لنظام ويندوز في أي من هذه المواقع. ثانيًا، يستخدم برنامج التحميل قفلًا متبادلًا ثابتًا لنسخة واحدة. Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}وجوده على المضيف هو مؤشر، ولأن المحمل يتعامل مع mutex الموجود على أنه "قيد التشغيل بالفعل"، فإن إنشاءه مسبقًا هو تلقيح قصير المدى قابل للتطبيق أثناء جدولة المعالجة.

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

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

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

مراجع حسابات

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

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

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