نگاره‌هایی پیرامون امنیت، شبکه و رمزنگاری

28 فوریه 2020

در نوشتار قبلی به عنوان مقدمه، سعی شد که مفاهیم DOM و SOP به شکل ساده بیان شوند.اگر با این مفاهیم آشنا نیستید، پیشنهاد می شود به مطلب زیر مراجعه کنید:

مفهوم DOM و مکانیزم امنیتی Same-Origin Policy

چند ماه پیش، یک آسیب پذیری  در مرورگر موزیلا فایرفاکس کشف و برطرف گردید که به واسطه ی آن، مهاجم قادر به دور زدن SOP و سرقت فایل های محلی در نسخه های آسیب پذیر می باشد. تمام نسخه های منتشر شده ی فایرفاکس در 17 سال اخیر (2002 تا 2019، تا نسخه ی 67) دارای این آسیب پذیری هستند و شناسه ی CVE-2019-11730 به این آسیب پذیری اختصاص یافته است. نرم افزار ایمیل Mozilla Thunderbird  نیز دارای آسیب پذیری مشابه می باشد:

https://thehackernews.com/2019/07/firefox-same-origin-policy-hacking.html

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-11730

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

جزئیات فنی آسیب‌پذیری

همان گونه که در مطلب قبل اشاره شد، SOP در مورد برخی آدرس ها به شکل خاصی اعمال می شود. از جمله ی این آدرس ها، آدرس های مربوط به فایل های محلی هستند که protocol آن ها برابر :file است. تعریف SOP در مورد این آدرس ها به این شکل بود:

هر فایل نسبت به فایل های دیگر در دایرکتوری یکسان، origin یکسان دارد. بنابراین، این فایل ها می توانند به همدیگر دسترسی داشته باشند. دایرکتوری والد، origin متفاوتی دارد و یک فایل نمی تواند به لیست فایل های موجود در دایرکتوری والد دسترسی داشته باشد.

مثال 1:

دو فایل A و B می توانند به هم دسترسی داشته باشند، چون که هر دو در دایرکتوری یکسان X هستند.

مثال 2:

دو فایل A و B نمی توانند به هم دسترسی داشته باشند، چرا که هر یک در دایرکتوری متفاوتی هستند.

مثال 3:

فایل A نمی تواند به لیست فایل های دایرکتوری والد دسترسی داشته باشد.

طبق قواعد بالا، یک فایل HTML محلی می تواند محتویات فایل های موجود در دایرکتوری یکسان را بخواند و به مهاجم بفرستد اما این کار چندان راحت نیست. فرض کنید فایل stealer.html می خواهد فایل های موجود در دایرکتوری X را بخواند و به مهاجم ارسال کند. آدرس فایل های موجود به این شکل است:

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

اول، حدس زدن نام فایل ها با تکنیک Brute Force. می توان لیستی از نام های معمول را برای پیدا کردن فایل های موجود چک کرد. مثلاً با استفاده از این روش می توان در نمونه ی بالا فایل passwords.txt را پیدا کرد اما نام فایل ZWFzdGVyX2VnZzop.png را نمی توان حدس زد. این روش شانس موفقیت خیلی کمی دارد.

دوم، مراجعه به دایرکتوری والد برای پیدا کردن لیست فایل های موجود. همان طور که ذکر شد، SOP جلوی این روش را می گیرد. (یک فایل نمی تواند به دایرکتوری والد دسترسی داشته باشد.)

به مثال زیر توجه شود:

در این مثال، فایل test.html که در دایرکتوری tmp/ قرار دارد، می خواهد لیست فایل های موجود در این دایرکتوری را به دست بیاورد ولی خطای امنیتی رخ می دهد، اما اگر ما در SOP یک آسیب پذیری پیدا کنیم تا بتوانیم به لیست دایرکتوری والد دسترسی داشته باشیم چطور؟

ابتدا آدرس دایرکتوری tmp/ را بارگذاری می کنیم و سپس از لیست روی فایل test.html کلیک می کنیم:

سپس، دوباره سعی می کنیم که به دایرکتوری والد دسترسی داشته باشیم. انتظار داریم دوباره خطای امنیتی رخ بدهد:

برخلاف قبل، خطای امنیتی رخ نداد و فایل test.html توانست به لیست فایل های موجود در دایرکتوری والد (tmp/ ) دسترسی داشته باشد! پس می توان نام فایل ها را استخراج و آن ها را تک به تک خوانده و به مهاجم ارسال کرد!

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

برای اکسپلویت این آسیب پذیری دو شرط لازم است:

1- فایل به صورت محلی (لوکال) باز شود.

2- یک کلیک لازم است. برای گرفتن کلیک می توان از روش کلیک دزدی (Clickjacking) استفاده کرد.

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

سنایوی حمله و اکسپلویت آسیب‌پذیری

سناریو های مختلفی برای اجرای حمله با استفاده از این آسیب پذیری وجود دارد. چند سناریو ذکر می شود:

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

در این بخش، سعی می شود یک سناریوی جذاب پیاده شود: سرقت فایل های قربانی در پیام رسان تلگرام با استفاده از یک فایل HTML مخرب!

سناریو ما به این شکل است:

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

پس از آن که قربانی فایل را باز کرد، می توان به دو روش فایل ها را شناسایی کرد:

  1. تکنیک Brute Force، در این روش کافی است قربانی تنها فایل HTML را باز کند.
  2. بارگذاری دایرکتوری والد در یک عنصر Iframe برای کلیک دزدی و اکسپلویت آسیب پذیری SOP (در این جا دایرکتوری والد، دایرکتوری فایل های تلگرام خواهد بود)

از روش دوم استفاده می کنیم.

فرض کنید که فایل اکسپلویت exploit.html را در پیام رسان تلگرام به قربانی ارسال می کنیم، فایل پس از دانلود در این آدرس قرار می گیرد (درنسخه ی دسکتاپ تلگرام برای لینوکس):

file:///home/user/Downloads/Telegram Desktop/exploit.html

اگر دایرکتوری والد را در یک Iframe بارگذاری کنیم به این شکل خواهد بود:

برای اکسپلویت آسیب پذیری یاد شده، قربانی باید روی exploit.html در لیست کلیک کند تا بتوان به نام سایر فایل های موجود در لیست با دور زدن SOP دسترسی پیدا کرد. برای گرفتن کلیک، از روش Clickjacking استفاده می کنیم. در این روش قربانی معمولاً برای کلیک روی یک لینک یا صفحه مخرب فریب داده می شود. برای کسب اطلاعات بیشتر در مورد این روش، می توانید به ویدیوی آموزشی زیر مراجعه کنید:

تشریح آسیب‌پذیری Click-Jacking و نحوه دفاع

اما مشکلی در استفاده از Clickjacking وجود دارد که باید حل شود:

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

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

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

جایگاه اول در لیست دو ویژگی دارد:

  1. همواره موجود است، چرا که حداقل یک فایل در لیست خواهد بود (حداقلی ترین حالت، وجود یک فایل در لیست است و آن هم خود فایل اکسپلویت است.)
  2. با توجه چینش بر اساس نام فایل، می توانیم با تغییر نام فایل اکسپلویت، مطمئن باشیم که همواره این فایل در جایگاه اول قرار خواهد گرفت.

چینش بر اساس کاراکتر های موجود در نام فایل، به ترتیب کاراکتر های زیر از چپ به راست صورت می گیرد (مشابه چینش کلمات در کتاب دیکشنری):

!#$%&'()+,-.0123456789;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{}~

اگر نام فایل اکسپلویت را تغییر دهیم تا با کاراکتر های با اولویت شروع شود، این فایل در جایگاه اول قرار خواهد گرفت و جایگاه آن برای ما مشخص خواهد بود. در نتیجه، می توانیم روش Clickjacking را پیاده کنیم. نام فایل اکسپلویت را تغییر می دهیم تا با کاراکتر های متوالی صفر شروع شود.

موقعیت فایل اکسپلویت قریب به یقین در جایگاه اول است و در این موقعیت یک دکمه یا لینک تقلبی برای کلیک دزدی قرار می دهیم:

در تصویر مشخص است که فایل اکسپلویت با تغییر نام به:

00000000000000000000000000000_exploit.html

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

قربانی پس از باز کردن فایل، روی دکمه ی تقلبی کلیک می کند ولی در واقع کلیک روی فایل اکسپلویت در Iframe نامرئی انجام می شود که نتیجه ی آن بهره برداری از آسیب پذیری دور زدن SOP برای سرقت فایل ها می باشد. نتیجه ی نهایی پس از نامرئی کردن Iframe با تغییر ویژگی opacity به شکل زیر خواهد بود:

اگر قربانی فایل اکسپلویت را باز کند و روی دکمه ی تقلبی کلیک کند، SOP دور زده می شود. در نتیجه، لیست فایل های دانلود شده در تلگرام استخراج و فایل های موجود به سرور ما (مهاجم) ارسال می شود.

PoC و اثبات آسیب‌پذیری

فایل های اثبات و اکسپلویت آسیب پذیری، بر روی صفحه ی زیر در گیت هاب قرار گرفته است:

https://github.com/alidnf/CVE-2019-11730

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

توجه: چون تکنیک Clickjacking وابسته به مکان و سایز اسکرین است، برای تست فایل اثبات، باید مشخصات CSS برای اسکرین های مختلف لحاظ شود.

وصله‌ی آسیب‌پذیری

برای برطرف کردن آسیب پذیری یاد شده، تعریف SOP را برای فایل های محلی در فایرفاکس تغییر داده شده است:

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

این تعریف قبلا در مرورگر های دیگر مثل کروم اعمال شده بود.

کشف آسیب‌پذیری

من و یاشار شاهین زاده هنگام تست کد های مربوط به یک موضوع دیگر، متوجه وجود این آسیب پذیری شدیم.

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

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

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

https://gist.github.com/Voorivex/a39cce61655e44f1cb62e961bdb3ff50

جمع بندی

آسیب پذیری های مربوط به SOP از خطرناک ترین آسیب پذیری های منطقی (Logical) در مرورگر وب هستند. برای کشف و اکسپلویت این نوع از آسیب پذیری ها بر خلاف بسیاری از انواع دیگر، الگو و قاعده ی خاصی وجود ندارد و SOP به روشی خلاقانه دور زده می شود. در پروژه ی زیر سعی شده است مجموعه ای از اکسپلویت آسیب پذیری های مربوط به SOP دسته بندی شود:

https://github.com/Metnew/uxss-db

تا به حال از روش هایی مثل:

  1. ایجاد وقفه ی زمانی
  2. ریدایرکت
  3. بازی با پروتکل ها
  4. استفاده از فایل های میان بر (LNK یا Symlink)
  5. اکسپلویت آسیب پذیری هایی مثل XSS و XXE در مرورگر وب

برای دور زدن SOP استفاده شده است. می توانید فایل های اکسپلویت را برای پیدا کردن روش های دیگر بررسی کنید.

همچنین، دو وبلاگ زیر مقالات خوبی در مورد این نوع از آسیب پذیری ها دارند:

https://www.brokenbrowser.com/

https://leucosite.com/

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

علی دینی‌فر
4 پست نوشته شده
محقق آسیب پذیری، تست نفوذ و تحلیل بدافزار.
  • به اشتراک بگذارید:
  1. Avatar reza گفت:

    عالی بود.

  2. Avatar AliReza گفت:

    عالی بود

  3. Avatar فرهاد شیری گفت:

    سپاس
    مطلب مفید و آموزنده ای بود
    امیدوارم موفق باشید