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

الاهتمام الغامض بسلسلة التوريد لحزمة npm ذات عرض السلسلة

تم النشر بتاريخ 2024-11-07
تصفح:698

تبدأ هذه القصة عندما لاحظ سيباستيان لوربر، مشرف Docusaurus، مشروع التوثيق مفتوح المصدر القائم على React، تغييرًا في طلب السحب في بيان الحزمة. إليك التغيير المقترح على حزمة cliui npm الشهيرة:

The mysterious supply chain concern of string-width-cjs npm package
على وجه التحديد، لفت انتباهنا إلى تغيير تبعيات npm التي تستخدم بناء جملة غير مألوف:


  "dependencies": {
    "string-width": "^5.1.2",
    "string-width-cjs": "npm:string-width@^4.2.0",
    "strip-ansi": "^7.0.1",
    "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
    "wrap-ansi": "^8.1.0",
    "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"


يتوقع معظم المطورين رؤية نطاق إصدار سيمفر في قيمة الحزمة أو ربما عنوان URL الخاص بـ Git أو الملف. ومع ذلك، في هذه الحالة، هناك صيغة npm خاصة: بادئة. ماذا يعني ذلك؟

ما هو الاسم المستعار لحزمة npm؟

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

لذا، في حالة التغيير المقترح في طلب السحب هذا، سيتم حل حزمة string-width-cjs مع عرض سلسلة الحزمة في الإصدارات ^4.2.0. هذا يعني أنه سيكون هناك إدخال دليل العقدة لـ string-width-cjs ولكن مع محتويات string-width@^4.2.0 والسلوك المماثل في ملف القفل (package-lock.json).

الاسم المستعار للحزمة هو إحدى ميزات مدير الحزم npm التي يمكن استخدامها في حالات مثل دعم ESM مقابل CJS.

مع ذلك، يمكن إساءة استخدام الأسماء المستعارة للحزمة. في مقال وكشف أمني يعود تاريخهما إلى عام 2021، أوضح نيشانت جاين، سفير Snyk، كيف يمكن خداع سجل npmjs الرسمي لتضليل معلومات التبعية بناءً على الأسماء المستعارة للحزمة كجزء من ارتباك التبعية والمخاوف الأمنية لسلسلة التوريد.

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

العثور على سلوك مشبوه في ملفات قفل npm فيما يتعلق بالوحدات الضارة

لفحص طلب السحب، استخدم سيباستيان ملف القفل. تتحقق هذه الأداة من ملفات القفل مثل package-lock.json أو Yarn.lock بحثًا عن علامات التلاعب، مما يضمن عدم إدخال الحزم الضارة بدلاً من حزمة npm الأصلية.

أظهر تشغيل الأداة التحذيرات التالية:


npx lockfile-lint --path package-lock.json --allowed-hosts yarn npm --validate-https --validate-package-names

detected resolved URL for package with a different name: string-width-cjs
    expected: string-width-cjs
    actual: string-width

detected resolved URL for package with a different name: strip-ansi-cjs
    expected: strip-ansi-cjs
    actual: strip-ansi

detected resolved URL for package with a different name: wrap-ansi-cjs
    expected: wrap-ansi-cjs
    actual: wrap-ansi

 ✖ Error: security issues detected!



إخلاء المسؤولية: lockfile-lint هي أداة قمت بتطويرها في عام 2019 بعد منشوري الذي كشف عن المخاوف الأمنية المتعلقة بملفات القفل: لماذا يمكن أن تكون ملفات npm lockfiles نقطة أمنية عمياء لحقن الوحدات النمطية الضارة ].

تنبيه عالي: الحزم الشائعة تبدو متشابهة على npm

بالنظر إلى نتائج lockfile-lint المذكورة أعلاه، بحث سيباستيان عن أسماء الحزم هذه على npm ووجد بشكل مدهش أن هذه موجودة في سجل npm العام:

  • https://www.npmjs.com/package/string-width-cjs
  • https://www.npmjs.com/package/strip-ansi-cjs
  • https://www.npmjs.com/package/wrap-ansi-cjs

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

بالنظر إلى حزمة npm strip-ansi-cjs، لا يوجد ملف README أو مستودع كود المصدر. ومع ذلك، هناك العديد من الحزم المشروعة والشائعة التي تشير إلى نفس السلوك.

