اختلال در سرویس دهی از طریق Hash table
۲۲ دی ۱۳۹۰
نوشته شده توسط
حمید
در دسته بندی:
دستهبندی نشده
در بیست و هشتیمین کنفرانس CCC که در آلمان برگزار شد شاهد یک ارایه جنجالی بودیم. در این ارایه سعی شده بود که توانایی ها و ضعف های زبانهای برنامه نویسی مختلف در زخیره سازی داده های در جداول درهم سازی Hash table مورد بررسی قرار بگیرد. همچنین نشان داده می شود که زبان های برنامه نویسی متعددی نظیر ASP.NET , PHP , Ruby, Python, Java و محصولات مختلفی از این آسیب پذیری رنج می برند.
بطور خلاصه می شود گفت که زبان های برنامه نویسی برای زخیره کلید و مقدار عددی متناظر از Hash table استفاده می کنند زیرا برخلاف دیگر ساختار های داده (نظیر لینک لیست) بصورت میانگین سرعت بسیار بالاتری دارد. یک Hash table می تواند با نسبت n (تعداد رکوردها) دادها را وارد ساختاد داده کند. اما در یک لینک لیست زمان و پردازش مورد بسیار بیشتر و متناسب با n به توان ۲ است. اما توجه کنید که تمامی این محاسبات برای Hash table در حالت میانگین و عادی است. در بدترین حالت (که بصورت تصادفی بسیار بعید است) یک Hash table مثل یک لینک لیست به زمانی متناسب با n به توان ۲ نیاز خواهد داشت. (البته در این حالت از لینک لیست نیز ضعیف تر خواهد بود زیرا به یک مرحله Hashing نیز افزوده می شود) این حالت زمانی رخ می دهد که تمامی کلیدها مقادیر هش یکسانی داشته باشند. توابع در همسازی Hashing رایج در Hash table استفاده شده در زبانهای برنامه نویسی نظیر DJBX33A و یا DJBX33X توابعی سریع٬ اما ضعیف هستند (برخلاف توابعی مثل MD5 و یا SHA-X) به همین دلیل پیدا کردن لیست بلندبالایی از کلیدهایی که هش یکسان تولید می کنند کار پیجیده ای به شمار نمی رود. زبان های برنامه نویسی تحت وب نظیر PHP, ASP.NET عموما برای زخیره Associative Array همانند $myarray[mykey] و همچنین نام متغیرهای ورودی POST,GET, COOKIE از Hash Table استفاده می کنند. در حمله عنوان شده مقدار زیادی از این کلیدهای محاسبه شده و تمامی آنها به یکباره به برنامه ارسال می شود. حجم بالای محاسبات در سرور در نهایت باعث کاهش شدید کارایی سرور خواهد شد.
راهکار توصیه شده آن است که یا تابع هش تقویت شود که بسیار پرهزینه است و یا آنکه تابع هش Randomize شود ( یک مقدار تصادفی در آغاز سرور وارد تابع هش شود) و راهکارهای ناقص دیگری نظیر محدود کردن تعداد متغیر های ورودی که در PHP استفاده شده است چندان توصیه نمی شود زیرا با روش های دیگر امکان حمله به Associative Array ممکن خواهد بود.)
در ادامه مشاهده و خواندن مطالب زیر توصیه میشود.
مقابه ای که در سال ۲۰۰۳ برای اولین بار این گونه حملات را تشریح کرد
کد مخرب برای تست آسیب پذیری بر روی PHP