حسابرسی NPM: 5 روش برای استفاده از آن برای محافظت از کد شما

ممکن است Node و مدیر بسته JS همراه آن – NPM را بشناسید. NPM گسترده ترین مدیر بسته در جهان است که بیش از یک میلیون بسته در دسترس دارد. از آنجایی که بستهها و درختهای وابستگی اغلب بهروزرسانی میشوند، آسیبپذیریهای نسخههای بسته قدیمی ممکن است به پروژه شما راه پیدا کنند.
اگر مدتی است که پروژه خود را لمس نکردهاید و متوجه میشوید که آسیبپذیریهای شما بسیار بیشتر از حد انتظار است، به ابزار جامعتری برای رسیدگی به کل پوشه ماژول گرهتان در یک لحظه نیاز دارید. ابزار Node برای این کار، NPM Audit است. در این مقاله، ما به گزینههای مختلف در NPM Audit و نحوه استفاده از آنها برای محافظت از کد خود عمیقتر خواهیم پرداخت.
پایگاه داده مشاوره NPM
را npm نصب کنید و ممیزی npm دستورات آسیب پذیری ها را در برابر خطرات امنیتی شناخته شده گزارش شده در رجیستری npm عمومی بررسی می کنند. از اواخر سال 2021، این پایگاه داده آسیبپذیری در GitHub میزبانی شده است، به نام پایگاه داده مشاوره GitHub. همین پایگاه داده آسیبپذیری، ابزار Dependabot GitHub را تقویت میکند و به توسعهدهندگان از آسیبپذیریهای شناخته شده در پایگاه کدشان که در GitHub میزبانی شده است، هشدار میدهد.
را ممیزی npm دستور اکنون شامل یک URL با هر رفع آسیبپذیری پیشنهادی است که به گزارش آسیبپذیری خاص پایگاه داده مشاوره GitHub پیوند میخورد. اگر علاقه مند هستید، GitHub همچنین یک API برای مرور پایگاه داده مشاوره برای آسیب پذیری ها بر اساس شدت یا نام بسته خاص ارائه می دهد. همچنین میتوانید پیشنهادهایی برای رفع آسیبپذیریها یا ویرایش یک شرح آسیبپذیری خاص برای شفافسازی آن ارائه دهید.
در اینجا نمونه ای از شرح آسیب پذیری در GitHub آمده است:
نحوه اجرای NPM Audit
دستور اصلی که باید اجرا کنید تا پیشنهاد Node در مورد رفع آسیب پذیری های خود را دریافت کنید ممیزی npm. ابتدا مطمئن شوید که آخرین نسخه Node و NPM را نصب کرده اید و پروژه خود را باز کنید.
باید به پوشه پروژه که فایل package.json شما در آن ذخیره شده است بروید. هنگامی که پروژه خود را باز کردید، یک ترمینال جدید باز کنید که در آن می توانید هر یک از دستورات CLI ذکر شده را تایپ کنید و نتایج را در آن ببینید.
را ممیزی npm دستور به شما لیستی از آسیب پذیری های پیدا شده و اطلاعات بیشتری در مورد آنها می دهد.
در پایان گزارش، تعداد آسیبپذیریهایی را که NPM Audit میتواند بهطور خودکار برطرف کند و آسیبپذیریهایی که نیاز به بازبینی دستی دارند، خواهید دید.
اگر گزارش به خصوص طولانی است، می توانید استفاده کنید ممیزی npm –json برای دریافت گزارش در قالب JSON. برای انتقال گزارش به یک فایل، از > علامت (pipe) همراه با مسیر و نام فایلی که می خواهید ایجاد کنید: npm audit –json > report.json.
همچنین می توانید از بسته ای به نام npm-audit-html برای تولید همان گزارش در قالب HTML استفاده کنید (npm audit –json | npm-audit-html –output report.html). مشاهده فرمتهای JSON و HTML سادهتر از انتقال دادههای ساده به ترمینال است.
Jit امنیت را برای پشته های Node.js هماهنگ می کند. توسعه دهندگان شما می توانند به سرعت و به طور یکپارچه npm-adit را در لایه امنیتی کد خود ادغام کنند تا به اجرای بررسی های وابستگی در یک گردش کاری متمرکز CI کمک کنند. از کد، خط لوله و زیرساخت گرفته تا زمان اجرا، Jit برنامه امنیتی بهعنوان کد (SaC) را ارائه میکند و همه ابزارهای امنیتی را در هر مرحله از چرخه عمر توسعه نرمافزار هماهنگ میکند. امروز یک نسخه نمایشی رزرو کنید.
5 روش برای استفاده از حسابرسی NPM برای محافظت از کد شما
1. گزارش های ممیزی امنیتی را به طور مکرر ایجاد کنید
از آنجایی که اکوسیستم بسته NPM اغلب بهروزرسانی میشود، ممکن است در حال حاضر آسیبپذیریهایی در کد خود به دلیل نسخههای بسته قدیمی داشته باشید که حتی ممکن است از آنها مطلع نباشید. بسیاری از ما به طور کامل اجرا نمی کنیم npm نصب کنید غالباً در دوره منظم رویدادها.
شما باید اجرا کنید ممیزی npm به طور منظم گزارش دهید، زیرا این به شما کمک می کند تا مطمئن شوید که آسیب پذیری های وابستگی پنهان در پروژه خود ندارید. آنچه شما به عنوان یک “مبنای منظم” در نظر می گیرید به اندازه و پیچیدگی پروژه شما بستگی دارد.
حدود یک بار در ماه ممکن است برای یک پروژه بزرگ و پیچیده کافی باشد. اگر پروژه پایدار است و به روز رسانی های زیادی ندارد، حتی یک بار در سه ماهه ممکن است کافی باشد. فرکانس بستگی به شما دارد، اما میتوانید آن گزارشها را بهعنوان گواهی بر این موضوع نگهدارید که در بالای مشکل آسیبپذیری پروژه هستید.
2. گزارش و مشاوره امنیتی را بررسی کنید
گزارش حسابرسی NPM شامل داده های زیر در ساختار زیر است:
شدت -توضیحات
بسته (عنوان) – اطلاعات مربوطه
Patched In (عنوان) – اطلاعات مربوطه
Dependency Of (عنوان) – اطلاعات مرتبط
مسیر (عنوان) – اطلاعات مربوطه
اطلاعات بیشتر (عنوان) – پیوند URL به GitHub Advisory DB
مثلا:
در اینجا توضیح مختصری از معنای هر بخش از اطلاعات آورده شده است:
شدت – شدت آسیب پذیری بر اساس تأثیر بالقوه آن. شدت به تقسیم می شود
- بحرانی – بلافاصله آدرس دهید
- بالا – در اسرع وقت آدرس دهید
- متوسط - زمانی که زمان اجازه می دهد آدرس دهید
- کم – آدرس به صلاحدید شما
توضیحات – توضیح کوتاهی از آنچه ممکن است اتفاق بیفتد اگر آسیبپذیری را برطرف نکنید. به عنوان مثال – “آسیب پذیر در برابر حمله DoS.”
Package – نام بسته ای که آسیب پذیری در آن یافت شد.
Patched in – با فرض اینکه آسیب پذیری در نسخه بعدی بسته برطرف شده است، این قسمت می گوید که کدام نسخه حاوی نسخه وصله شده است. به عنوان مثال >=2.0.1 (در تمام نسخه هایی که از 2.0.1 و بالاتر شروع می شوند)
وابستگی به – کدام بسته (یا بسته) دیگر از این بسته خاص استفاده می کند؟ ممکن است بستههای زیادی را در گزارش مشاهده کنید که هیچوقت به یاد ندارید نصب یا استفاده کرده باشید. دلیلش این است که هر یک از بستههایی که استفاده میکنید وابستگیهای خود را دارند، و گاهی اوقات این وابستگیها وابستگیهای خاص خود را در یک زنجیره بسیار طولانی به نام زنجیره تامین نرمافزار دارند. گفتن اینکه کدام بسته از این بسته مشکل ساز استفاده می کند بسیار مهم است زیرا حذف بسته اصلی مشکل وابستگی را بدون به روز رسانی چیزی برطرف می کند.
Path – مسیر پوشه بسته در ماژولهای گره حاوی آسیبپذیری.
اطلاعات بیشتر – پیوندی به گزارش امنیتی در پایگاه داده مشاوره GitHub.
3. امضای رجیستری بسته های دانلود شده را بررسی کنید
بستههای منتشر شده در رجیستری عمومی npm امضا میشوند تا تشخیص داده شود که آیا محتوای بسته دستکاری شده است یا خیر. هنگامی که توسعه دهنده بسته را در NPM آپلود می کند، امضا به طور خودکار انجام می شود.
اگر یک سرور پراکسی، یک آینه یا حمله مشابهی بر کاربران یک بسته خاص تأثیر بگذارد، امضای موجود در بسته محلی با امضای مورد انتظار ذخیره شده در رجیستری NPM برای آن بسته مطابقت نخواهد داشت.
با افزودن تگ امضاها به ممیزی npm فرمان (امضاهای حسابرسی npm)، گزارشی دریافت خواهید کرد که به صراحت امضای هر یک از بسته های خود را بررسی می کند. این تگ فقط با شروع npm v8.15.0 کار می کند، بنابراین اگر می خواهید از این گزینه استفاده کنید مطمئن شوید که آخرین نسخه NPM را دارید. توجه داشته باشید که خروجی ممکن است از نسخه ای به نسخه دیگر متفاوت باشد.
در اینجا نمونه ای از گزارش نهایی است که ممکن است دریافت کنید:
برای هر بسته، فهرستی از «keyid» آن دریافت خواهید کرد که باید با یکی از کلیدهای امضای عمومی و امضای واقعی بر اساس آن کلید مطابقت داشته باشد. مثلا:
برای بررسی اینکه “keyid” با یکی از کلیدهای عمومی مطابقت دارد، می توانید به این آدرس بروید registry-host.tld/-/npm/v1/keys و کلیدهای ارائه شده در آنجا را مقایسه کنید. مطمئن شوید که بر اساس همان قالب کلید مقایسه می کنید. در این مورد، برای مثال، باید کلید SHA256 را بررسی کنید.
به بستههایی که دارای امضای مشکلدار هستند، دقت کنید – ممکن است نشاندهنده این باشد که نسخه شما دستکاری شده است.
از آنجایی که ممکن است هزاران بسته وجود داشته باشد، میتوانید نتایج را به یک فایل JSON منتقل کنید و فقط بستههایی را بررسی کنید که نشانهای وجود دارد که امضاها مطابقت ندارند. اگر نگران هستید، یک راه حل آسان این است که یک بسته مشکل دار را دوباره نصب کنید و دوباره بررسی کنید. میتوانید مستقیماً با NPM تماس بگیرید و اگر همچنان مشکل مشابه را داشتید، مشکل را گزارش کنید.
4. متا آسیب پذیری ها و اصلاحات را بررسی کنید
یک “متا آسیب پذیری” یک وابستگی آسیب پذیر است زیرا بسته به یک نسخه آسیب پذیر بسته متفاوت بستگی دارد. بنابراین، بسته “A” ممکن است به خودی خود هیچ آسیبپذیری نداشته باشد. با این حال، به عنوان حاوی یک آسیبپذیری نمایش داده میشود، زیرا به بسته «B» بستگی دارد، که آسیبپذیری شناختهشدهای دارد.
هنگامی که آسیبپذیریهای متا برای یک بسته مشخص محاسبه شد، در پوشه ~/.npm ذخیره میشوند و تنها در صورتی که محدوده مشاوره تغییر کند یا نسخه جدیدی از بسته منتشر شود، دوباره ارزیابی میشوند (در این صورت، آخرین نسخه بررسی میشود. برای وضعیت متا آسیب پذیر نیز).
فرض کنید زنجیره متا آسیبپذیریها به پروژه ریشه گسترش مییابد، و بدون تغییر محدودههای وابستگی آن، بهروزرسانی غیرممکن است. در آن صورت، رفع حسابرسی npm نیاز خواهد داشت –زور گزینه ای برای اعمال اصلاح
اصلاحات ممکن است نیازی به تغییر در محدوده وابستگی نداشته باشند. در این صورت، تمام بستههای آسیبپذیر به نسخهای بهروزرسانی میشوند که هیچ گونه آسیبپذیری یا آسیبپذیری متا در برابر آن ارسال نشده باشد، بدون نیاز به دخالت توسعهدهنده.
5. رفع آسیب پذیری ها به صورت خودکار
با فرض اینکه بیش از یک یا دو آسیب پذیری دارید، این گزارش می تواند به سرعت خسته کننده شود. اگر به پیشنهادات Node اعتماد دارید، میتوانید یک * npm audit fix* را اجرا کنید و هر آنچه را که میتوان به طور خودکار برطرف کرد، برطرف کنید. از آنجا که رفع حسابرسی npm در اصل در حال اجرا است npm نصب کنید در زیر کاپوت، آماده باشید تا مدت کوتاهی منتظر بمانید تا تکمیل شود.
از وقتی که ثابت دستور به پایان رسیده است، خلاصه ای از تغییرات تکمیل شده را دریافت خواهید کرد:
این گزارش به شما میگوید که آیا تغییرات احتمالی مهمی وجود دارد که باید بررسی کنید. همچنین میتوانید دستور را با -force دوباره اجرا کنید تا بروزرسانی را انجام دهید و بعداً با کد شکسته مقابله کنید.
6. رفع آسیب پذیری ها به صورت دستی
بر اساس گزارش حسابرسی که دریافت کرده اید، شما دو گزینه برای مقابله با تغییراتی دارید که به طور خودکار با یک اصلاح نمی شوند ممیزی npm:
- مجبور کردن تعمیر حسابرسی برای ایجاد تغییرات لازم، حتی اگر ممکن است کد شما را خراب کند.
- هر یک از راه حل ها و مشکلات پیشنهادی را بررسی کنید و تصمیم بگیرید که چگونه با آنها برخورد کنید.
در مثالی که قبلا نشان دادیم، به طور بالقوه 18 بسته وجود دارد که نیاز به بررسی دستی دارند و دو بسته که شامل تغییرات شکسته هستند.
هنگامی که شما اجرا کنید رفع حسابرسی npm دستور، اجرای مجدد گزارش تنها بسته های مشکل دار را در اختیار شما قرار می دهد. در اینجا، باید به اصلاح پیشنهادی نگاه کنید (با فرض وجود یکی) و ببینید در صورت اعمال آن اصلاح، چه چیز دیگری ممکن است تحت تأثیر قرار گیرد.
در برخی از این موارد، به جای ردیابی آسیبپذیری در درخت وابستگی، ممکن است جایگزین کردن بستهای با بستهای متفاوت با قابلیت استفاده مشابه آسانتر باشد. با این فرض که آسیبپذیری با شدت بالا یا بحرانی برچسبگذاری شده است.
شروع حسابرسی در حال حاضر
هیچ یک از ما نمی خواهیم پس از از بین رفتن کل پروژه به دلیل مشکلی که به موقع برطرف نشد، با کاربران ناراضی روبرو شویم. به همین دلیل است که باید آسیب پذیری های وابستگی خود را اغلب بررسی کنید.
از آنجایی که اکثر پروژهها شامل تیمی از توسعهدهندگان هستند، پس از هر PR ممیزی کد شما بسیار کارآمدتر است. اینجاست که ابزارهای یکپارچه CI/CD برای حسابرسی وابستگی مفید هستند. اگر انجام همه این کارها به طور خودکار آسانتر از اجرای گزارش به نظر می رسد، چگونه می توان Jit را به صورت رایگان امتحان کرد؟