في الواقع، هذه الحزمة بالذات تحظى بشعبية كبيرة، كما يمكننا أن نرى من خلال 529 تابعًا لها (الحزم الأخرى التي تعتمد على هذه الحزمة) و7274 تنزيلًا أسبوعيًا.

The mysterious supply chain concern of string-width-cjs npm package
بالنظر إلى الكود الخاص بـ strip-ansi-cjs، يظهر أنه لا يوجد سوى ملف واحد في هذه الحزمة، وهو ملف package.json الواضح.

لذا، لماذا تحصل الحزمة التي لا تفعل أي شيء على الكثير من التنزيلات، ولماذا تعتمد عليها العديد من الحزم الأخرى؟

The mysterious supply chain concern of string-width-cjs npm package
دعونا نتفحص مؤلف حزم npm هذه.

جميع الحزم الثلاث مملوكة لشركة Himanshutester002، وتم نشر جميع حزمها العام الماضي بأرقام إصدار برمجية. بعض الملاحظات المثيرة للاهتمام التي يجب ذكرها:

  • من المحتمل أن تكون حزمة isaacs-cliui npm محاولة سقاطة مطبعية على شوكة Isaac الخاصة لمشروع cliui وحزمة npm المشروعة ضمن مساحة الاسم الخاصة بها: @isaacs/cliui.
  • من المحتمل أن تكون حزمة azure-sdk-for-net npm محاولة لحملة ارتباك التبعية لمهاجمة الحزم الخاصة التي تحمل الاسم نفسه.
  • تستقر حزمة Link-deep npm على قدرة شائعة تتعلق بحزم الأدوات المساعدة مثل lodash وغيرها.

The mysterious supply chain concern of string-width-cjs npm package
يمكنك أيضًا ملاحظة أن المستخدم hisanshutester002 ليس لديه معلومات تعريفية في صفحة ملف تعريف المستخدم هذه على npmjs.

لقد لاحظنا سابقًا أن حزمة strip-ansi-cjs npm تحتوي على أكثر من 500 حزمة أخرى تستخدمها، وبالتالي، من المحتمل أن يكون ذلك مؤشرًا إيجابيًا على الشعبية. دعونا ننظر إليهم:

The mysterious supply chain concern of string-width-cjs npm package
قد يبدو هذا ذا مصداقية بسبب إدراجه في القائمة، ولكن هل هو كذلك بالفعل؟
على سبيل المثال، أسماء مثل clazz-transformer أو React-Native-multiply أو ربما gh-monoproject-cli تبدو مشروعة، لكن هل هي كذلك؟

إليك صفحة حزمة npm المتفاعلة الأصلية:

The mysterious supply chain concern of string-width-cjs npm package
لا تحتوي هذه الحزمة على أي تنزيلات تقريبًا، ومؤلفها هو مستخدم npm مجهول بدون معلومات تعريفية. مستودع عنوان URL المصدر الذي تعيد هذه الحزمة التوجيه إليه هو https://github[.]com/hasandader/react-native-multiply غير الموجود. يبدو أيضًا ملف تعريف مستخدم GitHub مريبًا للغاية ويفتقر إلى النشاط العملي.

بينما تبدو حزمة npm وكأنها تحتوي على كود مصدر، فإن نظرة فاحصة تكشف أنها عينة كود تم إنشاؤها لنموذج أولي لتطبيق "hello World".

The mysterious supply chain concern of string-width-cjs npm package
عليك أيضًا أن تتساءل، إذا كانت هذه الحزمة مجرد مكتبة ضرب، فلماذا تحتاج إلى 776 تبعية للقيام بما يلي:


import { multiply } from 'react-native-multiply';
const result = await multiply(3, 7);


بينما يمزح البعض حول مساهمة JavaScript في شجرة فلكية من الحزم المتداخلة من خلال الاستخدام المفرط للتبعيات، فإن المشروع الذي يحتوي على 776 تبعية مباشرة يعد كبيرًا بشكل غير معقول.

من بين كل هذه التبعيات، توجد حزم npm الثلاثة المشبوهة التي بدأت بها قصتنا: string-width-cjs، و strip-ansi-cjs، و Wrap-ansi-cjs:

