بخشی از مقاله
چکیده
وجود جریانهاي اطلاعاتی بین کاربران سرچشمهي برخی آسیبپذیريهاي امنیتی در نرمافزارها است. این جریانها میتواند زمینهي نقض خطمشیهاي کنترل دسترسی و عدم رعایت حریم خصوصی کاربران را فراهم آورد. مهمتر این که این جریانها عامل آسیبپذیري خطرناك و متداول تزریق نویسه ذخیره شده از طریق وبگاه - Stored XSS - است. کشف آسیبپذیري XSS ذخیره شده بسیار مشکل بوده و پویشگرهاي آسیبپذیري نیز نرخ تشخیص بسیار کمی در هنگام مواجهه با این دسته از آسیبپذیريها دارند. هدف این مقاله ارائه روشی بصورت جعبه سیاه است که بتواند جریانهاي اطلاعاتی میان کاربران مختلف یک نرمافزار تحت وب را تشخیص داده تا به کمک آن نقاط آسیبپذیر نسبت به XSS ذخیره شده آشکار شوند.
روش پیشنهادي میان نقشهاي مختلف موجود در برنامه تفاوت قائل شده و مبتنی بر خزش کامل صفحات به منظور ایجاد گراف برنامه و جستجو در آن است. بدین منظور ابتدا تمام نقاط دریافت ورودي در صفحات مختلف برنامه پیدا شده و میبایست با دادههاي مناسب، مقدار گیرند. سپس بررسی میشود که کدامیک از این وروديها به سمت کاربران دیگر جریان پیدا میکند و آیا وجود این جریان مخاطرهآمیز خواهد بود یا خیر. روش پیشنهادي پیادهسازي شده و نتایج حاصل حاکی از ثمربخش بودن آن در کشف آسیبپذیري ذکر شده است.
-1 مقدمه
در عصر کنونی کشف آسیبپذیريهاي موجود در برنامههاي کاربردي تحت وب امري بسیار مهم و در عین حال مشکل تلقی میشود . از جمله مشکلات پیشروي، عدم توانایی ابزارهاي کشف آسیبپذیري در رهگیري جریان اطلاعاتی بین کاربران در یک برنامهي کاربردي است که میتواند نشاندهندهي امکانپذیري برخی حملات نرمافزاري باشد. وجود این جریانها هرچند گاهی منطقی و لازم است ولی میتواند امکان سوءاستفاده را براي مهاجمان ایجاد کند تا بتوانند دادههاي مخرب خود را تولید کرده و به کمک وجود این جریان انتقالی، آن را به سمت دیگر کاربران برنامه روانه کنند.
از سویی دیگر بهدلیل بزرگ و پیچیده شدن برنامهها گاهی اوقات طراحان برنامه فراموش میکنند که وروديهاي کاربران در کدام صفحات جریان پیدا میکنند و توسط چه کسانی مشاهده خواهند شد. به عنوان مثال برنامهاي را درنظر بگیرید که در آن کاربران با نقشهاي مختلف مطالبی را با یکدیگر به اشتراك میگذارند. همچنین مدیر سامانه نیز قادر به مشاهده مطالب است. حال اگر کاربر مطلبی را آماده کند که در آن کدهاي مخرب نویسهي جاوا وجود داشته باشد، بعد از ورود مدیر به سامانه، این دادهي مخرب بر روي مرورگر او اجرا شده و حمله رخ میدهد . دلیل این امر وجود جریان اطلاعاتی از کاربر به سمت مدیر سامانه است که باعث شده است پارامتر ارسال شده توسط کاربر، توسط مدیر سامانه دیده شود . در حقیقت آسیبپذیري تزریق نویسه از طریق وبگاه1 از مصادیق این جریان اطلاعاتی است.
علاوه بر وجود جریانهاي اطلاعاتی که برنامهنویس و طراح آگاهانه در برنامه قرار دادهاند، جریانهایی از داده نیز وجود دارند که بهصورت ناخواسته در برنامه قرار گرفتهاند و بجز مالک داده - و شاید بعضی از کاربران خاص - دسترسی سایرین به آن داده، نوعی نقض کنترل دسترسی است. دلیل این مسأله، عدم کنترل صحیح جریانهاي اطلاعاتی برنامه توسط طراح است که باعث نشت اطلاعات میشود. در هر حال لازم است در هنگام ارزیابی امنیتی یک نرمافزار تمام این موارد آشکارسازي شود تا ذينفعان برنامه متوجه این مخاطرات باشند و از سوءاستفادههاي آتی جلوگیري به عمل آید.
از سویی دیگر ابزارهاي خودکار کشف آسیبپذیري نسبت به تشخیص مخاطرات ناشی از وجود جریان اطلاعاتی، مخصوصا XSS ذخیره شده که درجه تخریب بالایی دارد، داراي عملکرد مناسبی نیستند و نرخ تشخیص پایینی دارند .[1,8,9] دلیل این مسأله این است که وجود این جریانها به منطق برنامه برمیگردد و یک ماشین نمیتواند در مورد درستی و یا نادرستی منطق حاکم بر یک نرمافزار درك صحیحی داشته باشد .[2]
در این مقاله میخواهیم مشخص نماییم که ورودي وارد شده توسط هر یک از کاربران در کدام صفحه و توسط کدامیک از کاربران دیگر - به همراه نقش این کاربر در سامانه - دیده میشود . بر این اساس میتوانیم جریان اطلاعاتی موجود بین کاربران مختلف را شناسایی کرده و سپس از آن براي تشخیص آسیبپذیري XSS ذخیره شده استفاده کنیم. براي این منظور یک سامانه با نام »جریانیاب وب« پیادهسازي شده است که با گرفتن اطلاعات کاربران یک نرمافزار - در نقشهاي مختلف - و خزش کامل در صفحات آن، جریانهاي اطلاعاتی بین کاربران را استخراج کره و و از آن، جهت تشخیص آسیبپذیري XSS ذخیره شده استفاده میکند.
این اطلاعات میتواند در جهت تشخیص مخاطرات نرمافزار، به طراح و ارزیاب برنامه کمک فراوانی کند. استفاده از روش جعبهسیاه و شناسایی تمام جریانهاي اطلاعاتی، مابین تمام کاربران نوآوري این مقاله محسوب میگردد. ساختار مقاله به این ترتیب میباشد: در بخش 2، کارهاي مشابه معرفی میشود . در بخش 3، روش پیشنهادي توضیح داده میشود. پیادهسازي و ارزیابی روش پیشنهادي در بخش 4 ارائه میشود. در نهایت در بخش 5 نتیجهگیري و کارهاي آتی بیان میگردد.
-2 کارهاي مشابه
اکثر مطالعات و فعالیتهاي انجام گرفته شده در زمینهي کشف جریانهاي اطلاعاتی، بصورت جعبهسفید بوده است .[3,4,5] بطور کلی روشهاي جعبهسفید داراي نرخ مثبت کاذب بالا هستند. دلیل این موضوع متکی بودن آنها به کد برنامه است. بنابراین ابزارهاي بررسی این روش اکثراً توانایی بررسی تعداد محدودي از زبانهاي برنامهنویسی را دارند. در مقابل، روشهاي جعبه سیاه داراي نرخ مثبت کاذب کم و نرخ منفی کاذب بالا هستند .[2]
در [1] به کمک استفاده از جریان کنترلی، جریان داده و عملیات دقیقتر فازینگ2، چارچوبی جعبهسیاه براي کشف حمله XSS ارائه شده است. در این روش ابتدا به کمک یک خزشگر مناسب، جریان کنترلی برنامه کشف میشود. در ادامه به کمک ارسال درخواستهاي زیاد HTTP و دریافت نتایج آنها جریان دادهاي ایجاد میشود. با ادغام دو مرحلهي بالا گراف برنامه شکل خواهد گرفت. سپس گراف هرس شده و عملیات فازینگ صورت میگیرد و با بررسی نتایج حاصل، آسیبپذیريها مشخص میشوند. لازم به ذکر است توانایی کشف جریانهایی همچون جریان اطلاعاتی میان کاربر با مدیر سیستم، در این روش وجود ندارد . مرجع [7] نیز در ادامهي [1] بوده و نوآوري آن در بخش تولید دادههاي مخرب و فازر آن است.
در [2] ابزاري خودکار ارائه شده است که میتواند آسیبپذیريهاي نوع ذخیره شده و بازتابی XSS را در برنامههاي کاربردي وب کشف کند. هسته اصلی این ابزار پویشگر آسیبپذیري آنها است. در این مقاله از تکنیکهایی استفاده شده است تا بتوان عمق بیشتري از برنامه کاربردي وب را پیمایش کرد و درنتیجهي آن فازینگ بهتري انجام داد تا بتوان آسیبپذیريهاي بیشتري را کشف کرد. ایدهي اصلی به این ترتیب است که دادهي مربوط به تعاملات یک کاربر واقعی با برنامه ثبت میشود تا از آن براي تولید کردن دادههاي مناسب براي پرکردن مقادیر مربوط به فرمها استفاده شود.
در [6] روشی جعبهسیاه براي کشف آسیبپذیريهاي XSS چندگامی ارائه شده است. در این رساله از یک خزشگر مبتنی بر جریان کاري3 استفاده شده است که سعی میکند گراف برنامه را بطور کامل استخراج نماید. براي بدست آوردن گراف برنامه از تعاملات کاربر با مرورگر و همچنین پاسخهاي داده شده به درخواستهاي HTTP استفاده میشود. سپس با ارسال دادههاي مخرب و تحلیل جوابهاي برگشتی، آسیبپذیريها را کشف میکند. به کمک این روش حملاتی از XSS تشخیص داده میشود که نتیجهي اجراي نویسه در طول نشست مربوط به همان کاربر دیده شود. یعنی، حملات ناشی از وجود جریان اطلاعاتی بین دو کاربر در نشستهاي مختلف کشف نمیشود.
در [3] به کمک زبانی سطح بالا تحت عنوان PQL این امکان فراهم شده است که کلاسهاي جریانهاي اطلاعاتی مختلف تعریف شوند که از آنها به عنوان الگوهاي کشف استفاده شده است. به عنوان مثال میتوان الگوي تزریق SQL را که شامل جریان اطلاعاتی از ورودي کاربر تا پایگاه داده است در چند خط به کمک PQL نوشت . رویکرد این تحقیق بصورت جعبه سفید است. از سویی دیگر یک خبره از قبل میبایست تمام جریانهاي اطلاعاتی ممکن را به ازاي هر آسیبپذیري استخراج کرده و به ازاي زبان برنامه نویسی مربوطه مدل کند.
-3 روش پیشنهادي
روش پیشنهادي این مقاله با هدف تشخیص آسیبپذیري XSS ذخیره شده، بوسیلهي شناسایی جریانهاي اطلاعاتی بین کاربران سامانه مطرح شده است. منظور از جریان اطلاعاتی، تبادل داده بین کاربران با نقشهاي مختلف در برنامه است که باعث میشود ورودي وارد شده توسط یک کاربر، توسط کاربر دیگري، با نقشی یکسان و یا متمایز، دیده شود. براي این منظور برنامه باید توسط کاربران مختلف - بهصورت خودکار یا دستی - مورد خزش قرار گیرد. سپس با پردازش دادههاي مبادله شده بین کاربران، کل پارامترهاي جریان یافته بین آنها و همچنین پارامترهایی که در معرض آسیبپذیري XSS ذخیره شده هستند شناسایی میشود. مقداردهی این پارامترها با وروديهاي خطرناك و سپس بررسی واکنش نرمافزار، بیانگر آسیبپذیر بودن یا نبودن نرمافزار در مقابل حمله XSS ذخیره شده است.
بر این اساس، بعد از تشخیص جریانها، دو جدول خواهیم داشت که در جدول نخست کل پارامترهاي جریان پیدا کرده میان کاربران نرمافزار وجود خواهد داشت. این جدول به طراح برنامه کمک میکند که نحوهي ارتباط میان کاربران برنامه و پارامترهاي جریان پیدا کرده میان آنها را درك کند و در صورتی که این ارتباط با سیاستهاي از پیش تعیین شده براي برنامه در تناقض بود، در جهت رفع تناقضها گام بردارد. همچنین در جدول دوم پارامترهایی وجود خواهد داشت که مقدار آن از سوي یک کاربر به سمت کاربر دیگري جریان پیدا کرده و مستعد حملهي XSS ذخیره شده است.
این جدول به ارزیاب برنامه کمک میکند که فقط بر نقاطی از برنامه تمرکز کند که مستعد سوءاستفاده از آسیبپذیري هستند. شکل - 1 - مؤلفههاي اصلی در روش پیشنهادي و شکل - 2 - مراحل اجراي روش پیشنهادي را نشان میدهند. همان طور که از شکل - 1 - مشخص است روش پیشنهادي داراي سه مولفهي اصلی خزشگر، پیشکار - پروکسی - و موتور تشخیص جریان اطلاعاتی است. تمرکز این مقاله بر روي فرایند تغییر مقادیر در پیشکار و موتور تشخیص جریان اطلاعاتی است. همچنین از شکل - 2 - قابل اسنتتاج است که روش ارائه شده در این مقاله داراي هشت مرحلهي اصلی است:
1. مشخص کردن نقشهاي موجود در برنامه
2. ارائه اطلاعات کاربري دو کاربر از هر نقش
3. خزش کامل صفحات کاربران وارد کننده ورودي - کاربران اول هر نقش -
4. پردازش درخواستهاي ارسال شده براي کارگزار
.4,1 استخراج، مقداردهی و ذخیرهي پارامترها
5. خزش کامل صفحات کاربر واردکننده ورودي و همچنین کاربران دوم هر نقش
6. پردازش پاسخهاي ارسالشده توسط کارگزار
7. کشف تمام جریانهاي اطلاعاتی موجود میان کاربران برنامه
8. کشف جریانهاي مخاطرهآمیز نسبت به آسیبپذیري XSS ذخیره شده کاربران مختلف موجود در برنامه داراي سطح دسترسی و نقشهاي متفاوتی هستند و به اشیائی دسترسی دارند که سایرین دسترسی ندارند. همچنین کاربران موجود در یک نقش داراي امتیازات یکسانی هستند. بنابراین براي عملکرد بهینه نیاز است که جریانهاي اطلاعاتی میان نقشهاي موجود و نه میان تمام کاربران برنامه کشف شود. از آنجایی که ممکن است کاربران موجود در یک نقش نیز به یکدیگر حمله کنند، دو کاربر به ازاي هر نقش درنظرگرفته میشود تا جریان میان کاربران هر نقش نیز یافت شود.
منظور از کاربر وارد کنندهي ورودي، کاربري است که پارامترهاي ارسال شده توسط او به سمت کارگزار، توسط سایر کاربران که دریافتکنندهي این پارامترها هستند، دیده میشود. بنابراین به منظور کشف کامل جریانهاي اطلاعاتی میان کاربران، میبایست در فاز اول، ابتدا با اطلاعات کاربران اول هر یک از نقشها، مراحل خزش و »پردازش درخواستها« انجام شود . سپس در فاز دوم، علاوه بر تمام کاربران دوم از هر نقش، بهازاي کاربران اول نیز دوباره مراحل خزش و »پردازش پاسخها« صورت میگیرد. بنابراین علاوه بر جریانهاي میان کاربران مختلف، جریان موجود در نشستهاي یک کاربر نیز شناسایی میگردد. در اینصورت مطمئن هستیم هنگامی که صفحات یک کاربر در فاز دوم جهت یافتن جریان، خزش و جستجو میشود، تمام پارامترهایی که مستعد جریان یافتن بهسمت این کاربر هستند را کشف خواهیم نمود.
-1-3 تعریف پارامتر و جریان اطلاعاتی
براي مشخص شدن منظور ما از پارامتر و جریان اطلاعاتی، در این بخش تعریفی از آنها بیان میگردد. هر یک از دادههایی که از سوي کارخواه براي کارگزار فرستاده میشود بصورت زوج - نام، مقدار - هستند که توسط یک کاربر و در صفحهاي مشخص از برنامه، براي کارگزار ارسال میگردد. بنابراین هر پارامتر p را بصورت یک چهارتایی - u , l, n , v - تعریف مینماییم که u کاربر وارد کننده ورودي، l صفحهاي که از آنجا دادهها ارسال میشود، n نام داده و v مقدار داده است. براي مقداردهی l از متغیر Referrer موجود در درخواستها استفاده میشود. بدیهی است که هر کاربر میتواند چندین پارامتر با نام و مقادیر مختلف در یک صفحه داشته باشد.