در بحث امنیت سیستم، “arbitrary code execution” برای توصیف توانایی اتکر در اجرا کردن هر کامندی بر روی سیستم هدف و یا فرآیندی بر روی آن است. دقت کنید! منظورم از عبارت ” هر کامندی ” دقیقا همه کامندها را شامل میشود و نحوه و کیفیت اجرای این حمله بستگی به مرام هکر محترم دارد!
آسیب پذیری که منجر به این اجرای این کامندها از سمت هکر میشود، در واقع توصیف عملی یک باگ نرمافزاری ست که راه را برای هکر هموار میکند.
در ادامه تعریف مفاهیم مورد نیاز، به تشریح مفهوم exploit رسیدیم. اکسپلویت بر خلاف اسم نه چندان دلچسبی که دارد، چیزی جز یک برنامه از پیش نوشته شده برای سوء استفاده از آسیبپذیری گفته شده نیست. در واقع میتوان گفت که اکسپلویت، راه تکنیکال و عملی برای استفاده غیرمجاز از آسیبپذیری یا همان باگ نرمافزاری ست. دستم را از سر اکسپلویت بر داشته و سر بحث را به همان آسیبپذیری خودمان بر میگردانم.
اکثر این آسیبپذیریها یا همان باگهای نرمافزاری، اجازه اجرا کامند در سطح ماشین را میدهند و این همان نقطهای ست که یک اتکر با اتکا بر آن میتواند با استفاده از تزریق و اجرای شلکد، بصورت دستی هر کامندی را ااجرا کند. هر کامندی!!
حال با تمام توصیفات بالا، اگر این امکان وجود داشته باشد که از یک سیستمی بر روی یک سیستم دیگر – بخصوص از طریق شبکهای مثل اینترنت – کدی را اجرا کرد، اصطلاحا به این عمل “Remote Code Execution” گویند.
حالا که کمی با تعریفات اولیه آشنا شدیم، قصد دارم تا دامنه بحث را کمی گسترده تر کنم.
از آنجایی که “arbitrary code execution” در اکثر اوقات به منظور تزریق کد ( تزریق کد به یک سیستم عملیاتی) استفاده میشود، یوزر میتواند بر اساس زبانهای مورد نظر خودش مثل اسمبلی، کد را نوشته و سپس خود سیستم اقدام به ایجاد و فعال کردن اسکریپتهای آماده بر اساس آن میکند. علاوه بر این، در موارد خاص هم یک یوزر میتواند با کمک شبیهسازها (emulators) و ورودیهای از پیش مشخص شده، کد را مدیریت کرده و آن را در قالب یک نسخه بدوی و ساده از یک game مثل super Mario، در سیستم هدف اجرا کند.
این بدترین حالت ممکن از تاثیرگذاری یک باگ در سیستم است؛ چرا که به مهاجم این امکان را میدهد تا کنترل کامل فرآیند سوء استفاده از آسیبپذیری موجود را به عهده بگیرد. آسیبپذیریهای “arbitrary code execution” معمولا بوسیله malware ها – برای اجرا در سیستم هدف – مورد اکسپلویت یا بهرهبرداری قرار میگیرند که این موضوع بدون اطلاع و نقش مستقیم owner سیستم صورت میپذیرد.
اجرای کد معمولا از طریق کنترل بر “instruction pointer” یک پروسه در حال اجرا انجام میشود. اما در باب اینکه خود instruction pointer چه موجود عجیب و غریبی میباشد!!! باید گفت که این اشارهگر به دستورالعمل بعدی در پروسه که باید اجرا شود، اشاره میکند. اتکر اگر بتواند مقدار این اشارهگر را تحت کنترل خود درآورد، در ادامه خواهد توانست بر دستورالعمل بعدی که پروسه اجرا خواهد کرد نیز کنترل داشته باشد.
اما در عمل برای تزریق، اکسپلویتهای زیادی کد را به پروسه تزریق میکنند (بطور مثال با ارسال input به پروسه که آن را در یک input buffer در رم نگهداری میکند). در مرحله بعد با استفاده از آسیبپذیری موجود، مقدار instruction pointer به چیزی تغییر داده میشود که به کد تزریق شده، اشاره کند.
در مرحله بعد کد تزریق شده، بصورت خودکار اجرا میشود. این نوع از حمله، از این واقعیت سود میبرد که بسیاری از سیستمها تفاوت کلی بین دیتا و کد قائل نیستند؛ بنابراین اتکر میتواند کد مورد نظر خود را بصورت مخفی و به عنوان input data ای بیآزار!! جا بزند. البته در بسیاری از CPU های جدید مکانیزمی اعمال شده است تا انجام چنین موضوعی را سختتر نماید.
مانا باشید
احسان امجدی / کارشناس و مدرس دورههای تحلیل امنیت
“اگر بر این باورید که با نقض قانون کپیرایت، وضعیتی بهتر در انتظارمان خواهد بود، بدون ذکر نامِ نویسنده و منبع، مجاز به انتشار مطالب هستید. “