
آنتیویروس – مبانی
نرمافزار آنتیویروس برای شناسایی و جلوگیری از گسترش فایلها و پردازشهای مخرب درون سیستمعامل طراحی شده است و به این ترتیب از اجرای آنها روی نقطه پایانی (Endpoint) جلوگیری میکند. با گذشت زمان، موتورهای آنتیویروس پیشرفت کرده و هوشمندتر و پیچیدهتر شدهاند؛ با این حال، پایه و اساس آنها در بیشتر محصولات یکسان است.
بیشتر محصولات آنتیویروس امروزی تنها بر چند نوع موتور متکی هستند که هر کدام هدف متفاوتی دارند، از جمله:
موتور ایستا (Static Engine)
موتور پویا (Dynamic Engine) (شامل موتور سندباکس)
موتور ابتکاری/هیوریستیک (Heuristic Engine)
موتور بازکردن بسته (Unpacking Engine)
البته هر یک از این موتورها معایب خاص خود را دارند. برای مثال، ضعف موتور ایستا این است که همانطور که از نامش پیداست، بسیار ابتدایی است. هدف آن شناسایی تهدیدها با استفاده از امضاهای ایستا است؛ برای نمونه، امضاهای YARA. این امضاها هر از گاهی نوشته شده و تقریباً بهصورت روزانه توسط تحلیلگران امنیتی آنتیویروس بهروزرسانی میشوند.
در هنگام اسکن، موتور ایستای آنتیویروس فایلهای موجود در سیستمعامل را با پایگاه دادهای از امضاها مقایسه میکند و از این طریق میتواند بدافزار را شناسایی کند. با این حال، در عمل شناسایی تمام بدافزارهای موجود تنها با استفاده از امضاهای ایستا غیرممکن است، زیرا هر تغییر در یک فایل بدافزاری خاص میتواند باعث عبور از یک امضای ایستای مشخص شود و حتی ممکن است بهطور کامل موتور ایستا را دور بزند.
نمودار زیر جریان اسکن موتور ایستا را نشان میدهد:

با استفاده از موتور پویا (Dynamic Engine)، نرمافزار آنتیویروس کمی پیشرفتهتر میشود. این نوع موتور میتواند بدافزار را بهصورت پویا شناسایی کند؛ یعنی زمانی که بدافزار در سیستم اجرا میشود.
موتور پویا نسبت به موتور ایستا پیشرفتهتر است و نقش آن بررسی فایل در زمان اجرا از طریق چندین روش مختلف است.
روش اول، پایش API (API Monitoring) است. هدف از پایش API رهگیری فراخوانیهای API در سیستمعامل و شناسایی فراخوانیهای مخرب است. این پایش از طریق هوکهای سیستمی (System Hooks) انجام میشود.
روش دوم، سندباکس (Sandboxing) است. سندباکس یک محیط مجازی است که از حافظه رایانه میزبان فیزیکی جدا شده است. این جداسازی امکان شناسایی و تحلیل بدافزار را با اجرای آن در یک محیط مجازی فراهم میکند، بدون آنکه مستقیماً در حافظه سیستم فیزیکی اجرا شود.
اجرای بدافزار در یک محیط سندباکسشده بهویژه زمانی مؤثر است که بدافزار امضای دیجیتال نداشته باشد و توسط موتور ایستای آنتیویروس شناسایی نشده باشد.
یکی از معایب بزرگ چنین موتور سندباکسی این است که بدافزار تنها برای مدت زمان محدودی اجرا میشود. پژوهشگران امنیتی و عاملان تهدید میتوانند مدت زمانی را که بدافزار در سندباکس اجرا میشود تشخیص دهند، فعالیت مخرب را در این بازه کوتاه متوقف کنند و تنها پس از آن، عملکرد مخرب اصلی خود را اجرا نمایند.
نمودار زیر جریان اسکن موتور پویا (Dynamic Engine) را نشان میدهد:

