وقتی بستههای خارجی را به پروژههای خود اضافه میکنید، معمولاً تیم توسعه از Package Manager برای دریافت آنها استفاده مینماید؛ ابزاری که بستهها را از مخازن عمومی دریافت و نصب میکند. این روش در مقایسه با دانلود و نصب دستی سریعتر است و سادهتر نیز بهنظر میرسد اما اگر همان بسته با نام مشابه، هم در یک مخزن خصوصی و هم مخزن عمومی وجود داشته باشد، چه اتفاقی میافتد؟ در چنین شرایطی، مهاجمان میتوانند از این تضاد استفاده کرده و سیستم شما را وادار کنند بهجای نسخه امن و داخلی، نسخه آلوده موجود در مخزن عمومی را دانلود و اجرا کند. این تکنیک با نام حمله Dependency Confusion شناخته میشود.
اهمیت حملات Dependency Confusion
پایپلاینهای ساخت (Build Pipelines) مدرن با وجود کارایی بالا، یک نقطه ضعف مهم دارند که آن نحوه دریافت کدهای خارجی می باشد. در بسیاری از موارد، پکیج منیجرها سهولت را بر امنیت ترجیح میدهند و بهطور خودکار بستههایی را که بهنظر درست میرسند را دانلود میکنند، بیآنکه اعتبار منبع یا صحت آن را بررسی نمایند.
این رویکرد، زمینهساز نوعی حمله بسیار خطرناک است زیرا مهاجمان سیستمهای مدیریت وابستگی را هدف قرار میدهند و از روشهایی مانند ناسازگاری در نسخه، namespace و حتی اشتباهات نوشتاری، برای ایجاد سردرگمی استفاده میکنند.
با نفوذ یک بسته آلوده در زنجیره تامین نرمافزار، خطر به تمام سامانههای وابسته سرایت میکند. این مسئله ممکن است موجب سرقت اطلاعات، نفوذ به سیستمها یا اختلال در عملکردهای کلیدی سازمان شود.
برای مقابله با چنین ریسکهایی، استفاده از روشهای “کمیسازی ریسک سایبری” (Cyber Risk Quantification) میتواند به تیمهای فنی و امنیتی کمک کند تا تهدیدات را بهتر ارزیابی کرده، شدت و احتمال آنها را بسنجند و اقدامات پیشگیرانه موثرتری انجام دهند.

تصویر(۱)
حملات Dependency Confusion چگونه عمل میکنند؟
درک نحوه عملکرد این حملات، دیدگاه ارزشمندی در مورد نحوه پیشگیری از آنها ارائه میدهد.
شناسایی وابستگیهای داخلی
اولین مرحله حمله، یافتن ابزارهایی است که شرکت شما استفاده میکند. مهاجمان بهدنبال یافتن فایلهای فهرست بستههای فاششده، کد منبع، لاگهای خطا، مخازن عمومی یا مستندات عمومی هستند. هدف این است که اطلاعاتی درباره کتابخانههای داخلی نرمافزار شما از جمله نام پروژهها یا بستههای خاص بهدست آورند.
بارگذاری بستههای مخرب
در این مرحله، مهاجمان بستههای جعلی میسازند که از نام، نسخه و فرادادههای (Metadata) مشابه بستههای شما، تقلید میکنند. متأسفانه، حجم عظیم بستهها در پکیج منیجرهای عمومی و مخازن مربوطه، باعث میشود که سازوکارهای نظارتی و فرآیندهای بررسی، بهراحتی نتوانند این بستههای جعلی را تشخیص دهند.
نفوذ به پایپلاینهای CI/CD شما
در جریان ساخت، سیستمهای CI/CD فایلهای پیکربندی را میخوانند تا وابستگیهای موردنیاز را دریافت کنند. در صورت نبود تدابیر امنیتی مناسب، این بستههای مخرب میتوانند کدهای مخرب را اجرا کرده و سیستم شما را در معرض آسیبپذیریهایی نظیر “اجرای کد از راه دور” (Remote Code Execution) قرار دهند.
۵ نمونه واقعی از حملات Dependency Confusion
در ادامه به چند نمونه واقعی اشاره میشود که نشان میدهند مقابله با حملات Dependency Confusion تا چه اندازه پیچیده، حیاتی و فوری است.
۱. حادثه زنجیره تامین مایکروسافت در سال ۲۰۲۱
سال ۲۰۲۱، یک پژوهشگر امنیتی به نام Alex Birsan آسیبپذیری بزرگی را در زنجیره تامین مایکروسافت افشا نمود. او بستههایی آزمایشی را در مخزن npm بارگذاری کرد که با نام وابستگیهای داخلی مایکروسافت مطابقت داشتند. اگرچه این بستهها صرفاً آزمایشی و غیرمخرب بودند اما وجود یک خطر جدی را نشان دادند.
مایکروسافت در اسکریپتهای CI/CD خود از آرگومان extra-index-url– استفاده میکرد. این آرگومان باعث میشود بستههای عمومی با نسخه بالاتر نسبت به منابع دیگر در اولویت قرار گیرند؛ در نتیجه، بستههای آزمایشی Birsan بهجای بستههای واقعی موردنظر، توسط سیستم دریافت شدند. پس از گزارش بیرسان، مایکروسافت پروتکلهای بررسی وابستگیهای خود را تغییر داد تا صحت یکپارچگی Namespace را در روالهای کاری CI/CD خود بهطور دقیقتری بررسی کند.

تصویر(۲)
۲. بستههای مخرب در PyPI و اکوسیستم پایتون
“شاخص بسته پایتون” (Python Package Index یا PyPI) یک مرکز کلیدی برای توسعهدهندگان پایتون است. بستههایی مانند boto3 بیش از یک میلیارد بار در ماه دریافت میشوند و بهدلیل همین محبوبیت، همواره در معرض حملات Dependency Confusion قرار دارند.
برای نمونه، در سال ۲۰۲۴، پژوهشگران دو بسته جعلی را کشف کردند که با استفاده از تکنیک “بارگذاری جانبی DLL” یا DLL Side-Loading از شناسایی فرار کرده و کد مخرب اجرا میکردند. توسعهدهندگان و تیمهای نرمافزاری اغلب بستههایی را مستقیماً از PyPI دریافت میکنند؛ با این حال، ممکن است نسبت به خطر حملات Code Execution آگاه نباشند.
۳. تایپواسکواتینگ (Typosquatting) در npm
تایپواسکواتینگ، تکنیکی است که مهاجمان در آن از اشتباهات تایپی احتمالی سوءاستفاده میکنند. آنها عمداً بستههایی با نامهایی مشابه بستههای معروف ایجاد میکنند، مانند lodas جای lodash، به امید آنکه توسعهدهندگان اشتباه تایپی کرده و اشتباها بسته مخرب را نصب نمایند. گرچه نمیتوان اشتباهات تایپی را بهطور کامل حذف کرد اما همواره باید پیش از افزودن هر بستهای به عنوان وابستگی، نام و نسخه آن با دقت بررسی شود.
۴. ریسک زنجیره تامین در کسبوکارهای کوچک
فرض کنید کسبوکاری کوچک از یک کتابخانه داخلی به نام datawidget استفاده میکند. اگر مهاجمی این وابستگی را شناسایی کند، میتواند نسخهای مخرب از datawidget را در یک مخزن عمومی بارگذاری نماید. اگر پایپ لاین CI/CD این کسبوکار طوری پیکربندی نشده باشد که ابتدا منابع داخلی را بررسی کند، ممکن است بهاشتباه این بسته جعلی را دریافت نماید.
۵. خطرات موجود در کتابخانههای متنباز
در آوریل ۲۰۲۴، یک آسیبپذیری مرتبط با Dependency Confusion درون پروژه متنباز Cordova App Harness کشف شد. این آسیبپذیری به مهاجمان اجازه میداد تا نسخهای مخرب از کتابخانه cordova-harness-client با شماره نسخه بالاتر ایجاد کرده و از این طریق، به پروژه نفوذ کنند. این کتابخانه بخشی از یک پروژه آرشیوی Apache است، بنابراین دیگر پشتیبانی نمیشود و بروزرسانیهای امنیتی دریافت نمیکند اما این کتابخانه همچنان دریافت میگردد و این موضوع خطر احتمالی را افزایش میدهد.

تصویر(۳)
چرا حملات Dependency Confusion بیش از هر زمان دیگری رایج شدهاند؟
افزایش شدت و فراگیری این حمله ناشی از چندین عامل کلیدی است که در سالهای اخیر رواج بیشتری یافتهاند:
-
پیچیدگی در مدیریت وابستگیها: امروزه پروژهها به صدها کتابخانه خارجی و داخلی متکی هستند. با گسترش اندازه پروژهها، ردیابی منبع و امنیت هر بسته بهطور فزایندهای دشوارتر میشود.
-
رواج نرمافزارها و منابع متنباز: کتابخانههای متنباز همهجا حضور دارند. توسعهدهندگان به انعطافپذیری آنها علاقهمند هستند اما اغلب در فرآیند یکپارچهسازی آنها عجله میکنند و گاهی برای صرفهجویی در زمان، بررسیهای امنیتی را نادیده میگیرند.
-
فقدان آگاهی در میان تیمها: اکثر تیمهای توسعه، درک کاملی از این موضوع ندارند که مهاجمان میتوانند توسط وابستگیها و بستهها، حملاتی نظیر Dependency Confusion را پیادهسازی کنند. بدون آموزش مناسب، ممکن است تیمها مراحل حیاتی مانند بررسی منابع بستهها را نادیده بگیرند.
شناسایی و پیشگیری از حملات Dependency Confusion
ایمنسازی زنجیره تامین نرمافزار و پیشگیری مؤثر از حملات Dependency Confusion نیازمند راهبردی چندلایه است که شامل اقدامات پیشگیرانه و نظارت مستمر میشود. این راهبردها عبارتند از:
۱. ایمنسازی پایپ لاینهای CI/CD
در هنگام دریافت وابستگیها، اولویت را به مخازن داخلی داده و اصالت آنها را تایید کنید. استفاده از چارچوبهایی مانند کنترلهای استاندارد ISO 27001:2022 میتواند رویکردی ساختاریافته برای ایمنسازی پایپ لاینهای CI/CD و محافظت در برابر آسیبپذیریها فراهم کند.
۲. تعیین دقیق و محدودسازی وابستگیها
برای جلوگیری از آسیبپذیری مقابل اولویت قرار دادن نسخههای جدیدتر و تداخل در namespace ها، باید رویکردی دقیق و کنترلشده جهت مدیریت وابستگیها اتخاذ کنید. یکی از روشهای مؤثر، مشخص کردن نسخههای دقیق در فایلهای وابستگی پروژه است؛ بهجای استفاده از بازهها (مانند ^۲.۱.۳ در فایل package.json برای npm)، نسخهای دقیق و مشخص مانند ۲.۱.۳ را تنظیم کنید تا هرگونه ابهام در انتخاب بسته حذف شود.
افزون بر این، برای کاهش احتمال تداخل با بستههای عمومی، میتوان از پیشوندهایی مانند نام شرکت یا پروژه بهره برد. برای مثال، استفاده از ساختاری مانند company/package@ باعث تمایز بستههای داخلی از بستههای عمومی میشود و خطر همپوشانی را کاهش میدهد.
تضمین امنیت و پایداری پروژهها نیازمند تعریف دقیق نسخهها و بهکارگیری استانداردهای منسجم در نامگذاری است. همچنین، استفاده از ابزارهای “اتوماسیون فرایندهای دیجیتال” (Digital Process Automation) میتواند با استانداردسازی فرایند مدیریت وابستگیها، کاهش خطاهای انسانی و سادهسازی جریان کاری، نقش مهمی در تقویت امنیت و بهرهوری پایپ لاین توسعه ایفا کند.

تصویر(۴)
۳. نظارت بر مخازن عمومی
ابزارهای مانیتورینگ یکی از موثرترین راهکارها برای حفظ امنیت زنجیره تامین نرمافزار هستند. این ابزارها با اسکن مداوم مخازن عمومی، میتوانند بستههای مشکوک یا رفتارهای غیرعادی را شناسایی نمایند که ممکن است امنیت اکوسیستم شما را تهدید کنند. برای نمونه، اسکنرهای امنیتی خودکار مواردی مانند انتشار ناگهانی بستهای با نام مشابه بستههای داخلی یا بروزرسانیهای غیرمنتظره در کتابخانههایی که بهندرت تغییر می نمایند را شناسایی کرده و فوراً به تیم شما هشدار میدهند.
برای محافظت بیشتر در برابر حملاتی نظیر تزریق JavaScript، ضروری است که وابستگیها پیش از استفاده در فرآیند کدنویسی، بهصورت رمزنگاریشده تأیید گردند یا با نسخههای موجود در یک رجیستری رسمی و معتبر تطبیق داده شوند. این اقدامات نهتنها از ورود کد مخرب جلوگیری خواهند کرد بلکه موجب اطمینان از اصالت و یکپارچگی بستههای مورد استفاده می گردند.
۴. بررسی منظم وابستگیها
بررسی دورهای وابستگیها نقش مهمی در حفظ امنیت و پایداری پروژهها ایفا میکند. برنامهریزی و اجرای بررسیهای دستی دوره ای، به تیم شما این امکان را میدهد تا مشکلات جزئی، ناسازگاریهای پنهان یا تغییرات مشکوک را شناسایی و پیش از ایجاد اختلال، رفع کند.
ابزارهای محافظت در برابر حملات Dependency Confusion
ابزارهای متنوعی برای ایمنسازی زنجیره تامین نرمافزار و کمک به تیمها جهت مقابله با حملات Dependency Confusion در دسترس هستند. ابزارهای مفید در این زمینه شامل موارد زیر می باشند:
-
Dependabot: وابستگیهای پروژه را بهصورت خودکار بروزرسانی میکند تا ریسک آسیبپذیریهای امنیتی کاهش یابد.
-
npm audit: پروژههای Node.js را برای شناسایی مشکلات امنیتی تحلیل میکند.
-
PyPI scanners: بهطور مداوم آسیبپذیریهای موجود در بستههای پایتون را جستجو میکنند.

تصویر(۵)
جمع بندی
حملات Dependency Confusion تنها یک تهدید فنی نیستند بلکه نمادی از شکنندگی زنجیره تامین نرمافزار در دنیای مدرن توسعه محسوب میشوند. با در نظر داشتن اتکای گسترده به مخازن عمومی و فرآیندهای خودکار CI/CD، حتی کوچکترین سهلانگاری برای مدیریت وابستگیها میتواند پیامدهای فاجعهباری داشته باشد. به همین دلیل، تیمهای توسعه باید با اتخاذ راهکارهای چندلایه، مانند محدود سازی منابع، تثبیت نسخهها، نظارت مداوم و ابزارهای پیشرفته، از بروز چنین حملاتی جلوگیری کنند. امنیت نرمافزار به انتخاب هوشمندانه و مدیریت دقیق هر وابستگی متکی است. رویکردی پیشگیرانه و مبتنی بر آگاهی، تنها راه محافظت مؤثر از زیرساختهای نرمافزاری در برابر تهدیداتی نظیر Dependency Confusion می باشد.
