دستور 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 صحبت کرده ایم.
