مطالب مطالب

بررسی حملات DLL Hijacking، تشخیص و پیشگیری

DLL مخفف کتابخانه پیوند پویا و بخش های خارجی از برنامه های کاربردی است که بر روی ویندوز یا هر سیستم عامل دیگری اجرا می شود. بسیاری از برنامه های کاربردی خودشان کامل نیستند و کد را در فایل های مختلف ذخیره می کنند. در صورتی که نیاز به کد پیدا شود فایل مرتبط در حافظه بارگذاری و استفاده می شود. این کار موجب کاهش اندازه فایل برنامه کاربردی به همراه بهینه سازی استفاده ازRAM می شود. در ارتباط با DLLها حملاتی تحت عنوانDLL Hijacking   مطرح است. مسیر فایل های DLL توسط سیستم عامل ویندوز تعیین شده است. به طور پیش فرض اگر برنامه ای یک فایل DLL درخواست کند، سیستم عامل در همان پوشه که در آن برنامه ذخیره شده است، جستجو می کند. اگر آنجا پیدا نشد، به دنبال پوشه دیگر می رود. اولویت هایی که برای مسیرها تعیین شده است، به ویندوز کمک می کند که در چه فولدرهایی به دنبال فایل های DLL بگردد. این دقیقا نقطه ای است که حملات DLL Hijacking  وارد عمل می شود. در این گزارش به معرفی این نوع حملات و تکنیک های مورد استفاده برای کاهش و رفع آنها خواهیم پرداخت.

1- فایل DLL یا کتابخانه پیوند پویا (Dynamic Link Library)

کتابخانه پیوند پویا یک مولفه پایه در سیستم عامل ویندوز است. زمانی که برنامه کاربردی ویندوز شروع می شود، در صورت نیاز DLL های خاصی به آن بارگذاری می شود. DLL کتابخانه ای است که شامل کد و داده است که می تواند به طور همزمان توسط بیش از یک برنامه استفاده شود. برای مثال در سیستم عامل های ویندوز، کتابخانه Comdlg32 توابع مرتبط با کادر محاوره ای رایج را انجام می دهد. بنابراین هر برنامه می تواند از قابلیتی که درون این DLL است برای اجرای یک کادر محاوره ای باز استفاده کند. این به ترویج استفاده مجدد از کد و استفاده کارآمد از حافظه کمک می کند.

با استفاده از DLL، برنامه می تواند از اجزای جداگانه تشکیل شود (ماژولار شود). برای مثال یک برنامه حسابداری می تواند به صورت ماژول به فروش برسد. هر ماژول می تواند در صورتی که نصب شده باشد، در زمان اجرا به برنامه اصلی بارگذاری شود. به دلیل این که ماژول ها جدا هستند، زمان بارگذاری برنامه سریع تر است و ماژول تنها زمانی بارگذاری می شود که قابلیتی خاص مورد نیاز است. به علاوه به روزرسانی برای اعمال بر هریک از ماژول ها آسان تر است بدون این که بر قسمت های دیگر برنامه تاثیر گذارد. برای مثال ممکن است یک برنامه حقوق داشته باشیم و نرخ مالیات در هر سال تغییر کند. زمانی که این تغییرات مربوط به یک DLL است، می توان به روزرسانی را بدون نیاز به ساخت و یا نصب دوباره برنامه اعمال کرد.

2- مزایای DLL

لیست زیر برخی از مزایای استفاده برنامه ها از DLL را نشان می دهد:

  • استفاده از منابع کمتر: زمانی که چندین برنامه کتابخانه یکسانی از توابع را استفاده می کنند، DLL میتواند کدهای تکراری که به دیسک و حافظه بارگذاری می شود را کاهش دهد .
  • ترویج معماری ماژولار: DLL به ترویج برنامه های ماژولار در حال توسعه کمک می کند. همچنین کمک می کند که برنامه های بزرگ که به چندین نسخه زبان مختلف نیاز دارند یا برنامه هایی که نیاز به معماری ماژولار دارند توسعه داده شوند. مثالی از برنامه ماژولار برنامه حسابداری است که چندین ماژول دارد که می تواند به صورت دینامیک در زمان اجرا بارگذاری شود.
  • سهولت گسترش و نصب: هنگامی که تابع درون DLL نیاز به به روزرسانی یا تعمیر دارد، برای استقرار و نصب و راه اندازی DLL نیازی نیست که برنامه مجدد به DLL لینک شود. به علاوه اگر چندین برنامه DLL مشابهی را استفاده کنند، همه برنامه ها از به روزرسانی DLL بهره مند می شوند. این موضوع هنگام استفاده از DLL طرف سوم که به طور منظم به روزرسانی یا تعمیر می شود، بسیار موثر است.