The mysterious supply chain concern of string-width-cjs npm package
لقد ذكرنا أن إحدى تبعيات strip-ansi-cjs كانت تسمى clazz-transformer. لننظر إلى الأمر:

The mysterious supply chain concern of string-width-cjs npm package
دعونا نشرح ما يحدث هنا. تمت تسمية محول clazz-transformer لحزمة npm بشكل خاطئ عن عمد باستخدام محول فئة العنوان في صفحة README الخاصة به. بالإضافة إلى ذلك، فإن مستودع التعليمات البرمجية المصدر الخاص به، https://github[.]com/typestack/class-transformer، لا يرتبط باسم الحزمة، مما يثير مخاوف بشأن شرعيتها.

يحتوي محول typstack/class-transformer الخاص بالمستودع على GitHub على ملف package.json كما يلي:

The mysterious supply chain concern of string-width-cjs npm package
لا يُظهر ملف package.json الموجود على GitHub أي إعلان عن التبعيات، ولكن إذا فحصنا الكود المصدري للحزمة الفعلية على npmjs، فسنرى التبعيات الـ 437 التي تم حزم محول clazz بها. مرة أخرى، قاموا بتجميع حزم *-cjs الثلاث المشبوهة بشكل ملائم جدًا:

The mysterious supply chain concern of string-width-cjs npm package

مزيد من الأفكار حول نتائج حزمة npm المشبوهة

قبل أن نستخلص المزيد من الاستنتاجات، من المهم أن نذكر بعض سمات حزم npm التي لاحظناها أعلاه:

  • يبدو أن حزم React Native مشتقة من أداة إنشاء المكتبة الأصلية والتفاعلية. تتميز هذه الأداة أيضًا بمثال دالة الضرب الافتراضية كجزء من كود مصدر المخزون الذي تم إنشاؤه لمشروع جديد.
  • تحتوي الحزم على بنيات دليل وملف وتبعيات يمكن اشتقاقها من النموذج الأساسي لـ Next.js 14، مثل تلك التي تم إنشاؤها باستخدام npx create-next-app@14.

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

إن العثور على بعض ملفات Tea.yaml في الحزم المذكورة يدعم أيضًا الفرضية القائلة بأن جزءًا من غرض هذه الحملة هو استخراج رموز الشاي من خلال إساءة استخدام الشاي.

في وقت سابق من هذا العام، في 14 أبريل 2024، نشر أحد مستخدمي منتدى الشاي تعليقًا يدعم بشكل أكبر القلق بشأن إساءة استخدام الشاي:

The mysterious supply chain concern of string-width-cjs npm package
قبل أن أتوصل إلى أفكار ختامية، أود أن أشكر سيباستيان لوربر بصدق على عقليته الحذرة في مجال الصيانة وعلى مساعدته في الكشف عن خيوط الهجوم المحتمل على سلسلة توريد npm.

ما الذي يحدث مع string-width-cjs؟

في هذه المرحلة، لدي ثقة عالية في أنني أستطيع الاستمرار في إحداث ثغرات في بقية الحزم التي من المفترض أن تعتمد على string-width-cjs للعثور على مؤشرات مشكوك فيها للغاية للشرعية الحقيقية.

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

لمساعدتك على البقاء آمنًا أثناء العمل مع البرامج مفتوحة المصدر، أوصي بشدة باعتماد ممارسات الأمان وعلى وجه التحديد هذه الموارد التعليمية للمتابعة:

  • لماذا يمكن أن تكون ملفات قفل npm بمثابة نقطة أمنية عمياء لحقن الوحدات النمطية الضارة
  • أفضل ممارسات الأمان في الدقيقة 10
  • أمان NPM: منع هجمات سلسلة التوريد

هل اكتشفنا حملة أمنية لسلسلة التوريد وسط اللعب الخبيث، أم أن الأمر كله يتعلق بمسار الأموال وبالتالي يمكن أن يُعزى إلى البريد العشوائي وإساءة استخدام السجلات العامة مثل npm وGitHub لاستخراج رموز الشاي؟

]

مهما حدث، كن يقظًا.

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/snyk/the-mysterious-supply-chain-concern-of-string-width-cjs-npm-package-j96?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ Study_golang @163.com حذف
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3