Node.js مانند سایر فریمورکها یا زبانهای برنامه نویسی، مستعد ابتلا به انواع آسیبپذیری برنامههای وب است. با اینکه هسته Node.js کاملا امن است، اما پکیجهای شخص ثالث ممکن است به اقدامات امنیتی بیشتری برای محافظت از برنامههای وب نیاز داشته باشند. بر اساس آمار، 14 درصد از اکوسیستم Node Package Manager (NPM) تحت تأثیر قرار گرفته است. پکیجهای غیرمستقیم تحت تأثیر قرار گرفته هم حدود 54 درصد از اکوسیستم تخمین زده میشود.
چرا پروژههای Node.js دارای خطرات امنیتی هستند؟
برنامههای متن باز مسائل امنیتی و مجوزها را از کامپوننتهای متن باز خود به ارث نمیبرند. مشکل این است که ابزارهای تست امنیت در شناسایی آسیبپذیریهای متن باز ناکارآمد هستند.
برای شناسایی کامپوننتهای متن باز در Node.js باید فایلهای موجود در دایکتوری پکیج منجر که وابستگیها را توصیف میکنند، تجزیه و تحلیل کنید. هرچند این فایلها شامل کامپوننتهای متن باز مورد استفاده نمیشوند.
جامعه اپن سورس اغلب از پروژههای متن باز برای سرعت بخشیدن به توسعه، کاهش زمان ورود به بازار و ترکیب عملکردها استفاده میکند. بنابراین هم توسعه دهندگان متن باز و هم توسعه دهندگان تجاری میتوانند توابع، قطعه کدها و متدها را در فایلها معرفی کنند. نتیجه این است که بسیاری از پروژههای Node.js شامل شرایط صدور مجوز غیر از مجوز اصلی Node.js هستند.
آیا Node.js تهدیدی برای عملکرد امنیت برنامه است؟
برخی از توسعه دهندگان، Node.js را به دلیل عدم رسیدگی به خطاهای پیشفرض ناشی از ساخت پلتفرم، یک تهدید امنیتی میدانند. چرا که خطا یا خرابی برنامه میتواند منجر به از کار افتادن سرور شود.
فیشینگ NPM و حملات Denial of Service تنها درصد کمی از مشکلات امنیتی Node.js است.
Alex Pletnov - مدیر فنی ارشد KeenEthics - دو دلیل اصلی را بیان میکند که چرا نباید امنیت Node.js را در معرض خطر ببینیم.
اولا توسعه دهندگان ممکن است در طراحی یک برنامه اشتباه کنند، مانند اجازه دادن به CSRF و سرقت کوکی. ثانیا توسعه دهندگانی که تخصص کمی در Node.js دارند، ترجیح میدهند آن را به ناامن بودن متهم کنند تا بیکفایتی خود را بپوشانند. علاوه بر این، مسائل امنیتی معمول وب مانند جعل درخواست بین سایتی، اسکریپت بین سایتی، تغییر مسیرهای نامعتبر و پیکربندی نادرست امنیتی هم وجود دارد.
کامپوننتهای متن باز باعث ایجاد مشکلات امنیتی Node.js میشوند
جدول زیر برخی از کامپوننتهای متن باز که میتوانید در پروژههای Node.js پیدا کنید را نشان میدهد. این کامپوننتها مجوزهای پنهانی دارند که ممکن است خطر امنیتی برای Node.js به وجود آورد. عدم رعایت عناصر مجوز مخفی میتواند یک شرکت را در معرض خطر اقدامات قانونی قرار دهد.
10 خطر امنیتی رایج به همراه راهحلهای آنها
مشکلات امنیتی Node.js میتواند شما را در معرض حملاتی مانند تزریق کد، مرد میانی و تهدیدهای دائمی پیشرفته قرار دهد. در زیر بررسی مختصری از خطراتی که ممکن است منجر به این حملات شود به همراه راهحلهای آنها عنوان شده است.
1. کنترل دسترسی ناقص
معمولا برنامههای وب دارای نقشهای کاربری متعددی مانند مدیران، ناظران و فروشندگان هستند. در مقایسه با کاربران معمولی، این نقشها از امتیازات بیشتری برخوردارند. کنترل دسترسی ناقص میتواند به دو صورت در مقیاس عمودی و افقی ظاهر شود. روش اول به این معنی است که مهاجم از دادههای محرمانه کاربر برای دسترسی به امتیازات در سطح مدیر استفاده میکند. راه دوم ممکن است منجر به نشت گسترده داده شود که در آن مهاجم از دادههای شخصی یه عده کاربر برای دسترسی به منابع سایر کاربران بهره میگیرد.
OWASP کنترل دسترسی ناقص را به عنوان یک مشکل اینترنتی به راحتی قابل شناسایی، قابل بهرهبرداری و گسترده ارزیابی میکند.
راه حل
برای جلوگیری از این آسیبپذیری، هر شرکتی به یک رابط مرکزی مدیریت شده برای مستندسازی رویههای کنترل دسترسی نیاز دارد. قاعده این است که دسترسی به منابع برنامه را به طور پیشفرض برای هر کاربر ممنوع کنید. فقط کاربران قانونی باید مجوز مشاهده و اصلاح منابع برنامه را داشته باشند. همچنین شرکتها باید کنترل دسترسی را فقط در سمت سرور انجام دهند. از طرفی با انجام تست مداوم بر روی کنترل دسترسی، سازمانها میتوانند از عملکرد صحیح همه مکانیزمها اطمینان حاصل کنند. ابزارهایی مانند Crash Test Security Suite، HDiv، Immuniweb Discovery، PortSwigger/Burp Suite و Acunetix به شرکتها کمک میکنند تا گزارشها و دستورالعملهای آسیبپذیری را برای مبارزه با تهدیدات و حملات دریافت نمایند.
2. تزریق کد
به نظر میرسد نوشتن کد ایمن کار سادهای باشد، بیخبر از اینکه مشکلات زیادی به همراه دارد. اگر توسعه دهنده از پکیجهای متن باز در برنامه استفاده کند و مطمئن نباشد که ایمن است، چه اتفاقی میافتد؟
تزریق کد نوعی از حمله است که مهاجم از یک نقص اعتبارسنجی ورودی برای اجرای کد مخرب استفاده میکند. بنابراین هر برنامهای که کد تستنشده داشته باشد، تحت آسیبپذیری امنیتی قرار میگیرد.
راه حل
به منظور تمایز کد ایمن و ناامن، بهتر است از تکنیکهایی در برابر تزریق کد استفاده کنید. شما باید از اجرای کد داینامیک در برنامه خودداری نمایید، مانند ساختارهای زبان (eval) و رشتههای کد (به setTimeout یا Constructor تابع منتقل میشوند). همچنین سریالسازی میتواند در برابر حملات آسیبپذیر باشد، بنابراین باید از آن جلوگیری کنید. در نهایت انجام اسکن وابستگی به شما کمک میکند برنامه را آنالیز کنید و مطمئن شوید که مستعد حملات مربوط به کامپوننتهای متن باز شخص ثالث نیست.
3. درخواستهای جعلی بین سایتی (CSFR)
حملات CSRF کاربران نهایی را مجبور میکند تا اقدامات غیرضروری روی برنامههای کاربردی وب انجام دهند. اهداف حملات CSRF تغییر در درخواستهای وضعیت برنامه است، زیرا مهاجم هیچ راهی برای دیدن پاسخ درخواست جعلی ندارد.
هکرها میتوانند با استفاده از تکنیکهای مهندسی اجتماعی، مانند ارسال لینک از طریق چت یا ایمیل، کاربران را فریب داده تا اقدامات غیرضروری را انجام دهند. CSRF میتواند درخواستهایی مانند تغییر آدرس ایمیل و سپس انتقال وجه را انجام دهد. همچنین میتواند کل برنامه وب را در معرض خطر قرار دهد.
راه حل
جلوگیری از CSRF در Node.js نیاز به استفاده از توکنهای Anti-Forgery دارد. توکنهای ضد CSRF برای نظارت و تایید صحت درخواستهای کاربر و جلوگیری از حملات با یک کلیک استفاده میشوند.
4. نام کوکی Session پیشفرض
کوکیهای session وب سایتها را قادر میسازد تا کاربران را شناسایی کنند. هر اقدامی که در وب سایت انجام میدهید به عنوان یک کوکی ذخیره میشود. سبد خرید در سایتهای تجارت الکترونیک رایجترین نمونه از این قابلیت است.
کوکی session گزینههای انتخابی شما را در سایت تجارت الکترونیک به خاطر میآورد. در نتیجه هنگامی که شما آماده خرید هستید، سبد خرید دارای این موارد خواهد بود. بنابراین صفحه فعالیتهای قدیمی شما، صفحات دیگر را بدون کوکیهای session تشخیص نمیدهد.
استفاده از نامهای کوکی پیشفرض خطرناک است، زیرا مهاجمان میتوانند به راحتی این نامها را شناسایی کرده و برنامه شما را تهدید کنند.
راه حل
راه حل این است که از یک ماژول session کوکی میانافزار مانند express-session استفاده کنید.
5. هدر X-Powered-By
X-Powered-By یک هدر غیراستاندارد برای پاسخ HTTP است. برخی از فناوریهای اسکریپت نویسی این پاسخ را به طور پیشفرض در هدر گنجاندهاند. سرورها گزینهای دارند که پاسخ X-Powered-By را غیرفعال کند یا آن را تغییر دهد تا از هدف قرار دادن یک فناوری خاص توسط هکرها جلوگیری شود.
X-Powered-By اطلاعاتی در مورد فناوری استفاده شده در یک برنامه را نشان میدهد. در نتیجه هکرها میتوانند از X-Powered-By برای سوءاستفاده از نقاط ضعف امنیتی Node.js استفاده کنند.
راه حل
شما باید با غیرفعال کردن این هدر اطلاعات مربوط به فناوری سرور را مخفی کنید.
6. بررسی منظم برنامهها از نظر آسیبپذیری
از آنجایی که اکوسیستم Node.js شامل ماژولها و کتابخانههای مختلفی برای نصب است، این امر باعث ایجاد یک مشکل امنیتی میشود. با استفاده از کدی که شخصی قبلا نوشته یا استفاده کرده، هرگز نمیتوانید مطمئن باشید که کد امن است.
راه حل
اسکن خودکار آسیبپذیری به شما کمک میکند وابستگیها را با آسیبپذیریهای امنیتی Node.js تشخیص دهید. همچنین میتوانید از حسابرسی npm برای کنترل اولیه استفاده کنید یا ابزارهای ارزشمندی مانند Retire.js، OWASP Dependency-Check، Acutinex و WhiteSource Renovate را به کار ببرید.
7. احراز هویت قوی و کامل
یکی دیگر از آسیبپذیریهای رایج، سیستم احراز هویت ناکافی، ضعیف و ناپایدار است. با کمک راهحل پیشنهادی زیر میتوانید این آسیبپذیری را متوقف کرده و دور بزنید.
راه حل
بسیاری از راهحلهای موجود به شما امکان میدهند تا احراز هویت را بهبود دهید. برخی از این ابزارها Firebase Auth، OAuth و Okta هستند. همچنین میتوانید راهحلهای بومی را اتخاذ کنید. بهترین کار این است که از Scrypt یا Bcrypt به جای یک کتابخانه رمزنگاری داخلی هنگام ایجاد رمزعبور کمک بگیرید. همچنین احراز هویت دوعاملی (2FA) همراه با ماژولهایی مانند Speakeasy یا node-2fa راهکار خوب دیگری برای پردازش session است که میتواند امنیت برنامه شما را به طور قابل توجهی ارتقا دهد. در نهایت باید تلاشهای ناموفق برای ورود را محدود کرده و در صورت واردشدن نام کاربری یا رمزعبور نادرست، هرگز نباید کاربران را در این مورد مطلع کنید.
8. محدودسازی Payload
هنگامی که بار روی سرور بیش از حد زیاد باشد، هر Thread در پردازش سختتر کار میکند. این امر به مهاجمان اجازه میدهد تا سرورها را با تعداد کمی درخواست از کار بیاندازند.
راه حل
میتوانید اندازه درخواستهای دریافتی را محدود نمایید یا body-parser را طوری پیکربندی کنید که فقط بار ورودی کمی را بپذیرد. اگر این راهحل را در نظر نگیرید، برنامه شما بدون انجام کارهای مهم دیگر به درخواستهای بزرگ رسیدگی میکند و به نوبه خود میتواند منجر به افت عملکرد و آسیبپذیریهای زیادی شود.
9. جلوگیری از درز اطلاعات
شما باید همیشه آنچه که از قسمت فرانت-اند میآید و آنچه که برای آن ارسال میشود را کنترل کنید. از یک طرف میتوانید به راحتی اطلاعات موردنیاز را به یک شی در فرانت-اند ارسال کرده و اطلاعات نمایش داده شده را در آنجا فیلتر نمایید. از سوی دیگر این یک شانس عالی برای هکر است که دادههای محرمانه ارسال شده از بک-اند را دریافت کند.
راه حل
این راهکار نیاز به تلاش بیشتری دارد، اما ارزشش را خواهد داشت. یک تمرین خوب این است که فقط اطلاعات موردنیاز را ارسال کرده و همه مواردی که میخواهید نشان دهید را کنترل کنید. از آنجایی که تمام دادههای محرمانه به راحتی از طریق کنسول developer مرورگر قابل دسترسی هستند، باید همه چیز را از پایگاه داده بازیابی کنید تا از نشت دادهها جلوگیری شود.
10. گزارشگیری و نظارت دائم
شما میتوانید بدون ورود به سیستم متوجه نفوذ هکرها شوید. هرچند برخی از آنها میتوانند برای مدت طولانی ناشناخته بمانند.
راه حل
وقتی گزارشها و معیارها را رصد میکنید، تشخیص موارد اشتباه و جلوگیری از نقض دادهها برایتان بسیار آسانتر میشود. بنابراین تنها با گزارشگیری و نظارت دائم میتوانید منبع درخواستهای عجیب و غریب (خود برنامه، APIهای شخص ثالث و نفوذ هکر) را کشف کنید.
جمعبندی
در این مقاله برخی از مشکلات مهم مربوط به امنیت Node.js را مورد بررسی قرار دادیم. همچنین علت وجود خطرات در پروژههای Node.js، کامپوننتها، مشکلات امنیتی، ریسکها و آسیبپذیریها را به همراه راهحلهای آنها تحلیل کردیم.
امنیت Node.js نیاز به یک کاوش عمیق در منابع واقعی پکیجهای شخص ثالث دارد. توصیه میکنیم در مورد وابستگیهای موجود در پکیجهای متن باز برنامههای خود و عناصر پنهان مجوز آنها اطلاعات بیشتری کسب کنید. علاوه بر این میتوانید نگرانیهای آسیبپذیری Node.js را با استفاده از ابزارهای امنیتی و راهکارهای اختصاصی برطرف سازید.
زمانی که مسائل امنیتی ظاهر میشوند، همیشه مشخص نیست که چه کاری باید انجام شود. به همین دلیل از توصیههای ما استفاده نمایید تا بتوانید از آسیبپذیری در پروژههای خود جلوگیری کنید. ما سعی کردیم بهترین راهکارها را پیش رویتان قرار دهیم. امیدواریم این مقاله برایتان مفید بوده باشد. با این حال اگر هنوز سؤالی دارید، در بخش زیر با ما در میان بگذارید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید