مهران کیاء
متخصص تست نفوذ و امنیت

آسیب پذیری RCE چیست؟

تو این مقاله قصد داریم تا در رابطه با یک حفره امنیتی معروف بنام RCE یا همون (Remote Code Execution) صحبت کنیم با کابرد این آسیب پذیری آشنا بشیم و بدونیم برای جلوگیری از این باگ (Vulnerability) باید چه کاری انجام بدیم. خب پس همین اول کار بریم با مفهوم آسیب پذیری یا حفره امنیتی RCE یا کنترل از راه دور آشنا بشیم.

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

آسیب پذیری کنترل از راه دور (Remote Code Execution) چیست؟

اجرای کد از راه دور (RCE) یک کلاس از نقص ها و آسیب پذیری های امنیتی نرم افزار است. آسیب پذیری های RCE به نفوذگران اجازه می دهد تا هر کد دلخواه خود را بر روی دستگاه های مختلف از راه دور از طریق LAN ، WAN یا اینترنت اجرا کنند. آسیب پذیری RCE متعلق به طبقه وسیع تری از آسیب پذیری های اجرای کد دلخواه (ACE) است. با وجود همه گیر شدن اینترنت ، تأثیر آسیب پذیری کنترل از راه دور (RCE) به سرعت افزایش می یابد. بنابراین ، RCE ها احتمالاً مهمترین نوع آسیب پذیری ACE هستند.

اجرای کد های پویا:

اجرای کد پویا متداول ترین بردار حمله منتهی به آسیب پذیری RCE (Remote Code Execution) است. اکثر زبان های برنامه نویسی راهی برای تولید کد به همراه کد ها و اجرای آن در همان محل را دارند. این یک مفهوم بسیار قدرتمند است که به حل بسیاری از مشکلات پیچیده کمک می کند. با این حال ، نفوذگران می توانند به راحتی از آن برای بدست آوردن قابلیت های RCE سوء استفاده کند. اغلب ، کد تولید شده در زمان اجرا بر اساس برخی از ورودی های کاربر است. بیشتر اوقات ، کد شامل نوعی ورودی است. یک نفوذگر ، با درک اینکه کد پویا از ورودی معین استفاده می کند ، می تواند کد معتبری را به عنوان ورودی برای حمله به برنامه شما ارائه دهد. اگر ورودی های کاربر بررسی نشوند ، آن کد روی دستگاه مورد نظر اجرا می شود. به طور کلی ، اجرای کد پویا باعث دو دسته اصلی آسیب پذیری RCE می شود که عبارتند از :

  • روش مستقیم 
  • روش غیر مستقیم

اجرای کد از روش مستقیم:

در این روش در مورد اجرای مستقیم کد پویا ، هکر یا نفوذگر می داند که ورودی مورد نظر آن در تولید کد استفاده خواهد شد.

اجرای کد از روش غیر مستقیم:

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

آسیب پذیری RCE چیست؟

دلایل بوجود آمدن آسیب پذیری RCE کدام ها هستند؟

  • عدم امنیت در حافظه:

یکی دیگر از دلایل آسیب پذیری RCE مربوط به ایمنی حافظه است. ایمنی حافظه به معنای جلوگیری از دسترسی کد به قسمت هایی از حافظه است که کد را به عنوان ورودی دریافت نکرده است. از نظر بصری ، ممکن است انتظار داشته باشید که عدم وجود امنیت حافظه منجر به دسترسی غیر مجاز به داده ها شود. با این حال ، سیستم عامل و سخت افزار زیرین از حافظه برای ذخیره کدهای اجرایی واقعی استفاده می کنند. همچنین داده هایی در مورد اجرای کد نیز در حافظه ذخیره می شود. دسترسی به این نوع حافظه می تواند منجر به ACE و احتمالاً RCE شود.

  • اشکالات طراحی و ساخت در نرم افزار ها:

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

  • سرریز بافر یا بازخوانی بافر (Buffer overflow or buffer overread):

سرریز بافر (که همچنین به عنوان خوانده شدن بافر نیز شناخته می شود) یک روش نسبتاً ساده و شناخته شده برای نقض ایمنی حافظه است. از یک مشکل طراحی یا یک اشکال برای نوشتن به سلول های حافظه که پس از پایان واقعی یک بافر حافظه استفاده می شود ، سوء استفاده می کند. خود بافر از یک تماس مشروع به API عمومی بازگردانده می شود. با این حال ، بافر فقط به عنوان یک نقطه مبدأ برای محاسبه آدرس های حافظه فیزیکی مقادیر خصوصی فیلد برخی از اعضای شیء یا برنامه شمارنده عمل می کند. موقعیت نسبی آنها در برابر بافر یا به خوبی شناخته شده است یا ممکن است حدس زده شود. بررسی کد در صورت موجود بودن یا اشکال زدایی در اجرای برنامه در زمان اجرا ممکن است به یک نفوذگر در دستیابی به موقعیت های نسبی کمک کند.

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

بنابراین ، برنامه نویسان باید سرریزهای بافر را در اسرع وقت ، قبل از حمله واقعی RCE ، رفع کنند. بیشتر اوقات ، سرریز بافر کد های Cو C ++ را هدف قرار می دهد ، زیرا این زبانها در اندازه بافر کنترل ندارند. بسیاری از چارچوب ها و فناوری های محبوب دیگر از کتابخانه های C/C ++ در عمق سطح استفاده می کنند که به طور خودکار آنها را در برابر این نوع حملات آسیب پذیر می کند. Node.js مثال خوبی برای این مورد است زیرا علاوه بر اینکه مبتنی بر زبان های C و C++ است زمان اجرای کد جاوا اسکریپت به افزونه های بومی C و C ++ نیز اجازه اجرا شدن می دهد. به همین دلیل ، مهاجم می تواند با دقت درخواست ها را به سرور Node.js ارسال کند تا باعث سرریز بافر شود و در نتیجه حافظه سیستم را در دستگاه آسیب دیده تغییر دهد و باعث اجرای کد دلخواه شود.

  • اشکالات در طراحی و ساخت سخت افزار ها:

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

برای جلوگیری از حملات RCE چه کاری انجام دهیم؟

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

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

روش جلوگیری از باگ RCE در زبان PHP :

 این این باگ در صورت استفاده نادرست از تابع eval() به وجود می اید و برای رفع این اسیب پذیری باید ورودی خود را کنترل کنید و یا کارکتر های خاص مانند ();? را فیلتر کنید برای مثال به کد های زیر دقت کنید:

http://127.0.0.1/rce.php?id=1

در این ورودی میتواند کد های php خود را وارد کنید

http://127.0.0.1/rce.php?id=phpinfo();

در ورودی اسیب پذیر phpinfo را فراخوانی کرده ایم تا اطلاعات مربوط به سرور و php را نمایش دهد برای استفاده از این آسیب پذیری RCE می توانید حتی دستورات خود را هم در سرور با استفاده از تابع های php وارد کنید.

http://127.0.0.1/rce.php?id=exec(pwd);

در url بالا exec تابع اجرای دستور را فراخوانی کرده ایم و در ان دستور pwd برای نمایش مسیر فایل را وارد کرده کردیم حال می توانید به راحتی بکدور خود را در سرور برای کنترل سایت ایجاد کنید.

امیدوارم لذت برده باشید :)

کانال تلگرام : MehranKiyaNET@


مهران کیاء
مهران کیاء

متخصص تست نفوذ و امنیت

مهران کیاء , هکر کلاه خاکستری , فعال در حوزه تست نفوذ و امنیت , علاقه مند به مباحث شبکه و برنامه نویسی عاشق یادگیری و آموزش دادن. دوستان عزیز جهت مطرح کردن سوالات و مشکلات خودشون در دوره های آموزشی بنده میتونن از طریق کانال تلگرام اقدام کنند. https://t.me/MehranKiyaNET

نظرات