DLL Hijacking -3 چیست؟

 DLL Hijacking که عموماً تحت عنوان Load Order Hijacking یا Search Order Hijacking شناخته می شود یک تکنیک دوام بدافزار برای گریز از تشخیص بوده و همچنین به عنوان یک چالش مهم برای محققان مطرح است. برطبق مقاله ای از مایکروسافت DLL Hijacking  به صورت زیر تعریف می شود:

زمانی که برنامه ای به صورت پویا و بدون مشخص کردن نام مسیر کامل کتابخانه ای را بارگذاری می کند، ویندوز برای تعیین محل DLL با جستجوی مجموعه تعریف شده ای از دایرکتوری ها با ترتیب خاصی تلاش می کند. اگر حمله کننده بتواند هنگام جستجوی DLL کنترل یکی از دایرکتوری ها را به دست بگیرد، می تواند یک کپی مخرب از DLL در آن دایرکتوری قرار دهد، این اغلب با عنوان Preloading attack یا Binary planting attack شناخته می شود. اگر سیستم قبل از جستجوی دایرکتوری دستکاری شده کپی مجاز از DLL را پیدا نکند، کپی مخرب را پیدا خواهد کرد.

از آنجا که DLL ها به عنوان یک افزونه هستند و اغلب در اکثر برنامه های کاربردی در سیستم ضروری هستند، در پوشه های مختلفی در سیستم قرار گرفته اند. اگر فایل DLL اصلی با یک فایل DLLقلابی که دارای کد مخرب است، جایگزین شود به عنوان DLL Hijacking شناخته می شود. این آسیب پذیری ها در نرم افزارهایی همچون Windows Movie Maker  و Windows Address Book دیده می شود. به منظور درک DLL Hijacking ابتدا بایستی نحوه بارگذاری فایل های DLL توسط ویندوز هنگامی که آدرس کامل کتابخانه داده نشده است را دانست. ویندوز نیازی ندارد که برنامه های کاربردی یک مسیر کامل برای DLL های بارگذای شونده در زمان اجرا مشخص کند. به همین علت برنامه نویسان اغلب مسیر کامل به فایل های DLLای که می خواهند استفاده کنند، مشخص نمی کنند. این می تواند منجر به این مشکل شود که DLLها را نتوان پیدا کرده و استفاده کرد. هنگامی که یک مسیرکامل ارایه نمی شود ویندوز تلاش می کند که DLL ها را در مکان هایی از پیش تعیین شده قرار دهد.

به طور پیش فرض اولین موردی که یافت می شود، اولین آیتمی است که استفاده می شود. بنابراین این امکان برای مهاجم وجود دارد که این ترتیب را با اضافه کردن یک DLL  مخرب با همان نام نسخه مجاز در مکانی قبل از آن عوض کند که این باعث می شود سیستم عامل به طور ناخواسته DLL  مخرب را بارگذاری کند. اگر برنامه کاربردی DLL را تنها با نام آن بارگذاری می کند (به طور مثال ntshrui.dll) ویندوز ترتیب تعریف شده از قبل را برای شناسایی و بارگذاری دنبال می کند و اولین کتابخانه پیدا شده با نام ntshrui.dll را بارگذاری می کند.

دایرکتوری برنامه

دایرکتوری جاری

دایرکتوری سیستم

دایرکتوری سیستم 16 بیتی

دایرکتوری ویندوز

دایرکتوری های ذخیره شده در متغیر PATH

