محمد نصیری
هکر کلاه سفید ، کارشناس امنیت اطلاعات و ارتباطات

تفاوت Kernel Mode Rootkit و User Mode Rootkit در چیست؟

قبلا در جزیره امنیت در خصوص Rootkit ها و اینکه ماهیت آنها چیست صحبت کرده ایم اما امروز می خواهیم در خصوص نحوه عملکرد دو نوع Rootkit در سیستم عامل ویندوز صحبت کنیم . قبل از اینکه به معرفی آنها برسیم بایستی بدانید که واژه Rootkit در بحث سیستم عامل در اصل به مجموعه ای از ابزارها گفته می شود که با استفاده از آنها شما به عنوان یک هکر می توانید به یک سیستم عامل Unix دسترسی مدیریتی یا root پیدا کنید .

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

این مجموعه ابزارها شامل برخی از ابزارهای مانیتورینگ شناخته شده در این سیستم عامل به همراه ابزارهای دستکاری شده و مخفی است که توسط کاربرهای غیرمجاز طراحی و ارائه می شوند . یک کاربر غیرمجاز می تواند ابزارهای مجاز سیستم عامل را دستکاری کرده و ابزارهای غیرمجاز خودش را جایگزین آنها کند و با اینکار یک حفره امنیتی در سیستم عامل ایجاد کند . این مفهوم در سیستم عامل Unix معنی دارد و در سیستم عامل ویندوز تعریف Rootkit به شکل دیگری انجام می شود.

تصویر Rootkit یک

زمانیکه صحبت از سیستم عامل های خانواده ویندوز می شود تعریف Rootkit نیز بعضا متفاوت تر از آن چیزی می شود که در Unix وجود داشته است . در سیستم عامل ویندوز وقتی صحبت از Rootkit می کنیم یعنی برنامه هایی که با استفاده از تکنیک System Hooking ( انتقال درخواست به یک برنامه دیگر ، قلاب کردن برنامه در برنامه ای دیگر ، ارجاع درخواست به سمت برنامه غیرمجاز ) یا دستکاری در فایل های سیستمی سعی می کنند.

رفتار یک برنامه ، فرآیند یا پروسس ، کلیدهای رجیستری و هر شیء دیگری در سیستم عامل را از حالت طبیعی خارج کرده و به سمت رفتار مورد نیاز هکر تغییر بدهند ، گفته می شود ، این تغییرات بصورت مخفی انجام می شوند . یکی از نقاط اساسی تفاوت بین Rootkit های ویندوزی و Unix ای این است که الزاما Rootkit های ویندوزی دسترسی مدیریتی به مهاجم نمی دهند اما برای اجرا شدن نیاز به دسترسی مدیریتی دارند . بصورت کلی دو کلاس یا نوع Rootkit ویندوزی وجود دارد که در ادامه برای شما نحوه عملکرد آنها را تشریح می کنیم .

روتکیت های حالت کاربر یا User Mode Rootkits

Rootkit های حالت کاربر یا User Mode Rootkits همانطور که از نامشان هم پیداست فرآیند System Hooking را در سطح User یا Application انجام می دهند. زمانیکه یک Application یک درخواست سیستمی را فراخواهی می کند ( در اصطلاح System Call ) می کند ، فرآیند اجرای درخواست سیستمی یک روال مشخص و از پیش تعریف شده را دارد ، وقتی که Rootkit ویندوزی سطح Application در اینجا فعال شده باشد این درخواست در هر زمانی که نیاز باشد در اصطلاح جایگزین یا سرقت ( Hijack ) شده و تغییراتی که هکر مورد نظرش است بر روی آن انجام می شود .

