آسیب پذیری Race Condition چیست و چطور با استفاده از آن حساب بانکی مان را شارژ کنیم!

آسیب پذیری Race Condition چیست و چطور با استفاده از آن حساب بانکی مان را شارژ کنیم!

Race Condition چیست؟

Race Condition اتفاق غیره منتظره ایست که وقتی پیش می آید که یک سیستم تلاش می کند دو کار را همزمان انجام دهد، در حالی که ماهیت سیستم ایجاب می کند که کارهای با توالی خاصی پشت سر هم انجام شوند تا آن سیستم به درستی کار کند.

یکی از بزرگترین تهدیدهای بانکداری آنلاین همین آسیب پذیری حاصل از Race Condition است. این آسیب پذیری با یک خطای ساده ی برنامه نویسی رخ می دهد که این خطا بین برنامه نویسان خیلی رایج است و البته هزینه ی سنگینی هم دارد.

هکر ها با استفاده از آسیب پذیری حاصل از Race Condition  می توانند مبلغ بسیار زیادی پول از بانکهای آنلاین، کارگزاری های سهام و صرافی ها بدزدند. حتی این آسیب پذیری باعث شد تا هکری بتواند به صورت نامحدود از استارباکس قهوه بگیرد!

در علوم کامپیوتر، Concurrency یا همان همزمانی قابلیتی است که بخش های مختلف برنامه بتوانند به صورت همزمان اجرا شوند و بدون اینکه تاثیری روی هم داشته باشند نتیجه ی نهایی حاصل شود.

وقتی یک برنامه، با ذهنیت Concurrency توسعه داده می شود، آن برنامه می تواند از مزایای Multithreading (مولتی تردینگ یا چندنخی) و Multiprocessing (مولتی پروسِسینگ یا چند پردازه ای) بهره مند شده و در نتیجه بهره وری عملکرد آن به شدت افزایش پیدا می کند.

Multithreading توانایی ای است که طی آن می توان چندین Thread  (رشته ای از کارها) را در CPU  اجرا کرد. این Thread ها همزمان اجرا نمی شوند بلکه از قدرت محاسباتی CPU  به نوبت استفاده می کنند. با قابلیت Multithreading هر کدام از Thread ها می توانند از منابع محاسباتی CPU، در زمانی که مثلا thread اصلی منتظر است تا برنامه ورودی ای را دریافت کند، استفاده کنند.

Multiprocessing هم به معنی استفاده از چند CPU برای پردازش همزمان است.

سامان دادن به توالی اجرای چندین Thread را Scheduling (اسکژولینگ یا زمانبندی) می گویند. که الگوریتم های زمانبندی متعدد و مختلفی وجود دارد که هر کدام برای شرایط خاصی بهینه سازی شده اند.

در کامپیوتر Race Condition زمانی اتفاق می افتد که دو بخش از کد، که طراحی شده اند تا برای اجرا از توالی خاصی پیروی کنند به صورتی خارج از آن توالی پیش بینی شده اجرا شوند. از آنجایی که الگوریتم زمان بندی در هر زمان ممکن است Thread خاصی را اجرا کند پس شما نمی توانید دنباله ی کارهایی که Thread اجازه پیدا کرده است تا انجامش بدهد را پیش بینی کنید.

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

به صورت ایده آل توالی اجرای این برنامه به صورت زیر است:

 

اما اگر این دو Thread بصورت همزمان اجرا شوند، و البته اگر Resource Locks (مکانیزمی که جلوی اجرای بقیه ی Thread ها روی یک مقدار یا منبع خاص را می گیرد.) و Synchronization (مکانیزمی که تضمین می کند Thread هایی که از یک منبع استفاده می کنند یا قرار است روی یک مقدار کار کنند همزمان اجرا نمی شوند.) وجود نداشته باشد، زمان بندی اجرای برنامه به صورت زیر می تواند باشد.

در این شرایط مقدار نهایی یک خواهد بود که خوب اشتباه است و انتظار ما عدد دو بود.

این اتفاق برای این می افتد که خروجی اجرای یک Thread به خروجی Thread  دیگری وابسته است. پس وقتی این دو Thread با هم اجرا می شود ممکن است خروجی غیرمنتظره ای داشته باشیم.

 

آسیب پذیری های امنیتی حاصل از Race Condition

Race Condition زمانی به یک آسب پذیری (vulnerability) تبدیل می شود که روی مکانیزم کنترل امنیت برنامه تاثیر بگذارد. هکرها می توانند برنامه ی ما را در شرایطی قرار بدهند که یک کار حساس قبل از اجرای کامل سیستم های کنترل امنیتی اجرا شود. برای همین هم هست که از آسیب پذیری Race Condition به عنوان آسیب پذیری زمان بررسی (Time of Check) یا زمان استفاده (Time of Use) هم نام می برند.

تصور کنید اگر دو Threadای که در مثال بالا توضیح دادیم کار حساس تری مثل انتقال پول در یک بانک الکترونیکی را بر عهده داشتند چه اتفاقی می افتاد.

این برنامه برای انتقال صحیح پول بین حساب های بانکی باید سه کار را انجام بدهد:

1- موجودی حساب مبدا را بررسی کند که آیا به اندازه ی کافی موجودی دارد یا خیر.

2- پول مورد نظر را به حساب مقصد اضافه کند.

3- مقدار انتقال داده شده را از موجودی مبدا کسر کند.

فرض کنید شما دو حساب در بانک دارید. حساب جاری و حساب قرض الحسنه. در حساب جاری تان 500 هزار تومان پول دارید و در حساب قرض الحسنه هیچ پولی ندارید. و دو درخواست انتقال پول 500 هزار تومانی از حساب جاری به قرض الحسنه را ثبت می کنید.

به صورت ایده آل عکس العمل برنامه به این دو درخواست باید به صورت زیر باشد.

اما اگر این دو درخواست را به صورت همزمان ارسال کنید ممکن است شما برنامه را در شرایطی قرار دهید که دو Thread به صورت زیر اجرا شوند.

توجه کنید که در این سناریو شما در انتها پول بیشتری نسبت به لحظه ی شروع کار دارید. شما با بهره کشی (Exploiting) از آسیب پذیری Race Condition 500 هزار تومان بدست آوردید (درواقع دزدیدید :D).

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

هک استارباکس با آسیب پذیری Race Condition

یکی از نمونه های با حال بهره کشی از این آسیب پذیری در دنیای واقعی، هک استارباکس توسط محقق امنیت Egor Homakov است.

او با بهره کشی از یک آسیب پذیری Race Condition در صفحه ی کارت هدیه ی استاباکس، توانست راهی پیدا کند تا کارت هدیه خود را برای استفاده از استاباکس تا بی نهایت بار شارژ کند.

این آسیب پذیری در تابعی رخ می داد که قرار بود موجودی یک کارت هدیه را به کارت هدیه ی دیگری منتقل کند. این وب سایت از متد POST زیر برای این انتقال استفاده می کرد.

POST /step1?amount=5&from=card_A&to=card_B

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

ایگر هوماکف در مقاله ای که در اینجا میتوانید بخوانید جزئیات بیشتری را درباره ی این حمله توضیح داده است.

برنامه های آسیب پذیر در مقابل آسیب پذیری Race Condition

Race Condition برای دور زدن و بلا استفاده کردن کنترل دسترسی استفاده می شود پس حداقل در تئوری، هر برنامه ای که عملکرد حساسی دارد و برای این کار روی مکانیزم های کنترل دسترسی حساب باز کرده است، آسیب پذیر خواهد بود.

بیشتر اوقات هکرها روی وب سایت های مالی این آسیب پذیری را بررسی می کنند چرا که در صورتی یافتن این آسیب پذیری روی یکی از عملکردهای اصلی این برنامه ها مثل شارژ حساب، کارت به کارت و انتقال مالی می توانند از این راه پول زیادی به جیب بزنند!

برنامه های دیگری که در معرض این خطر قرار دارند سایت های فروشگاهی، بازی های آنلاین و سیستم های رای گیری آنلاین هست.

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

 

بهره کشی از Race Condition

بیشتر مواقع، شما می توانید با ارسال تعدادی درخواست همزمان به یک برنامه ی وب، آسیب پذیر بودن آن در برابر Race Condition را بررسی کرده و البته بهره کشی کنید!

برای مثال اگر شما بخواهید پولی بیشتر از موجودی حسابتان را برداشت کنید می توانید با دستور cURL درخواست های همزمانی را به سرور بانک تان ارسال کنید.

curl (withdraw 3000) & (withdraw 3000) & (withdraw 3000) & (withdraw 3000) & (withdraw 3000) & (withdraw 3000)

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

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

جلوگیری از Race Condition

کلید اصلی در جلوگیری از Race Condition استفاده و بهره برداری ایمن از Concurrency است. و بهترین راه این کار هم قفل کردن منبعی است که در حال استفاده از آن هستیم. بیشتر زبان های برنامه نویسی که از قابلیت Concurrency پشتیبانی می کنند به صورت داخلی نیز نوعی قابلیت قفل کردن منابع را دارند. برای درک بهتر این موضوع به مستندات زبانی که برای برنامه تان انتخاب کرده اید مراجعه کنید.

بالاتر از آن، رعایت کردن اصول برنامه نویسی ایمن مثل "اصل حداقل دسترسی (the least privilege principle) و البته بازبینی های منظم کد جهت یافتن اشکالات امنیتی ای مانند این است که می تواند برنامه ی شما را در مقابل آسیب ها محفوظ کند.

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

 

نظرات
اگر login نکردی برامون ایمیلت رو بنویس: