12 أشياء غريبة يمكن أن تحدث بعد تثبيت حزمة npm

قبل شهرين بدأت مشروعًا يسمى الحزم الخبيثة (ويعرف أيضًا باسم "الحزم الخبيثة"). يراقب التحديثات في مستودع npm ، ويقوم بتنزيل جميع الوحدات الجديدة ، ثم يقوم بفحصها بحثًا عن القمل - يبحث عن نشاط الشبكة ، والعمليات المشبوهة باستخدام نظام الملفات ، إلخ. غالبًا ما يكون للمشاريع الصغيرة الموجودة على node.js شجرة تبعية كبيرة ، وليس لدى المطورين فعليًا وسيلة لاختبارها جميعًا. هذا يعطي المهاجمين نطاقًا كبيرًا للمناورة ، ويثور السؤال - ما هو مقدار السجل السيئ الذي يختبئ في الزوايا المظلمة لسجل npm؟ 180،000 حزم فحصها في وقت لاحق ، حصلت على إجابة تقريبية.


الصورة


وهذا الجواب - ربما ليس كثيرا.
[ملحوظة: في المتوسط ​​، هناك نسخة إنجليزية من هذه المقالة ، وأيضًا من تأليفي]


ما الذي يمكن أن تفعله حزمة npm مع نظامك؟


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


تسمح البرامج النصية NPM للحزم بتنفيذ أوامر عشوائية في وقت التثبيت وإلغاء التثبيت. يتضمن ذلك preinstall ، preinstall ، preinstall ، preinstall ، install postuninstall ، والتي يتم تنفيذها تلقائيًا بواسطة npm في اللحظة المناسبة من دورة حياة الحزمة. ما الذي يمكنهم فعله؟ كل ما يمكن للمستخدم الحالي القيام به - على سبيل المثال ، حذف جميع صورك من العطلة الأخيرة ، أو دمج سجل المتصفح في مكتب التحقيقات الفيدرالي (على الرغم من أنه على الأرجح ، لديهم بالفعل). يمكن تعطيل هذا السلوك عن طريق تمرير علامة --ignore-scripts ، ولكن أولاً ، لا أحد يفعل ذلك ، وثانياً ، بهذه الطريقة يمكنك كسر مجموعة من الحزم الموثوقة للغاية. من خلال البرامج النصية ، تم تنفيذ الهجوم المثير على ESLint ، مما أثر على مستخدمي نطاق eslint (6 مليون منشأة أسبوعيًا) و eslint-config-eslint (ألفي منشأة في الأسبوع).


تحصل الحزمة على فرصة ثانية لتعقيد حياتك أثناء التهيئة (عادةً ما تحدث عند الاتصال الأول المطلوب). الآن لديه الفرصة لتعديل المتغيرات العامة والحزم الأخرى ، على سبيل المثال ، لسرقة المفتاح الخاص من محفظة crypto.randomBytes الخاصة بك ، أو لجعل طريقة crypto.randomBytes غير عشوائية .


الصورة


كم عدد الحزم الخبيثة التي تم اكتشافها؟