یکی از مرسوم ترین روش های مورد استفاده در حالت User Mode انجام تغییرات بر روی حافظه DLL های سیستمی است . برنامه های ویندوزی از کدهای معمولی که توسط DLL های شرکت مایکروسافت ارائه می شوند استفاده می کنند. در زمان اجرا یا ( Runtime ) این DLL ها در فضایی که توسط Application از حافظه گرفته شده است Load می شوند و به Application اجازه فراخوانی و اجرای کدهای درون DLL ها را می دهند ، اینکار طبیعتا برای بالا بردن سرعت اجرا برنامه ها است و همانطور که می دانید همه برنامه ها برای اینکه با سرعت بهتری اجرا شوند بسیاری از اطلاعات پر استفاده خودشان را درون Memory یا RAM سیستم قرار می دهند .

 نمونه عکس User Mode Rootkit

برای مثال فرض کنید که شما یک Application دارید که می خواهید کلیه کلیدهای رجیستری ویندوز را به شما خروجی بدهد ، برای انجام اینکار سیستم عامل ویندوز بایستی یک Windows API به نام RegEnumKey را فراخوانی کند که کدهای این API در یک فایل DLL به نام ADVAPI32.DLL قرار گرفته اند . در چنین شرایطی User Mode Rootkit محل قرارگیری API را درون ADVAPI32.DLL پیدا می کند و API را دستکاری می کند و کاری می کند که در زمان فراخوانی API فرآیند اجرا به کدهای قرارگرفته در Rootkit هدایت شوند و به جای کدهای API کدهای Rootkit اجرا می شوند. کدهای Rootkit در ابتدا خود API را فراخوانی کرده و سپس در بازگشت مقادیر را تغییر می دهد ، برای مثال در بازگشت می تواند محل ذخیره سازی خودش در ویندوز را تغییر بدهد یا آن را اصلا بازگشت ندهد.

اما با توجه به اینکه تمامی Application هایی که در User Mode سیستم عامل اجرا می شوند برای خودشان یک فضای حافظه دارند ، Rootkit مجبور است که این فرآیند Patch یا وصله کردن DLL را به گونه ای انجام بدهند که کلیه Application هایی که در حال حاضر بر روی حافظه در حال اجرا هستند را نیز در بر بگیرد. علاوه بر این Rootkit باید کلی سیستم را مانیتور کند و Application های جدیدی که اجرا می شوند را نیز قبل از اینکه بصورت کامل اجرا شوند Patch کند تا بصورت موفقیت آمیزی اجرا شوند. اما خوب ، این یکی از تکنیک های System Hooking است ، در برخی انواع دیگر الزامی به Patch کردن و مانیتور کردن مستمر Application های ورودی به حافظه نیست . در واقع در System Hooking های دیگر در لایه Kernel تمامی مسیرها در نهایت به سمت Rootkit هدایت می شوند.

روتکیت های حالت کرنل یا Kernel Mode Rootkits

برخلاف User Mode Rootkits این نوع Rootkit ها در لایه هسته سیستم عامل یا Kernel فرآیند System Hooking را انجام می دهند و تغییرات خودشان را در فضای Kernel سیستم عامل ویندوز عملیاتی می کنند . باز هم برخلاف User Mode Rootkits که دسترسی آن وابسته به نوع کاربری و دسترسی های User است ، Kernel Mode Rootkit ها فارغ از بحث دسترسی های کاربری فعالیت می کنند و در واقع هیچ یک از محدودیت هایی که برای کاربر استاندارد در سیستم عامل وجود دارد برای Kernel Rootkit ها وجود ندارد.

در این نوع Rootkit دسترسی مشاهده و تغییر حافظه مورد استفاده در Kernel داده می شود . لایه Kernel مناسب ترین لایه ممکن برای انجام فرآیند System Hooking است زیرا نزدیک ترین لایه و پایین ترین لایه به هسته سیستم عامل است و به همین دلیل بهترین محل و مطمئن ترین جا برای System Hooking است . مسیر فراخوانی سیستم که بایستی از Kernel عبور کند از بسیاری از Hook Point ها ( نقاط اتصال یا فراخوانی نقطه دیگر ) عبور می کند .

