تبدأ هذه القصة عندما لاحظ سيباستيان لوربر، مشرف Docusaurus، مشروع التوثيق مفتوح المصدر القائم على React، تغييرًا في طلب السحب في بيان الحزمة. إليك التغيير المقترح على حزمة cliui npm الشهيرة:
على وجه التحديد، لفت انتباهنا إلى تغيير تبعيات 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 الرسمي لتضليل معلومات التبعية بناءً على الأسماء المستعارة للحزمة كجزء من ارتباك التبعية والمخاوف الأمنية لسلسلة التوريد.
كان طلب السحب سليمًا ولم يكن هناك خطر وقوع هجوم على سلسلة التوريد. ومع ذلك، أدى قلق سيباستيان بشأن اسم الحزمة إلى اكتشاف مخاطر أمنية محتملة.
لفحص طلب السحب، استخدم سيباستيان ملف القفل. تتحقق هذه الأداة من ملفات القفل مثل 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 نقطة أمنية عمياء لحقن الوحدات النمطية الضارة ].
بالنظر إلى نتائج lockfile-lint المذكورة أعلاه، بحث سيباستيان عن أسماء الحزم هذه على npm ووجد بشكل مدهش أن هذه موجودة في سجل npm العام:
لاحظ سيباستيان أن أسماء الحزم هذه ليست موجودة فقط في npm، ولكنها تظهر أيضًا خصائص مشبوهة. لم تكن الحزم مرتبطة بمستودع كود مصدر عام، وكانت خالية من أي كود فعلي عند فحصها، وتم نشرها بشكل مجهول دون أي معلومات شخصية مرتبطة بها.
بالنظر إلى حزمة npm strip-ansi-cjs، لا يوجد ملف README أو مستودع كود المصدر. ومع ذلك، هناك العديد من الحزم المشروعة والشائعة التي تشير إلى نفس السلوك.
في الواقع، هذه الحزمة بالذات تحظى بشعبية كبيرة، كما يمكننا أن نرى من خلال 529 تابعًا لها (الحزم الأخرى التي تعتمد على هذه الحزمة) و7274 تنزيلًا أسبوعيًا.
بالنظر إلى الكود الخاص بـ strip-ansi-cjs، يظهر أنه لا يوجد سوى ملف واحد في هذه الحزمة، وهو ملف package.json الواضح.
لذا، لماذا تحصل الحزمة التي لا تفعل أي شيء على الكثير من التنزيلات، ولماذا تعتمد عليها العديد من الحزم الأخرى؟
دعونا نتفحص مؤلف حزم npm هذه.
جميع الحزم الثلاث مملوكة لشركة Himanshutester002، وتم نشر جميع حزمها العام الماضي بأرقام إصدار برمجية. بعض الملاحظات المثيرة للاهتمام التي يجب ذكرها:
يمكنك أيضًا ملاحظة أن المستخدم hisanshutester002 ليس لديه معلومات تعريفية في صفحة ملف تعريف المستخدم هذه على npmjs.
لقد لاحظنا سابقًا أن حزمة strip-ansi-cjs npm تحتوي على أكثر من 500 حزمة أخرى تستخدمها، وبالتالي، من المحتمل أن يكون ذلك مؤشرًا إيجابيًا على الشعبية. دعونا ننظر إليهم:
قد يبدو هذا ذا مصداقية بسبب إدراجه في القائمة، ولكن هل هو كذلك بالفعل؟
على سبيل المثال، أسماء مثل clazz-transformer أو React-Native-multiply أو ربما gh-monoproject-cli تبدو مشروعة، لكن هل هي كذلك؟
إليك صفحة حزمة npm المتفاعلة الأصلية:
لا تحتوي هذه الحزمة على أي تنزيلات تقريبًا، ومؤلفها هو مستخدم npm مجهول بدون معلومات تعريفية. مستودع عنوان URL المصدر الذي تعيد هذه الحزمة التوجيه إليه هو https://github[.]com/hasandader/react-native-multiply غير الموجود. يبدو أيضًا ملف تعريف مستخدم GitHub مريبًا للغاية ويفتقر إلى النشاط العملي.
بينما تبدو حزمة npm وكأنها تحتوي على كود مصدر، فإن نظرة فاحصة تكشف أنها عينة كود تم إنشاؤها لنموذج أولي لتطبيق "hello World".
عليك أيضًا أن تتساءل، إذا كانت هذه الحزمة مجرد مكتبة ضرب، فلماذا تحتاج إلى 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:
لقد ذكرنا أن إحدى تبعيات strip-ansi-cjs كانت تسمى clazz-transformer. لننظر إلى الأمر:
دعونا نشرح ما يحدث هنا. تمت تسمية محول clazz-transformer لحزمة npm بشكل خاطئ عن عمد باستخدام محول فئة العنوان في صفحة README الخاصة به. بالإضافة إلى ذلك، فإن مستودع التعليمات البرمجية المصدر الخاص به، https://github[.]com/typestack/class-transformer، لا يرتبط باسم الحزمة، مما يثير مخاوف بشأن شرعيتها.
يحتوي محول typstack/class-transformer الخاص بالمستودع على GitHub على ملف package.json كما يلي:
لا يُظهر ملف package.json الموجود على GitHub أي إعلان عن التبعيات، ولكن إذا فحصنا الكود المصدري للحزمة الفعلية على npmjs، فسنرى التبعيات الـ 437 التي تم حزم محول clazz بها. مرة أخرى، قاموا بتجميع حزم *-cjs الثلاث المشبوهة بشكل ملائم جدًا:
قبل أن نستخلص المزيد من الاستنتاجات، من المهم أن نذكر بعض سمات حزم npm التي لاحظناها أعلاه:
لقد حدد أقراننا في Sonatype سابقًا حالات مماثلة لإغراق السجلات مفتوحة المصدر بالحزم. في هذه الحالات، كان الهدف النهائي هو أن يكافئ المطورون أنفسهم برموز الشاي، وهي عبارة عن منصة Web3 لتحقيق الدخل من البرامج مفتوحة المصدر.
إن العثور على بعض ملفات Tea.yaml في الحزم المذكورة يدعم أيضًا الفرضية القائلة بأن جزءًا من غرض هذه الحملة هو استخراج رموز الشاي من خلال إساءة استخدام الشاي.
في وقت سابق من هذا العام، في 14 أبريل 2024، نشر أحد مستخدمي منتدى الشاي تعليقًا يدعم بشكل أكبر القلق بشأن إساءة استخدام الشاي:
قبل أن أتوصل إلى أفكار ختامية، أود أن أشكر سيباستيان لوربر بصدق على عقليته الحذرة في مجال الصيانة وعلى مساعدته في الكشف عن خيوط الهجوم المحتمل على سلسلة توريد npm.
في هذه المرحلة، لدي ثقة عالية في أنني أستطيع الاستمرار في إحداث ثغرات في بقية الحزم التي من المفترض أن تعتمد على string-width-cjs للعثور على مؤشرات مشكوك فيها للغاية للشرعية الحقيقية.
من المفترض أن كل هذه الحزم التابعة وتعزيزات التنزيل تؤدي إلى الغرض الوحيد المتمثل في خلق شرعية زائفة لحزم 3 * -cjs بحيث في الوقت المناسب، مع وجود الضحية المناسبة، ستظهر هذه الحزم المزيفة يتم تثبيته ثم يتبعه إصدار ضار جديد.
لمساعدتك على البقاء آمنًا أثناء العمل مع البرامج مفتوحة المصدر، أوصي بشدة باعتماد ممارسات الأمان وعلى وجه التحديد هذه الموارد التعليمية للمتابعة:
هل اكتشفنا حملة أمنية لسلسلة التوريد وسط اللعب الخبيث، أم أن الأمر كله يتعلق بمسار الأموال وبالتالي يمكن أن يُعزى إلى البريد العشوائي وإساءة استخدام السجلات العامة مثل npm وGitHub لاستخراج رموز الشاي؟
]مهما حدث، كن يقظًا.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3