چطور از NPM Audit استفاده کنیم؟

سلام! زمانی که پروژه هامون رو با کمک npm یا yarn ایجاد میکنیم، تعداد زیادی dependency برای پروژه مون ایجاد میشه که برای build گرفتن یا در زمان runtime به اون ها احتیاج داریم. تو این مقاله میخوایم ببینیم چطور میتونیم تا جای ممکن درصد ریسک و آسیب پذیری رو بیاریم پایین.وضع خرابهدستور Npm auditهر موقع که شما دستور `npm install` رو میزنید در انتهای کار به صورت خودکار دستور audit هم اجرا میشه که در واقع نسخه پکیج هایی که نصب کرده رو با نسخه همون پکیج در npm public registry که حاوی لیست آسیب پذیری ها میشه مقایسه میکنه و اگر نسخه نصب شده شما یکی از نسخه هایی باشه که توش آسیب پذیری گزارش شده باشه به شما گزارش میده.خیلی big deal نیست عموما ولی بهتره سعی کنید این موارد رو برطرف کنید، بعضی هاشون میتونن واقعا خطرناک باشن.این آسیب پذیری ها میتونه بعدا پروژه تون (مخصوصا وب-اپ ها) مشکل ایجاد کنه. البته صادقانه من تابحال مشکلی نداشتم ولی پیشگیری بهتر از درمانه.میتونید این دستور رو تنها هم به این شکل اجرا کنید:npm audit // or yarn auditچندتا نمونه از گزارشی که میده ببینیم:مثلا اینجا گفته شده که این مشکل تو ورژن 5.1.2 حل شده که این نشونه خوبیهاین آسیب پذیری ها میتونن درجات مختلفی داشته باشند (که البته با رنگ های مختلف مشخص میشه)بحرانی - Criticalبا الویت بالا - Highمتوسط - Moderateکم - Lowمیتونید از قسمت More info در مورد این آسیب پذیری بیشتر بدونیدتوی آدرسی که خودش داده میتونید اطلاعات نسبتا کاملی در مورد مشکلی که گزارش داده به دست بیارید: https://github.com/advisories/GHSA-6fc8-4gx4-v693 اینجا میتونید لیست بلند بالایی از همه آسیب پذیری های شناخته شده NPM پیدا کنید: https://github.com/advisories?query=ecosystem%3Anpm مشکلاتخب سوالی که پیش میاد اینه که این آسیب پذیری ها چقدر جدی هستند؟ npm به صورت built-in از بعد از ورژن ۶ قابلیت audit کردن رو اضافه کرد که همین میتونه گواهی باشه بر اهمیت اینکار.تصور کنید توی یک کتابخونه مثل url-parser یک مشکل امنیتی وجود داشته باشه و بعد از deploy کردن پروژه، خرابکار بتونه از همین طریق به سیستم client نفوذ کنه. شما اینو نمیخواید!علاوه بر این، اگر با کارفرمای خارجی کار کنید احتمال زیاد یکی از requirement های اصلی پروژه همین خواهد بود.راه حلیک راه حل خیلی ساده که خود npm و yarn در اختیار ما قرار میدن استفاده از دستون npm audit fix یا yarn audit fix هست. که تا جای ممکن پکیج هایی که آسیب پذیری هاشون رو patch کردند آپگرید میکنه.یعنی ممکنه بعضی کتابخونه ها که breaking change دارند که احتمالا باعث خراب شدن کل کار بشه رو تغییری نمیده. مگر اینکه با force-- اجرا بشه که البته بعد از انجام اینکار حتما باید تست کنید که همه چیز درست کار کنه.البته این راه حل نهایی نیست و برای حل تمام آسیب پذیری های کد تون بهتره از راه حل های third party استفاده کنید که جلوتر بهشون اشاره میکنم.بعضی وقت ها هم هست که حتی بعد از اجرای این دستورات کاری از دست خودش بر نمیاد و میگه که باید دستی نسخه ها رو آپدیت کنید:و برای مثال این پکیج هنوز نسخه ای برای patch ارائه نداده:البته خیلی مشکلش جدی نیستدر این صورت تقریبا کاری از شما بر نمیاد.حل مشکل با Resolutionsقطعا بعد از اجرای npm audit fix همه ی آسیب پذیری ها حل نمیشن و باید خودتون دست به کار بشید. مشکل اینجاست که اکثر این پکیج هایی که به شما گزارش میده، پکیج های dependency از dependency های دیگه هستن.به عنوان مثال اگر قسمت Path توی عکس های بالا رو ببینید میتونید این سلسله مراتب رو ببینید.پکیجی که مورد داره ansi-html هست که خودش dependency پکیج @pmmmwh/react-refresh-webpack-plugin هست که خودش dependency پکیج react-scripts هست که تازه این پکیج میشه dependency اصلی پروژه شما.تازه ممکنه پکیج های دیگه ای هم نصب باشن که به این پکیج وابستگی(Dependency) داشته باشن.پس اینجا میتونیم متوجه بشیم که اگر npm یا yarn اون رو برای ما حل نکنه ما راه سختی برای حل کردنش پیش رومون داریم.فرض می‌کنیم که شما به هر قیمتی شده میخواید تعداد آسیب پذیری ها رو به کمترین حد ممکن برسونید. خب چیکار باید بکنیم؟داخل فایل package.json یک کلید اضافه کنید به نام resolutions شبیه این میشه:فایلی که من اینجا نشون دادم فایل مینیمال هست شما فقط کلید زرولوشن رو در نظر بگیریدکاری که انجام میده این هست که زمان نصب dependency ها اگر به این پکیج ها بر بخوره نسخه ای که شما اینجا گفتید رو نصب میکنه که باعث میشه مشکل حل بشه.ولی این قابلیت فقط برای yarn به صورت built-in کار میکنه و توسط npm پشتیبانی نمیشه.خب برای اون هم راه حل وجود داره که از دو طریق میتونید انجامش بدید:توی قسمت scripts فایل package.json چیزی که میبینید رو بنویسید.راه دوم هم اینه که بعد از هر بار نصب همون دستوری که نوشته شده:npx npm-force-resolutionsرو دستی اجرا کنید یا بزارید تو یک فایل shell که اجرا بشه و الی آخر...احتمالا بعد از این کار ها تعداد آسیب پذیری هایی که npm و yarn بهتون نشون میده کمتر میشه یا حتی به ۰ میرسه ولی این پایان قصه نیست. شرکت ها و بیزنس های زیادی هستند که به صورت تخصصی توی همین زمینه کار میکنن که سرویس گرفتن ازشون خالی از لطف نیست، البته تمام این چیز ها که گفتم زمانی معنی پیدا میکنه که کاربرای شما واقعا به اندازه ای باشند که ارزش هزینه کردن زمان و پول رو داشته باشه.بعضی از این سرویس ها: https://snyk.io/ https://wazuh.com/ اولی امکانات خیلی خوبی ارائه میدهحسان ام و موفق باشید.