دستور npm audit
نیازمندیهای پروژه را از نظر آسیبپذیریِ امنیتی (security vulnerability) بررسی و ارزیابی میکند و اگر مشکلی وجود داشت، آن را گزارش میدهد. بعضی پکیجها آسیبپذیریهای شناختهشدهای دارند که حضورشان در کد، ممکن است باعث از بین رفتن دادهها، قطع شدن سرویس، دسترسی غیرقانونی به اطلاعات پروژه و مواردی از این قبیل شوند. کار این دستور آنست که بین تمام نیازمندیهای پروژه بگردد و اگر چنین مواردی را پیدا کرد به ما گزارش کند. این دستور بغیر از نیازمندیهای همتا(peer dependency ها که در مباحث پیشرفته تر بدان خواهیم پرداخت) ، تمامی انواع نیازمندیها را بررسی مینماید. (یعنی بغیر از peer dependency ها، تمامی انواع نیازمندی ها از جمله directDependency ها، bundledDependency ها، optionalDependency ها و devDependancy را مورد بررسی قرار می دهد)
در واقع هر بار که دستور npm install
برای یک پکیج اجرا میگردد، بصورت خودکار دستور npm audit
هم اجرا میشود و بررسی میکند که پکیج مذکور برای استفاده امن(safe) هست یا نه . البته npm audit
بصورت دستی هم قابل استفاده میباشد. برای استفاده از این دستور، باید از نسخه 6 به بعد npm استفاده کنیم. این دستور باید در دایرکتوری اصلی پروژه اجرا شود و برای اجرای صحیح آن، حتماً لازم است فایلهای package.json
و package-lock.json
حضور داشته باشند، در غیر این صورت به ترتیب خطاهای EAUDITNOPJSON
و EAUDITNOLOCK
رخ خواهد داد. شمای کلی npm audit
هم به این شکل است:
همانطور که در تصویر بالا میبینیم، دستور npm audit
گزینههای اختیاری زیادی دارد که توضیحشان مفصل است و برای کسب اطلاعات بیشتر درباره آنها، پیشنهاد میکنیم به مستند رسمی سایت npm مراجعه کنید:
https://docs.npmjs.com/cli/audit
در حالت پیشفرض، اگر این دستور به هیچ گونه آسیبپذیری برخورد نکند، با کدخروجی 0 کارش را تمام میکند(exit code مساوی 0)، و اگر به آسیبپذیری برسد، لیستی از آنها تهیه میکند و به ما میگوید که هر یک چقدر جدی هستند. یعنی آسیبپذیریها را سطحبندی میکند. npm میزان جدیتِ(شدت) این آسیبپذیریها را به چهار سطح بحرانی(critical)، بالا(high)، متوسط(moderate) و پایین(low) تقسیم میکند. میتوان از کنار آسیبپذیریهای پایین و متوسط به راحتی گذشت و برطرف کردن آنها را به زمان آینده موکول کرد. ولی آسیبپذیریهای بالا بهتر است در اسرع وقت برطرف شوند. و و در آخر همانطور که از نامشان پیداست، آسیبپذیریهای بحرانی باید بلافاصله برطرف گردند.
شیوه کار دستور npm audit
نیز به این ترتیب است که توضیحی درباره نیازمندیهای پروژه تهیه میکند و بــــرای npm registry ارسال مینماید. در پاسخ به این درخواست، npm registry یک گزارش از مشکلاتی که ممکن است نیازمندیهای پروژه داشته باشند به ما خواهد داد، و ذکر خواهد کرد که به ازای هر کدام از این مشکلات، چه راه حلی را باید در پیش بگیریم.
دستور npm audit fix
علاوه بر بررسی آسیب پذیری تمامی پکیجهای پروژه، نسخه سازگارِ(compatible version) پیکجهایی که مشکل داشتند را نصب میکند.
میتوانیم با دستور npm audit fix
به npm بگوییم که بصورت خودکار مشکل آسیبپذیری پکیجها را حل کند، ولی گاهی npm به تنهایی از پسِ این کار برنمیآید و بعضی از این آسیبپذیریها را باید بصورت دستی اصلاح کنیم.
در مثال زیر، روی یک پروژه قدیمی دستور npm audit
را اجرا کردیم تا در نتیجه آن توضیحات بالا را بهتر مشاهده کنیم:
این دستور یک لیست از پکیجهایی که آسیبپذیر تشخیص داده را نشان میدهد، ما در تصویر بالا، صرفاً آخرین پکیجی را که npm بعنوان آسیبپذیری گزارش کرده نمایش دادهایم و پس از آن هم ادامه گزارش قابلمشاهده است.
• خط 1: vulnerability severity
میزان شدت آسیبپذیری.
• خط 3: package
نام پکیجی که آسیبپذیری نام برده را دارد.
• خط 7: Dependency of
نشان دهنده پکیجیست که پکیجِ دارای آسیبپذیری، نیازمندیِ آن میباشد.
• خط 9: Path
آدرس کدی هست که آسیبپذیری نام برده را داراست.
• خط 12: More info
یک لینک به گزارش امنیتی(security report) درباره آسیبپذیری نام برده.
همانطور که میبینیم، 1459 مورد آسیبپذیری داریم که سطح جدیت 277 تای آنها پایین، 23 تایشان متوسط و 1159 تای دیگر بالاست.
1459 = 20 + 2 + 1437
خود npm پیشنهاد کردهاست که با زدن دستور npm audit fix
میشود 1437 تا از این آسیبپذیریها را حل کرد.
2 تا از این آسیبپذیریها برای برطرف شدن، نیازمند این هستند که شماره نسخه اصلیشان ارتقاء پیدا کند و همانطور که در دانشنامه مربوط به semver توضیح دادیم، ممکن است نیاز باشد که کدمان را تغییر بدهیم و ...، برای همین در ترمینال بصورت ویژه به آنها اشاره کردهاست. (خط 16)
برای 20 تا از این آسیبپذیریها patch ای پیدا نشده و لازم است که شخصاً آنها را بررسی کنیم، یعنی خودمان باید بگردیم و مشکل آنها را برطرف کنیم. برای این کار باید از کجا شروع کنیم؟
• میتوانیم مطالب لینک more info را بخوانیم و ببینیم چه میشود کرد، بعنوان نمونه بعضی آسیبپذیریها در بعضی پلتفرمهای خاص، مثلاً یک سیستمعامل خاص بوجود میآیند و در سایر سیستمعاملها رخ نمیدهند، و میشود روی سیستمعاملهای دیگر، بدون مشکل از آن پکیجها استفاده کرد. این موضوعات و مسائلی از این قبیل، مطالبی هستند که از خواندن گزارش دستگیر ما میشود.
• اگر برای پکیجی که دارای آسیبپذیریست، نسخه بروزرسانی شدهای آمده باشد که در آن آسیبپذیریِ مذکور برطرف شده، دستور npm audit fix
نسخه بروزرسانی شده آن پکیج را نصب خواهد کرد. اما گاهی اوقات این نسخه بروزرسانی شده وجود دارد، ولی پکیجهایی که به نسخه قبلیِ دارای آسیبپذیری وابسته بودهاند بروز نشدهاند تا بتوانند از نسخه بروزشده آن پکیج استفاده کنند. برای همین گاهی اوقات لازم است که برای حل مشکل، چنین پکیج های وابستهای را پیدا کنیم و یک درخواست ادغام(pull request یا merge request) برای آنها بزنیم.
• گاهی اوقات نیز هنوز برای پکیج دارای آسیبپذیریمان patch ای نیامده تا آن آسیبپذیری را حل کند، در این موارد لازم است که به maintainer آن پکیج اطلاع دهیم و از او بخواهیم که مشکل را برطرف کند، و یا خودمان دست به کار شویم و برایش درخواست ادغام بدهیم، یا در مخزن گیتِ آن پکیج یک issue باز کنیم و این مشکل را گزارش کنیم و ... .
برای این که دقیقتر ببینیم در چنین مواردی چه کارهایی از دستمان ساخته است، مطالعه لینک زیر را پیشنهاد میکنیم:
https://docs.npmjs.com/auditing-package-dependencies-for-security-vulnerabilities
از آنجایی که پایگاهداده مربوط به گزارشهای آسیبپذیری مدام در حال بروز شدن است، توصیه میشود حتی اگر پروژهای مشکل آسیبپذیری ندارد، بصورت متداول و هر چند وقت یک بار دستور npm audit
را استفاده کنیم، یا این دستور را به فرایند continuous integration پروژه اضافه کنیم.
اگر بخواهیم این دستور هنگام نصب یک پکیج خاص، یعنی همزمان با دستور npm install example-package-name
اجرا نشود، میتوانیم بگوییم: npm install example-package-name --no-audit
، و اگر بخواهیم هنگام نصب یکجای تمام پکیجها با دستور npm install
باز هم دستور npm audit
اجرا نشود، میتوانیم از دستور npm set audit false
استفاده کنیم.
ممنون که سکان آکادمی را دنبال می کنید. در مقاله بعد، کمی درباره دستور npm pack
صحبت کرده ایم.