حسنًا ، لا يمكن تسمية القائمة بالإعجاب ، حيث تم العثور على 3 حزم تم إزالتها من مستودع npm بجهود فريق أمان npm . دعنا نذهب أكثر من ذلك:


  • Commander-js يحاول إخفاء نفسه على أنه postinstall الحقيقي (وهو https://www.npmjs.com/package/commander ) ، ولكنه يحتوي على تفاصيل غير معتادة ، وهي برنامج نصي postinstall التنزيل يقوم بتنزيل وتشغيل محتويات http://23.94.46.191/ update.json (في وقت النشر لا يحتوي على أي شيء جنائي). الاستشارات الأمنية: https://www.npmjs.com/advisories/763 .
  • يقوم rrgod ، من خلال جميع البرامج النصية نفسها ، بتنزيل وتنفيذ البرنامج النصي من http://static.ricterz.me ، والذي بدوره يحاول تحميل برنامج نصي آخر غير متوفر حاليًا. الاستشارات الأمنية: https://www.npmjs.com/advisories/764 .
  • لا يمكن استدعاء partfatty12 ضارًا تمامًا ، ولكن الطريقة التي يجمع بها المؤلف إحصائيات حول إعدادات بنات أفكاره هي أمر مشكوك فيه للغاية - هذا هو إرسال مفتاح ssh العام ( ~/.ssh/id_rsa.pub ) إلى خادم غير متاح حاليًا. الاستشارات الأمنية: https://www.npmjs.com/advisories/765 .

على الرغم من النتائج المتواضعة للغاية ، في عملية تحليل جميع الحزم المشبوهة (ونظرت إلى أكثر من 3000 تقرير للعثور على هذه اللؤلؤات الثلاثة) ، تم العثور على الكثير من الأشياء المضحكة وليس الأشياء التي لا تفكر بها عادة (أو تحاول بعناية عدم التفكير) عن طريق كتابة npm install . لذلك ، دعونا نتخيل أنك قمت عن طريق الخطأ بتحديد إحدى الحزم العديدة من المستودع وتثبيته. ما يمكن أن يحدث الخطأ؟


1. يمكن للحزمة تجاوز الأساليب في الحزم الأخرى (بما في ذلك تلك الواردة من التسليم القياسي لـ Node.js)


ومع ذلك ، إذا كنت قد قرأت بضع فقرات سابقة أو كنت تعمل مع نظام جافا سكريبت البيئي لأكثر من أسبوع ، فمن غير المرجح أن يكون هذا بمثابة أخبار لك. لكن حجم هذه الكارثة قد ينزلق بعيدًا عنك. لذلك ، إذا كان لدى مشروعك بعض التبعيات على الأقل ، فمن الأرجح أن طريقة fs.closeSync التي تجاوزتها بالفعل (وربما أكثر من مرة). يقوم عدد كبير من الحزم بتعديل واجهة برمجة التطبيقات الخاصة بشخص آخر ، لكن القليل منها فقط لديه سبب وجيه لذلك على الأقل. من بين "الأبطال" رشيقة مع 12 مليون منشأة في الأسبوع ، والتي تعيد تعريف العشرات من الأساليب من خ م . تجدر الإشارة أيضًا إلى المستمع المتزامن ، الذي يتخطى 46 طريقة مختلفة ، بما في ذلك crypto.randomBytes المشؤومة ، والتي أزعجتني بعض الشيء عندما اكتشفت ذلك لأول مرة.


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


2. قد تحدد الحزمة واجهة برمجة التطبيقات التي تم تغييرها لإجراء تصحيحات إضافية عليها


الصورة


نعم ، بعض الحزم تفعل ذلك (غالبًا فيما يتعلق بنفس graceful-fs ) باستخدام عجائب الألعاب البهلوانية مثل /graceful-fs/.test(fs.closeSync.toString()) . لذلك ، إذا واجهت فجأة مشاكل غير مفهومة في المكتبة القياسية ، فحاول فقط تثبيت بضع حزم npm عشوائية. أو قم فقط بإيقاف تشغيل الكمبيوتر والتنزه في أقرب حديقة ، فالحياة قصيرة جدًا لفهم كل هذا.


3. يمكنه إرسال التحليلات


لن يحميك Adblock في حالة حدوث أشياء في وحدة التحكم ، ويستخدمها مؤلفو بعض الحزم بنجاح. يرسل البعض المعلومات الأساسية ، مثل ecdsa-csr :


 // POST https://api.therootcompany.com/api/therootcompany.com/public/ping { "package":"ecdsa-csr", "version":"1.1.1", "node":"v10.14.2", "arch":"x64", "platform":"linux", "release":"4.9.125-linuxkit", "action":"install", "ppid":"eDSeYr9XUNRi9WhWli5smBNAvdw=" } 

البعض ليس خجولا جدا. هنا ، على سبيل المثال ، جزء من التقرير بدون خادم (الأصلي أكبر مرتين):


 // POST https://tracking.serverlessteam.com/v1/track { "userId":"0e32cba0-14ef-11e9-9f89-b7ed4ca5dbba", "event":"framework_stat", "properties":{ "version":2, "general":{ "userId":"0e32cba0-14ef-11e9-9f89-b7ed4ca5dbba", "context":"install", "timestamp":1547135257977, "timezone":"GMT+0000", "operatingSystem":"linux", "userAgent":"cli", "serverlessVersion":"1.35.1", "nodeJsVersion":"v10.14.2", "isDockerContainer":true, "isCISystem":false, "ciSystem":null } } } 

لحسن الحظ ، لا يُرسل jquery أي إحصائيات ، لذلك لا يزال بإمكانك تثبيته سراً من الجميع. في الوقت الحاضر.


4. يمكن استخدام جهاز الكمبيوتر الخاص بك بدلاً من خادم CI / CD


لماذا تقوم بترجمة الحزمة الخاصة بك إذا كان يمكن للمستخدمين القيام بذلك أثناء التثبيت ؟ يمكنك الحصول على إنجاز إضافي إذا قمت بتحديد الإصدار الرئيسي فقط من برنامج التحويل البرمجي المطلوب ، على سبيل المثال typescript@3 . أمل واحد للرجال المتعلمين من مايكروسوفت الذين يعرفون كيفية القيام الفصل الصحيح.


هل من الممكن أن تذهب أبعد من ذلك؟ بالطبع !


 "postinstall": "eslint --ext .js,.vue --fix src" 

يمكنك الآن النوم بهدوء - سيحصل جميع المستخدمين على مصادر منسقة تمامًا لحزمتك.


5. قد يحاول تخويفك.


الصورة


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


 { "name": "pizza-pasta", "author": "Zeavo", "scripts": { "install": "mkdir -p ~/Desktop/hacked && touch ~/Desktop/hacked/pwnddddd && wget https://imgur.com/download/KTDNt5I -P ~/Desktop/hacked/", "postinstall": "find ~/.ssh | xargs cat || true && printf '\n\n\n\n\n\nOH HEY LOOK SSH KEYS\n\n\n\nHappy Birthday! Youve been h4ck0red\n\n\n'" } } 

6. الحزمة يمكن تحميل وتنفيذ البرامج النصية باش


هل سمعت أن curl|bash ليست فكرة جيدة ؟ إذا لم يكن الأمر كذلك ، فقد تكون موظف ORESoftware لديه مجموعة كاملة من الحزم مع خطوط مماثلة في برنامج نصي postinstall :


 curl --silent -o- https://raw.githubusercontent.com/oresoftware/realpath/master/assets/install.sh | bash 

حتى الآن ، لا يوجد شيء جنائي في هذا السيناريو ... في الوقت الحالي. آمل أن يكون كل شخص لديه حق الوصول إلى master في oresoftware/realpath صادقين oresoftware/realpath للغاية.


7. قد تتم مطالبتك بكلمة مرور


جاء مؤلف كتاب magicleap بطريقة غير عادية لتوزيع حزمة خاصة من خلال مستودع عام. يتكون مشروعه من أرشيف مشفر وأدوات مساعدة لفك تشفيره - ولكن فقط إذا وضعت المفتاح الصحيح في MAGICLEAP البيئة MAGICLEAP :


 // : https://github.com/modulesio/magicleap/blob/master/decrypt.js var key = process.env['MAGICLEAP']; console.warn('Decrypting magicleap module with MAGICLEAP environment variable'); const ws = fs.createReadStream(path.join(__dirname, 'lib.zip.enc')) .pipe(crypto.createDecipher('aes-256-cbc', Buffer.from(key, 'base64'))) .pipe(fs.createWriteStream(path.join(__dirname, 'lib.zip'))); 

8. الحزمة قد التصحيح نفسها أثناء التثبيت


ليس لدى مؤلف القالب المزيف الوقت الكافي لفصل الاختبارات عن الكود الفوري ، خاصة وأن هذا سهل التنفيذ بإضافة تعليق خاص إلى نهاية سطور الاختبار:


 // : https://github.com/framp/fake-template/blob/master/index.js const template = (string, tag=defaultTag) => { if (mode !== 'literal') throw new Error('Invalid template') return (context={}) => tag(literals, ...expressions.map(evalInContext(context))) } assert.equal(template('')(), ``) // TEST assert.equal(template('abc')(), `abc`) // TEST const dog = 'Orlando' // TEST assert.equal(template('abc ${dog} lol ${cat}')({dog}), `abc ${dog} lol ${cat}`) // TEST 

ثم احذفها من خلال sed :


 "postinstall": "sed -i '/\\/\\/ TEST/d' index.js" 

بسيطة وأنيقة!


9. الحزمة قد تغير إعدادات npm


في رأيي المتواضع ، فإن package-json.lock شيء رائع يمكن أن ينقذ من مجموعة كاملة من المشاكل الناجمة عن إهمال المطورين الآخرين. ومع ذلك ، فإن بعض المعارضين لهذه الفكرة لديهم حجج جيدة ضد:


 "preinstall": "npm config set package-lock false" 

10. يمكنه تغيير خلفية سطح المكتب الخاص بك على صورة لـ Nicolas Cage


الصورة


هنا رابط ، فقط في حالة - https://www.npmjs.com/package/cage-js . ربما كان من المفيد تسجيل هذه الحزمة باعتبارها ضارة.


11. الحزمة يمكن لفة لك


هذا ما يفعله ember-data-response ، وفتح الفيديو الشهير أثناء التثبيت. لسوء الحظ ، لن يكون من الممكن نقل أي بيانات من Ember إلى React بمساعدتها - لا يوجد سطر واحد من شفرة javascript فيه.


12. قد لا يتم تثبيت ببساطة.


الصورة
التبعيات غير الموجودة ، الإصدارات المحددة بشكل غير صحيح ، المستودعات الخاصة التي غرقت في غياهب النسيان - لا يمكنك تثبيت حوالي 0.6 ٪ من جميع الحزم من مستودع npm.


بدلا من الاستنتاج


يمكن لحزم NPM القيام بأشياء غريبة مع نظامك ، وليس لديك العديد من الخيارات للحماية من ذلك. استخدم package-lock.json لتجنب التحديثات المفاجئة (وتأكد من عدم قيام أي شخص package-lock.json دون علمك) ، وقم بتكوين CSP على الواجهة الأمامية بحيث لا يتمكن backdoor في وحدة الطرف الثالث من دمج البيانات على الأقل مع مؤلفها. والنسخ الاحتياطي للصور الخاصة بك ، فقط في حالة.


إذا كنت تشعر أن لديك ما يكفي من القوة لتنغمس في عالم رائع من حزم npm - يمكنك العثور على جميع المصادر هنا: https://github.com/malicious-packages/core . الأداة مليئة بالقرصنة والحلول غير المثالية ، لكنها تتكيف مع مهمتها. يوجد أيضًا ملف تفريغ MongoDB في المستودع مع نتائج تحليل لأكثر من 180،000 حزمة ، والأهم من ذلك ، لا تنسَ إضافة عامل التصفية {'reports.status': 'unverified'} . لم أعد أخطط لتطوير هذا المشروع بسبب ضيق الوقت ، لكنني سأحاول المساعدة في جميع الأسئلة والمشاكل ، إن وجدت.


اعتن بنفسك وتطبيقاتك!

Source: https://habr.com/ru/post/ar436132/


All Articles