برخی از این Hook Point ها را در ادامه توضیح می دهیم ، به محض اینکه یک System Call از User Mode وارد Kernel Mode می شود بایستی از یک Gate یا دروازه عبور کند . هدف از قراردادن یک دروازه ورودی بین Kernel Mode و User Mode این است که کدهای قسمت User Mode نباید به فضای حفاظت شده Kernel Mode ورود کنند.این دروازه یا Gate بایستی هدف از درخواست سیستمی که از طرف User Mode به سمت Kernel Mode می آید را شناسایی کند و کدهای مورد نیاز برای اجرا شدن در فضای Kernel Mode را اجرا کند و نتیجه را مجددا به سمت User Mode بازگشت بدهد .

در واقع این Gate یک پروکسی بین User Mode و Kernel Mode در سیستم عامل ویندوز است . در نسخه های قبلی سیستم عامل ویندوز این Proxy توسط وقفه ها یا Interrupt ها انجام می شد اما در نسخه های جدیدتر ویندوز توسط Model Specific Registers یا MSR ها اینکار انجام می شود . به هر حال هر دوی این روش ها توسط System Hooking قابل هک شدن هستند و درخواست های اجرای کد می توانند توسط Gate به جای اینکه به سمت Kernel Mode اصلی هدایت شوند به سمت Rootkit هدایت می شوند .

 تصویر Gate بین User Mode  و Kernel Mode

یکی دیگر از مواردی که به خوبی می توان در آن Hook ایجاد کرد قسمت System Service Descriptor Table یا SSDT است . SSDT یک جدول Pointer یا اشاره گر به Function ها یا توابع در حافظه Kernel است که تمامی آدرس های مربوط به توابع System Call یا فراخوانی سیستمی را در خودش نگهداری می کند . با دستکاری کردن این قسمت از اطلاعات جدول ، Rootkit به راحتی می تواند کدهای خودش را به جای کدهای فراخوانی اصلی سیستم اجرا کند.

مشابه تکنیک های قبلی که اشاره کردیم ، Rootkit می تواند System Call اصلی را فراخوانی کند و خودش را در هنگام بازگشت دادن نتیجه به سمت User Mode از نتیجه حذف کند تا مخفی باقی بماند. برای مثال حافظه کرنل یا Kernel Memory لیستی از کلیه پردازش های در حال اجرا را می خواهند نمایش بدهد و Rootkit براحتی پردازش خودش و کدهای مخربی که خودش تعریف کرده است را می توان از این لیست نتایج حذف کند ، این تکنیک به عنوان Direct Kernel Object Modification یا DKOM نیز شناخته می شوند.

 تصویر DKOM

نتیجه گیری

بسیاری از همین تکنیک هایی که در همین مقاله اشاره شد در بسیاری از Application های مختلف مورد استفاده قرار می گیرند. اما مهمترین چیزی که در خصوص یک Rootkit اهمیت دارد و فرآیند System Hooking هم به همین دلیل انجام می شود مخفی کردن رفتارها ، برنامه ها و رخدادهایی است که در نتیجه عملکرد Rootkit بر روی سیستم عامل به وجود می آید . برای مثال یک فایروال برای اینکه ترافیک غیرمعمول را به کاربر اعلام کند اقدام می کند و به محض اینکه Rootkit این را متوجه می شود جلوی ارسال دستور به کاربر و سیستم را می گیرد و Connection ای که خودش ساخته است را از دید کاربر مخفی می کند و آن را به عنوان یک Backdoor مخرب برای استفاده های آینده خودش مخفی نگه می دارد.

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


محمد نصیری
محمد نصیری

هکر کلاه سفید ، کارشناس امنیت اطلاعات و ارتباطات

هکر کلاه سفید ، کارشناس امنیت اطلاعات و ارتباطات و کشف جرائم رایانه ای ، بیش از 12 هزار ساعت سابقه تدریس در بیش از 40 سازمان دولتی ، خصوصی و نظامی ، علاقه مند به یادگیری بیشتر و عاشق محیط زیست ، عضو کوچکی از مجموعه توسینسو

07 خرداد 1397 این مطلب را ارسال کرده

نظرات