برای مثال اگر برنامه ای (مثلاً Test.exe) DLL ای را تنها توسط نام بارگذاری کند(مثلا foo.dll ) ویندوز ترتیب جستجویی را بسته به این که SafeDllSearchMode فعال یا غیرفعال است، برای تعیین محل DLL مجاز دنبال می کند. اگر حمله کننده دانشی درباره این برنامه داشته باشد، می تواند DLL مخربی در مسیر جستجوی آن با همان نام قرار دهد و برنامه را مجبور کند که DLL مخرب را بارگذاری کند.

برنامه هایی که از مکان های ناامن اجرا می شوند برای مثال پوشه های قابل نوشتن توسط کاربر همانند پوشه Downloads یا TempDirectory تقریبا همیشه در معرض این آسیب پذیری هستند.

4- جزئیات حمله

بسته به پیکربندی سیستم، برنامه می تواند تصمیم بگیرد که ترتیب مسیرهایی که باید برای بارگذاری DLL جستجو کند، چگونه باشد. به طور پیش فرض ترتیب این جستجو به صورت زیر است :

  • مسیری که از آن برنامه کاربردی بارگذاری می شود.
  • دایرکتوری جاری
  • دایرکتوری سیستم، معمولاً C:\Windows\System32\ (تابع GetSystemDirectory برای دستیابی به این دایرکتوری فراخوانی می شود)
  • دایرکتوری سیستم 16 بیتی – هیچ تابع اختصاص داده شده برای بازیابی مسیر این دایرکتوری وجود ندارد، اما این دایرکتوری نیز جستجو می شود.
  • دایرکتوری ویندوز، تابعGetWindowsDirectorبرای دستیابی به این دایرکتوری فراخوانی می شود.
  • دایرکتوری های لیست شده در متغیر محیطی PATH

در جستجوی این مسیرها برنامه اولین DLL ای را که با آن نام پیدا کرد، استفاده می کند.

در این مورد دایرکتوری جاری مشکل است. زمانی که یک برنامه تصمیم به بارگذاری DLL از دایرکتوری جاری می گیرد می تواند به DLL Hijacking  منجر شود. برای مثال اگر کاربر یک سند Microsoft word را باز می کند، Microsoft office سعی خواهد کرد که مولفه DLL آن را از مکان فایل داکیومنت بارگذاری کند. حمله کننده سپس می تواند یک DLL بدخواه در مکان سند جایگذاری کند و در نتیجه Microsoft office   کد بدخواهانه را بارگذاری می کند.

با فرض این که  SafeDllSearchMode فعال شده است (که به صورت پیش فرض فعال است) برای حمله استفاده از این تکنیک بسیار سخت تر است. در این صورت  سیستم عامل اول بررسی می کند که آیا یک DLL با همین نام در حال حاضر در حافظه بارگذاری شده است یا آیا DLL  در کلید رجیستری (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs) تعریف شده است(KnownDLLs). اگر هیچ یک از شرایط برقرار نبود ویندوز با استفاده از ترتیب زیر کتابخانه ها را بارگذاری می کند:

  • دایرکتوری که از آن برنامه بارگذاری می شود.
  • دایرکتوری سیستم (C:\Windows\System32)
  • دایرکتوری سیستم 16 بیتی (C:\Windows\System)
  • دایرکتوری ویندوز (C:\Windows)
  • دایرکتوری کار جاری ([1]CWD)
  • دایرکتوری های لیست شده در متغیرهای محیطی PATH(System  و بعد از آن user)

با این وجود دایرکتوری جاری هنوز در لیست دایرکتوری ها برای جستجو است. تفاوت در اینجا در این است که برنامه در ابتدا دایرکتوری های سیستم را برای مولفه های DLL جستجو می کند، اگر پیدا نشد، سپس دایرکتوری جاری را جستجو می کند.

به عنوان یک قاعده کلی برنامه های اجرا شونده خارج از “C:\Windows\System32”  که کتابخانه ای را بدون ارایه مسیر کامل بارگذاری می کنند، اهداف بالقوه هستند. توجه داشته باشید که کتابخانه درخواست شده نباید قبلاً در حافظه وجود داشته باشد یا در مقدار رجیستری KnownDlls قرار گرفته باشد.

5- پیداکردن آسیب پذیری های  DLL Hijacking

پیداکردن آسیب پذیری در برنامه ها اولین قدم برای سواستفاده از آن است. روش صحیح برای این کار استفاده از Process Monitor  برای دیدن این که چه زمانی برنامه جستجویی را برای فایل DLL اجرا می کند. هنگامی که Process Monitor بارگذاری می شود می توان سعی کرد که یک تابع از DLL دیگری را به کار انداخت یا این که منتظر باشید تا این که یکی به کار انداخته شود. بعد از انجام این کار، تمام آن چه که نیاز است این است که به منوی Filter  رفته و فیلترهای خود را اعمال کنید.

اگر شما چیزی شبیه این ها پیدا کردید بسیار محتمل است که یک آسیب پذیری DLL Hijacking پیدا کرده باشید.

6- پیداکردن نام توابع ازDLL

برای ایجاد کردن یک DLL جدید با کد مخرب ، ابتدا بایستی نام توابعی که در آن به کار رفته است را بدانیم . در ویندوز این می تواند توسط ابزار DUMPWIN انجام شود. با DUMPWIN ما می توانیم از گزینه  /EXPORTS  استفاده کنیم. در زیر مثالی از خروجی dll نمونه آمده است:

Dump of file C:\example.dll

File Type: DLL

 Section contains the following exports for example

  00000000 characteristics

  4FC31DEF time date stamp Mon Jun 05 18:32:49 2013

    0.00 version

        1 ordinal base

        3 number of functions

        3 number of names

    ordinal hint RVA name

1000007BA0 output_data 

       2 1 00007C40 show_integer

       3 2 00008940 add_integers

      Summary

     1000 .CRT

     1000 .bss

     1000 .data

     1000 .edata

     1000 .idata

     1000 .rdata

     1000 .reloc

     9000 .text

     1000 .tls

 

گزینه دیگر استفاده از یک اشکال زدا است. اشکال زداها می توانند متن آشکاری که در برنامه ها ذخیره شده است را به شما نشان دهند. ما می توانیم نام هر فایل DLL ارجاع شده و ذخیره شده، را نیز به صورت متن آشکار ببینیم.

7- دفاع در برابر DLL Hijacking

مهم ترین بخش از تعریف یک آسیب پذیری، توضیح چگونگی مقابله با آن است. مسئولیت حفاظت از کاربران به عهده خود توسعه دهندگان نرم افزار می افتد. در مورد DLL Hijacking  برای اجتناب از این مشکل مسیر کامل به کتابخانه بایستی مشخص شود.

گزینه دیگر انتقال فایل های DLL به جایی است که در ترتیب جستجو زودتر چک می شود. گزینه دیگر ایجاد یک هش Checksum از فایل DLL و ذخیره آن درون خود برنامه است، بنابراین در زمان اجرا زمانی که DLL پیدا شد هش Checksum آن بایستی با هش ذخیره شده  درون برنامه مطابقت کند. این روش می تواند توسط استفاده از یک روش هشینگ قوی به همراه Salt  یا توسط استفاده از کلیدهای عمومی و خصوصی داخل برنامه برای رمز کردن checksum خارج از برنامه و رمزگشایی آن بهبود داده شود.

کاربران همچنین توانایی محافظت از خود با درنظر گرفتن اقدامات احتیاطی خاصی را دارند. کاربر می تواند اطمینان حاصل کند که فایل هایی که دارد باز می کند در همان دایرکتوری DLL هایی نیست که مشکوک به نظر می رسد. برای مثال اگر DLL ای به همراه عکسی که شما دانلود کرده اید بیاید، بهتر است که قبل از بازکردن عکس DLL را حذف کنید. کاربران همچنین توان تغییر کلید رجیستری CWDIllegalInDllSearch را دارند.در ضمن کاربران می توانند دو کلید رجیستری مختلف خودشان ست کنند.

 

[1] current working directory

تصاویر مرتبط
تاریخ انتشار مطلب: 16 مرداد 1395
بازدید ها: 1137