با استفاده از موتور هیوریستیک (Heuristic Engine)، نرمافزار آنتیویروس حتی پیشرفتهتر میشود. این نوع موتور با انجام یک تحلیل آماری که روشهای موتور ایستا و موتور پویا را با هم ترکیب میکند، برای هر فایل یک امتیاز تعیین میکند.
تشخیص مبتنی بر هیوریستیک روشی است که بر اساس قوانین رفتاری از پیش تعریفشده، میتواند رفتارهای بالقوه مخرب پردازشهای در حال اجرا را شناسایی کند. نمونههایی از این قوانین میتواند شامل موارد زیر باشد:
اگر یک پردازش تلاش کند با پردازش LSASS.exe تعامل داشته باشد؛ پردازشی که شامل هشهای NTLM کاربران، تیکتهای Kerberos و موارد دیگر است
اگر پردازشی که توسط یک تولیدکننده معتبر امضا نشده است، تلاش کند خود را در یک مکان دائمی (Persistent Location) بنویسد
اگر یک پردازش یک پورت در حالت شنود باز کند و منتظر دریافت دستورات از یک سرور فرماندهی و کنترل (C2) بماند
عیب اصلی موتور هیوریستیک این است که میتواند منجر به تعداد زیادی هشدار اشتباه (False Positive) شود. همچنین، با انجام چند آزمایش ساده به روش آزمون و خطا، امکان یادگیری نحوه عملکرد این موتور و دور زدن آن نیز وجود دارد.
نمودار زیر جریان اسکن موتور هیوریستیک را نشان میدهد:

نوع دیگری از موتور که بهطور گسترده توسط نرمافزارهای آنتیویروس استفاده میشود، موتور آنپَکر (Unpacker Engine) نام دارد. در فصل ۵ با عنوان «دور زدن موتور ایستا»، بررسی خواهیم کرد که پَکر چیست، فرایند آنپککردن چگونه کار میکند و چگونه میتوان با استفاده از بستهبندی (Packing) از آنتیویروس عبور کرد.
یکی از معایب اصلی آنتیویروسهای پیشرفته امروزی به استفاده آنها از آنپَکرها بازمیگردد؛ ابزارهایی که توسط موتورهای آنتیویروس برای آشکارسازی بارِ بدافزاری (Payload) به کار میروند که تحت «پَککردن» یا فشردهسازی قرار گرفتهاند تا الگوی مخرب خود را پنهان کرده و بدینترتیب شناسایی مبتنی بر امضا را خنثی کنند.
مشکل اینجاست که امروزه پَکرهای بسیار زیادی وجود دارند که آنتیویروسها برای آنها آنپَکر متناظر ندارند. برای ایجاد یک نرمافزار آنپَکر خودکار، پژوهشگران امنیتی شرکت سازنده آنتیویروس ابتدا باید فرایند آنپککردن را بهصورت دستی انجام دهند؛ و تنها پس از آن میتوانند یک فرایند خودکار برای آن ایجاد کرده و آن را به یکی از موتورهای آنتیویروس اضافه کنند.
اکنون که با موتورهای پایهای که تقریباً در همه نرمافزارهای آنتیویروس وجود دارند آشنا شدیم، میتوانیم به شناسایی روشهای عملی عبور از آنها بپردازیم تا در نهایت به مرحلهای برسیم که اجرای بدافزار—even در حالی که آنتیویروس فعال و در حال اجراست—امکانپذیر شود.
دور زدن آنتیویروس بهطور خلاصه
برای اثبات ادعای اصلی این کتاب—اینکه نرمافزارهای آنتیویروس نمیتوانند بهطور کامل از کاربر محافظت کنند—تصمیم گرفتیم یک پژوهش انجام دهیم. این پژوهش بهصورت عملی و بر اساس فایلهای اجرایی (EXE) نوشتهشده و کامپایلشده توسط ما انجام شده است؛ فایلهایی که شامل کدی هستند که واقعاً تکنیکهایی را که بعداً توضیح خواهیم داد اجرا میکنند، بههمراه بارهای اجرایی (Payload) که عمل دور زدن را انجام میدهند. هدف این پژوهش صرفاً گرفتن یک شِل (Shell) روی نقطه پایانی نبود، بلکه کنترل واقعی آن بود؛ از جمله ارسال دستورات از راه دور، دانلود فایلها از اینترنت، سرقت اطلاعات، راهاندازی پردازشها و بسیاری اقدامات دیگر—همه اینها بدون هیچگونه هشداری از سوی نرمافزار آنتیویروس.
مهم است توجه داشته باشیم که صرفاً به این دلیل که توانستهایم یک نرمافزار آنتیویروس خاص را دور بزنیم، به این معنا نیست که آن نرمافزار بد است یا اینکه ما استفاده نکردن از آن را توصیه میکنیم. محیطی که آنتیویروس در آن آزمایش شده، یک محیط شبکه محلی (LAN) بوده است و کاملاً ممکن است که در یک محیط شبکه گسترده (WAN)، نتیجه متفاوتی بهدست آید.
ارتباط بین بدافزار و سرور فرماندهی و کنترل (C2) با استفاده از پروتکل TCP و به دو روش انجام شده است:
Reverse Shell
Bind Shell
تفاوت این دو روش در نحوه انتقال ارتباط از بدافزار به سرور C2 مهاجم است. در روش Bind Shell، بدافزار بهعنوان یک سرور روی نقطه پایانی قربانی عمل میکند و روی یک پورت ثابت—یا حتی چندین پورت—در حالت شنود قرار میگیرد. مهاجم میتواند هر زمان که بدافزار در حال اجراست، از طریق این پورتهای شنود با نقطه پایانی تعامل داشته باشد.
در روش Reverse Shell، پورت ثابت شنود روی سرور C2 مهاجم باز است و بدافزار نقش یک کلاینت را ایفا میکند که با استفاده از یک پورت مبدأ تصادفی که روی نقطه پایانی قربانی باز میشود، به سرور C2 مهاجم متصل میگردد.
نمودار زیر تفاوتهای بین Reverse Shell و Bind Shell را نشان میدهد:

بیشتر اوقات، عاملان تهدید ترجیح میدهند بار مخرب خود را طوری طراحی کنند که برای تعامل با سرورهای C2 از تکنیک Reverse Shell استفاده کند. دلیل این انتخاب این است که اجرای آن نسبتاً ساده است، در پشت ترجمه آدرس شبکه (NAT) نیز کار میکند و احتمالاً شانس بیشتری برای فریب دادن نرمافزارهای آنتیویروس و راهکارهای فایروال دارد.
خلاصه
در دنیای امروز، نرمافزارهای آنتیویروس بخش جداییناپذیری از امنیت نقاط پایانی مانند کامپیوترها و سرورها هستند و این شامل کاربران عادی تا بزرگترین سازمانها میشود.
بیشتر شرکتها به نرمافزارهای آنتیویروس بهعنوان خط دفاع اول یا حتی آخر در برابر تهدیدات سایبری تکیه میکنند. به همین دلیل، ما تصمیم گرفتیم پژوهشی درباره آنتیویروسها انجام دهیم، آسیبپذیریهای موتورهای آنها را پیدا کنیم و مهمتر از همه، روشهایی برای دور زدن آنها کشف کنیم تا نشان دهیم که این نرمافزارها بهتنهایی راهحل کاملاً مطمئنی ارائه نمیدهند.
برای انجام پژوهش در زمینه دور زدن آنتیویروس، شناخت چشمانداز امنیت سایبری ضروری است. هر روز خطرات و تهدیدهای جدیدی برای کاربران خانگی و تجاری ظهور میکند. آشنایی با راهکارهای امنیتی که امنیت سایبری بهتری ارائه میدهند اهمیت دارد. علاوه بر این، ضروری است که با راهکار پایهای، یعنی آنتیویروس، آشنا شد و عملکرد و اصول داخلی آن را درک کرد تا پژوهشهای مؤثرتری انجام شود. این دانش به کاربران و سازمانها کمک میکند تا ارزیابی کنند آیا نرمافزار آنتیویروس آنها سطح امنیت مورد انتظار را فراهم میکند یا خیر.
در فصل بعد، با مبانی و استفاده از ابزارهای مختلف آشنا خواهید شد که به جمعآوری اطلاعات برای پژوهش آنتیویروس کمک میکنند و در نهایت روی سطوح بعدی پژوهش درباره دور زدن آنتیویروس تأثیر میگذارند.
Telegram: @CaKeegan
Gmail : amidgm2020@gmail.com