ماژول 1: مقدمه‌ای بر طراحی و عملکرد مرورگرهای مدرن

در این مقاله از مفاهیم پایه‌ای مانند توضیح DNS و HTTP شروع کرده و در نهایت به بررسی شیوه طراحی و عملکرد مرورگرهای مدرن پرداخته شده است

نویسنده: رضا احمدی

تاریخ انتشار: 18 اردیبهشت 1404

فهرست

مقدمه

امروزه اکثر سیستم‌های هوشمند از جمله رایانه‌ها، موبایل‌های هوشمند و حتی تلوزیون‌ها، دارای مرورگرها هستند، و این محصولات نرم‌افزاری نقش مهمی را برای دسترسی به اینترنت و شبکه اطلاعات جهانی ایفا می‌کنند. کارهای مختلفی از جمله مشاهده ویدیو، وب‌گردی، پرداخت‌های مالی، خواندن اخبار، مسیریابی، بازی، گفتگو و … به واسطه مرورگرها انجام می‌پذیرد. با توجه به این که تقریباً هر دستگاهی که قابلیت اتصال به اینترنت دارد، دارای مرورگری نصب‌شده است، امروزه بیش از 3 میلیارد مرورگر فعال بر روی دستگاه‌ها وجود دارد. این امر خود دلیلی کافی است تا مهاجمان بتوانند از این مرورگرها برای دستیابی به مقاصد مخرب، همچون سرقت اطلاعات، استخراج ارز دیجیتال، دسترسی غیرمجاز به سیستم کاربران و غیره بهره‌برداری کنند.

مروری بر پروتکل DNS

در ابتدا، لازم است دید کلی از پروتکل‌های DNS، HTTP و ساختار URL به دست آوریم، و سپس فرآیندهایی که برای مشاهده محتوای یک وب‌سایت طی می‌شود را بررسی کنیم. به عبارت دیگر، باید بدانیم که مرورگر چگونه اطلاعات مرتبط با یک وب‌سایت را از یک سرور در شبکه جهانی دریافت کرده، رمزگشایی می‌کند و در نهایت آن را نمایش می‌دهد. پروتکل DNS این امکان را برای مرورگر فراهم می‌کند که بدون نیاز به آدرس IP، بتواند با سرورهای موجود در اینترنت ارتباط برقرار کند.

در واقع، آدرس IP را می‌توان به آدرس خانه تشبیه کرد، با این تفاوت که در دنیای دیجیتال، آن یک عدد هگزادسیمال است. همان‌طور که هر خانه آدرس منحصر به فرد خود را دارد، در شبکه جهانی اطلاعات نیز هر دستگاه یا کامپیوتر دارای آدرس IP مخصوص به خود است. یک آدرس IP در نسخه 4، که به آن IPv4 نیز گفته می‌شود، به چهار بخش تقسیم می‌شود و هر بخش با نقطه از بخش دیگر جدا می‌گردد. به عنوان مثال، آدرس 105.25.4.225 یک آدرس اینترنتی مطابق با پروتکل IP نسخه 4 است. حالا فرض کنید اگر کسی بخواهد از چندین سایت بازدید کند، باید آدرس‌های IP آنها را به خاطر بسپارد که این کار دشوار خواهد بود. اینجا است که پروتکل و سرویس DNS به کمک ما می‌آید. این سرویس به ما این امکان را می‌دهد که به جای حفظ کردن آدرس‌های IP، از نام‌های معناداری مانند example.com برای دسترسی به سرور با آدرس 93.184.216.34 استفاده کنیم. زمانی که سرویس DNS متوجه شود که ما قصد داریم به example.com دسترسی پیدا کنیم، به جدول اطلاعاتی خود رجوع کرده و آدرس IP مربوط به این دامنه را باز می‌گرداند. این فرآیند به طور جزئی‌تر در ادامه توضیح داده خواهد شد.

تصویر 1: شماتیک سلسله مراتب دسترسی به دامنه‌ها

مؤلفه TLD (Top-Level Domain)​

به سمت راست‌ترین بخش دامنه، TLD گفته می‌شود. به عنوان مثال در دامنه example.com، بخش TLD آن .com است. به طورکلی دو نوع  TLD با عنوان gTLD و ccTLD وجود دارد:

  • مؤلفه gTLD(Generic Top Level Domain): هدف از gTLD این است که کاربرد و هدف یک دامنه را به کاربر نشان دهد. به عنوان مثال، دامنه .com برای مقاصد تجاری، دامنه .edu برای اهداف آموزشی، دامنه .org برای سازمان‌ها و دامنه .gov برای سازمان‌های دولتی استفاده می‌شود.
  • مؤلفه ccTLD (Country Code Top Level Domain): به طور ساده، این به این معنی است که یک دامنه متعلق به یک کشور خاص است. به عنوان مثال، دامنه‌های .ir مربوط به سایت‌های مستقر در ایران هستند که مدیریت آن بر عهده NIC است و این نهاد مسئول مسیردهی به دامنه‌ها و تعیین سرورهایی است که هر دامنه باید با آنها ارتباط برقرار کند.

مؤلفه Second-Level Domain

بخش دیگر یک دامنه، که به آن Second-Level Domain یا SLD گفته می‌شود، قسمتی است که هنگام ثبت دامنه انتخاب می‌کنیم. حداکثر طول این بخش 63 کاراکتر است. به عنوان مثال، در دامنه example.com، بخش example به عنوان SLD شناخته می‌شود که می‌تواند حداکثر 63 کاراکتر داشته باشد. شایان ذکر است که این قاعده در پروتکل Onion و دامنه‌های مربوط به این شبکه متفاوت است. برای مثال، دامنه‌های شبکه TOR در نسخه 3 می‌توانند تا 56 کاراکتر داشته باشند.

مؤلفه Subdomain

ساب‌دامین در سمت چپ Second Level Domain قرار می‌گیرد و با یک نقطه از آن جدا می‌شود. به عنوان مثال، در دامنه admin.example.com، بخش admin به عنوان ساب‌دامین شناخته می‌شود. در ساب‌دامین‌ها نیز همان محدودیت‌هایی که در Second Level Domain وجود دارد، برقرار است. به عبارت دیگر، طول نام ساب‌دامین‌ها به 63 کاراکتر محدود است و کاراکترهای آن باید از حروف a-z، اعداد 0-9 و خط تیره تشکیل شده باشند. همچنین، استفاده از خط تیره در ابتدا و انتهای نام ساب‌دامین مجاز نیست. علاوه بر این، می‌توان از چندین ساب‌دامین استفاده کرد (در صورتی که نام دامنه طولانی باشد). به عنوان مثال، آدرس srv1.file.example.com دارای دو ساب‌دامین است. نکته قابل توجه این است که طول کل نام دامنه باید کمتر از 253 کاراکتر باشد و در ایجاد ساب‌دامین‌ها هیچ محدودیتی وجود ندارد.

رکوردهای DNS

حال، به بررسی رکوردهای موجود در سرویس DNS خواهیم پرداخت. لازم به ذکر است که پروتکل DNS تنها به وب‌سایت‌ها محدود نمی‌شود و انواع مختلفی از رکوردهای DNS وجود دارند که در اینجا مهم‌ترین آنها را بررسی خواهیم کرد.

تصویر 2: شماتیک انواع رایج رکوردهای DNS

رکورد A

از این رکورد برای شناسایی و پیدا کردن آدرس IPv4 استفاده می‌شود.

رکورد AAAA

از این رکورد برای شناسایی و پیدا کردن آدرس IPv6 استفاده می‌شود.

رکورد CNAME

از این رکورد برای ارجاع به یک دامنه دیگر استفاده می‌شود. در واقع، با استفاده از این رکورد می‌توانیم یک نام مستعار برای دامنه خود ایجاد کنیم. به عنوان مثال، اگر دامنه اصلی سایت ما example.com باشد و بخواهیم زمانی که www.example.com را وارد می‌کنیم، این دامنه به example.com ارجاع داده شود، این کار به کمک رکورد CNAME انجام می‌شود.

رکورد MX

این رکورد مسئول شناسایی آدرس سرور ایمیل است. به عبارت ساده‌تر، وظیفه دارد که مشخص کند سرور ایمیل ما کجا قرار دارد تا ایمیل‌ها به درستی به سمت سرویس ایمیل سرور ما هدایت شوند.

رکورد TXT

این رکورد حاوی داده‌های متنی است و کاربردهای مختلفی دارد. به عنوان مثال، این رکورد می‌تواند شامل فهرستی از سرورهایی باشد که مجاز به ارسال ایمیل از طرف دامنه هستند. با استفاده از این روش، می‌توان از ارسال ایمیل‌های اسپم و حملاتی مانند email spoofing جلوگیری کرد.

اهمیت پروتکل HTTP

از آنجا که بررسی جزئیات پروتکل هدف این مقاله نیست، تنها به ارائه تعریفی کلی از آن اکتفا خواهیم کرد. HTTP در حقیقت مجموعه‌ای از قوانین است که برای ارتباط با وب‌سرورها و انتقال داده‌های صفحات وب بین سرور و مرورگر استفاده می‌شود. این پروتکل توسط Tim Berners-Lee در سال‌های 1989 تا 1991 توسعه یافت. HTTPS (Hypertext Transfer Protocol Secure)، نسخه‌ای امن‌تر از HTTP است که با استفاده از SSL، ترافیک را رمزنگاری می‌کند. در HTTP، پیلود (Payload) به‌صورت خام منتقل می‌شوند، اما در HTTPS، تمامی داده‌های درون بسته رمزنگاری شده و امکان خواندن آنها در ترافیک این پروتکل وجود ندارد.

بررسی ساختار URL

پیش از آنکه بتوانیم وارد یک سایت شویم، مرورگر ما نیاز دارد تا URL مربوط به صفحه HTML در سرور میزبان سایت را شناسایی کند. سپس، با درخواست آن صفحه از سرور، وب‌سرور آن را از فایل سیستم خود خوانده و در قالب پروتکل HTTP به سمت کلاینت ارسال می‌کند. به طور کلی، URL به وب‌سرور این اطلاعات را می‌دهد که منبع مورد نیاز کلاینت در کدام قسمت از فایل سیستم سرور قرار دارد و نوع آن چیست.

حال، به بررسی اجزای تشکیل‌دهنده URL خواهیم پرداخت. ساختار کلی یک URL به‌صورت زیر است:

تصویر 3: ساختار کلی یک URL

از اجزای اصلی یک URL می‌توان به موارد زیر اشاره کرد:

  • شماتیک (Scheme): این بخش نوع پروتکلی را که برای دسترسی به منبع استفاده می‌شود، مشخص می‌کند. برای مثال http، https و ftp.
  • هاست و دامنه: این بخش مربوط به IP یا domain name سرور است.
  • پورت: این بخش اختیاری است و پورتی را که می‌خواهیم به آن وصل شویم، مشخص می‌کند. معمولاً پورت 80 برای http و 443 برای https استفاده می‌شود.
  • Path: مسیر یا نام فایل یک منبع را مشخص می‌کند.
  • Query: این بخش اختیاری است و داده‌ها به‌صورت key=value به سمت وب‌سرور ارسال می‌شوند.
  • Fragment: این بخش اختیاری است و به بخشی از یک منبع در مرورگر کاربر اشاره دارد.

فرآیند نمایش صفحات وب توسط مرورگر

حال به بررسی فرآیند طی‌شده از زمان درخواست یک URL در نوار جستجو (Search Bar) تا زمان نمایش محتوا در مرورگر خواهیم پرداخت. اگر به اینترنت متصل نباشیم، مرورگر ابتدا حافظه cache خود را بررسی کرده و در صورتی که نسخه‌ای از آن محتوا در آن ذخیره شده باشد، آن را بارگذاری خواهد کرد. این امر به تنظیمات هدرهایی مانند Pragma و Cache-Control در سایت مورد نظر نیز بستگی دارد.

حال فرض کنید که به اینترنت متصل هستیم و سایت example.com را جستجو کرده‌ایم. در این شرایط، ابتدا مرورگر به سراغ فایل hosts در سیستم‌عامل می‌رود و بررسی می‌کند که آیا IP دامنه example.com در آن موجود است یا خیر. اگر IP سایت مذکور موجود باشد، آن را resolve می‌کند. در صورتی که وجود نداشته باشد، مرورگر از استانداردی به نام getname-info برای انجام Name Resolving استفاده می‌کند. برای این کار، بسته به نوع سیستم‌عامل، به سراغ DNS Server تنظیم‌شده می‌رود و در صورتی که IP مورد نظر در حافظه کش آن موجود باشد، آن را باز می‌گرداند. در غیر این صورت، به سراغ Root Servers می‌رود (در کل 13 سرور Root در جهان وجود دارد).

برای مثال، اگر بخواهیم IP سایت example.com را پیدا کنیم، ابتدا Root Server به سراغ Top Level Domain می‌رود که در اینجا .com است، سپس در Second Level Domain ها دنبال دامنه example می‌گردد. پس از پیدا کردن IP دامنه مذکور، عملیات‌های بعدی مانند TCP Handshake و TLS Handshake انجام می‌شود و در نهایت نتیجه در مرورگر نمایش داده خواهد شد.

مرورگرهای رایج

امروزه مرورگرهایی مانند Firefox، Chrome و Safari دارای جامعه کاربری قابل توجهی هستند. در این بخش، قصد داریم مزایا و معایب کلی هر یک از این مرورگرها را بررسی کرده و سپس سهم آن‌ها را در بازار مرورگرها تحلیل کنیم.

مرورگر Chrome

از مزایا و معایب مرورگر Chrome می‌توان به موارد زیر اشاره کرد:

  • مزایا:
    • سرعت بالا در بارگیری صفحات و اجرای برنامه‌ها
    • امکان استفاده از افزونه‌های متنوع و همچنین امکانات سفارشی‌سازی
    • پشتیبانی کامل از استانداردها و فناوری‌های وب مانند WebGL، WebRTC، WebVR
    • عملکرد بسیار خوب در تعامل با سرویس‌های Google و امکان همگام‌سازی
    • دارا بودن حالت ناشناس
    • پشتیبانی از کراس پلتفرم
  • معایب:
    • استفاده زیاد از منابع سیستم
    • اشغال بیش از حد حافظه در صورت داشتن تعداد زیاد tab
    • جمع‌آوری اطلاعات کاربران

مرورگر Firefox

از مزایا و معایب مرورگر Firefox می‌توان به موارد زیر اشاره کرد:

  • مزایا:
    • حفظ حریم خصوصی کاربر با ارائه ابزارهای قدرتمند مانند حالت خصوصی و مسدودسازی تبلیغات، و همچنین عدم جمع‌آوری اطلاعات کاربران
    • پشتیبانی کامل از استانداردها و فناوری‌های وب مانند WebGL، WebRTC، WebVR و WebAssembly
    • امکان استفاده از افزونه‌ها و امکانات سفارشی‌سازی فراوان
    • پشتیبانی از کراس پلتفرم
  • معایب:
    • سرعت بارگیری صفحات در مقایسه با برخی رقبا مانند Chrome و Safari کمتر است
    • عدم تطبیق کامل با برخی سرویس‌ها و وب‌سایت‌ها نسبت به Chrome
    • برخی افزونه‌ها ممکن است منابع سیستم را زیاد مصرف کرده و باعث کاهش سرعت مرورگر شوند

مرورگر Safari

از مزایا و معایب مرورگر Safari می‌توان به موارد زیر اشاره کرد:

  • مزایا:
    • سرعت بالا در بارگیری صفحات
    • بهبود عملکرد باتری برای دستگاه‌های تلفن همراه و تبلت‌های اپل
    • دارا بودن ویژگی Safari Reader که تبلیغات را مسدود می‌کند
    • امکان استفاده از قابلیت‌های نوین وب مانند Augmented Reality (AR) و Virtual Reality (VR)
    • سرعت بالاتر در دستگاه‌های موبایل نسبت به رقبایی همچون Chrome و Firefox، به دلیل بهینه‌سازی Safari برای دستگاه‌های اپل
  • معایب:
    • محدودیت در افزونه‌ها و امکانات سفارشی‌سازی
    • عدم پشتیبانی کامل از استانداردهای وب مانند WebGL و WebRTC
    • Safari فقط برای محصولات اپل در دسترس است و مرورگر پیش‌فرض آن‌ها به شمار می‌آید

مقایسه محبوبیت مرورگرها در بازار

اگر بخواهیم مرورگرها را از نظر جامعه کاربری بررسی کنیم، طبق آمارهای منتشر شده، Chrome در رتبه اول قرار دارد و سایر مرورگرها مانند Safari، Edge و Firefox در رتبه‌های بعدی قرار می‌گیرند.

تصویر 4: میزان محبوبیت مرورگرها بر اساس آمار

معماری عمومی مرورگرها

مرورگرها با توجه به ماهیت پیچیده ای که دارند، از کامپوننت های بسیاری تشکیل شده‌اند. بطورکلی یک مرورگر حداقل باید دارای مولفه‌های ذیل باشد تا بتواند عملکرد مورد انتظار را ارائه دهد.

تصویر 5: اجزای کلی یک مرورگر
  • مؤلفه UI: هر چیزی که ما در مرورگر مشاهده می‌کنیم و با آن تعامل داریم، مانند نوار آدرس، دکمه‌ها و منوهای مختلف.
  • مؤلفه Browser Engine: این مولفه به‌عنوان رابطی میان مؤلفه UI و موتور رندرینگ عمل می‌کند.
  • مؤلفه Rendering Engine: وظیفه این بخش parse کردن HTML، CSS و سایر منابع است و در نهایت محتوای درخواستی را به نمایش می‌گذارد.
  • مؤلفه Networking: این بخش مسئول هندل کردن ارتباطات شبکه است، از جمله درخواست‌های HTTP و HTTPS.
  • مؤلفه UI Backend: این بخش مسئول ترسیم ویجت‌های اولیه مانند ComboBox و پنجره‌ها است.
  • مؤلفه JavaScript Engine: این بخش وظیفه parse کردن و اجرای کدهای JavaScript را بر عهده دارد.
  • مؤلفه Data Storage: این بخش مربوط به هرگونه داده‌ای است که قرار است در مرورگر ذخیره شود، مانند کوکی‌ها و ذخیره‌سازی محلی.

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

تصویر 6: کامپوننت‌های یک مرورگر مدرن

Multi-Processing در مرورگرها

در گذشته، زمانی که مرورگرها با صفحاتی سنگین و حاوی المان‌های زیاد مواجه می‌شدند، به دلیل Single Process بودن، معمولاً دچار کرش می‌شدند. این مشکل در مرورگرهای مدرن با استفاده از Multi-Processing حل شده است. در ادامه، یک نگاه کلی به مبحث Multi-Processing در مرورگرها خواهیم داشت و مزایای استفاده از IPC (ارتباط بین پردازنده‌ها) را بررسی می‌کنیم. محتوای این بخش بیشتر بر مرورگر Chrome متمرکز است، اما بسیاری از این موارد در سایر مرورگرها نیز مشابه است.

تصویر 7: شماتیک پروسه‌ها با توجه به UI مرورگر
  • پروسه Browser: این بخش به عنوان مرکز اصلی هماهنگی شناخته می‌شود و معمولاً با نام Main Process شناخته می‌شود. این پروسه وضعیت مرورگر را مدیریت می‌کند و مواردی همچون داده‌های پروفایل، تنظیمات، ترسیم UI، مباحث مرتبط با شبکه و فایل‌ها را کنترل می‌کند. نکته مهم این است که این پروسه هرگز به پروسه Renderer اعتماد نخواهد کرد.
  • پروسه GPU: همانطور که از نام آن پیداست، این پروسه وظیفه ترسیم صفحات را بر عهده دارد. دلیل جدا کردن این پروسه از سایر پروسه‌ها، امنیت و پایداری بیشتر مرورگر است.
  • پروسه Renderer: هر محتوایی که ما در یک صفحه وب مشاهده می‌کنیم مربوط به این پروسه است. این پروسه به منظور سخت‌تر کردن فرآیند اکسپلویت آسیب‌پذیری‌ها، به طور کامل در یک سندباکس قرار دارد.
  • پروسه Plugin: افزونه‌های مرورگر در یک پروسه مجزا اجرا می‌شوند که به آن پروسه Plugin گفته می‌شود. پلاگین‌ها در یک سندباکس اجرا خواهند شد تا در صورت بروز مشکل در یکی از افزونه‌ها، تاثیری بر روی مرورگر و سایر افزونه‌ها نداشته باشد. رابط برنامه‌نویسی NPAPI که برای توسعه پلاگین‌ها طراحی شده است، این امکان را فراهم می‌کند که افزونه‌هایی بسازیم که قابلیت تعامل با مرورگر را دارند. از افزونه‌های توسعه یافته با NPAPI می‌توان به Flash Player اشاره کرد. این رابط برنامه‌نویسی به دلیل مشکلاتی که در امنیت، پایداری و عملکرد مرورگر ایجاد می‌کند (مانند عدم اجرای پلاگین‌ها در سندباکس)، منسوخ شده است.
تصویر 8: شیوه ارتباط میان اجزا مرورگر (کروم)

برخی از مواردی که در تصویر مشاهده می‌کنید قبلاً توضیح داده شده‌اند و در این بخش قصد داریم از آن‌ها گذر کرده و به بررسی موارد جدیدتری بپردازیم. اولین سوالی که ممکن است مطرح شود این است که چگونه این همه پروسه می‌تواند در یک مرورگر وجود داشته باشد، و اصلاً چه دلیلی وجود دارد که مرورگر ما Multi-Process باشد؟ آیا این موضوع تاثیری بر امنیت و راحتی کاربر دارد؟ و چگونه پروسه‌های مختلف با یکدیگر در ارتباط و تبادل اطلاعات هستند؟

بطور کلی، مزایا و معایب Multi-Processing در مرورگرها عبارتند از:

  • به دلیل پیچیدگی اتصال میان Frontend و Backend، Multi-Processing ممکن است باعث سربار حافظه شود.
  • در زمینه Reliability (قابلیت اعتماد)، Multi-Processing تاثیر بسزایی دارد، زیرا اگر یک پروسه با خطا روبرو شود، تاثیری بر سایر پروسه‌ها نخواهد گذاشت. به‌عنوان مثال، اگر یک تب دچار خطا شود، این خطا فقط به همان تب محدود خواهد ماند و تاثیری بر دیگر تب‌ها نخواهد داشت.
  • در مبحث امنیت، همه پروسه‌ها از هم جدا هستند. به‌عنوان مثال، پروسه Rendering دسترسی محدودی به سایر پروسه‌ها دارد.
  • اگر کدی که توسعه‌دهنده نوشته است دارای باگ باشد یا الگوریتم پیچیده و نامناسبی داشته باشد، این موضوع می‌تواند بر سرعت و مصرف منابع تاثیر بسزایی داشته باشد.
  • فرآیند توسعه برنامه‌های Multi-Process دشوارتر است زیرا باید مکانیزم‌های هماهنگ‌سازی مناسبی میان پروسه‌ها ایجاد شود.
  • با استفاده از Multi-Processing، مرورگر قادر به اجرای کدهای مختلف به طور همزمان است که در نهایت منجر به بهبود عملکرد می‌شود.

مکانیزم IPC (Inter Process Communication)

حال به بررسی این موضوع می‌پردازیم که چگونه پروسه‌ها در مرورگر با یکدیگر ارتباط برقرار کرده و تبادل اطلاعات می‌کنند، و چرا اصلاً به چنین مکانیزمی نیاز داریم. بطور کلی، می‌توان گفت مکانیزمIPC  به پروسه‌ها این امکان را می‌دهد که با یکدیگر ارتباط برقرار کنند. به عبارت دیگر، IPC برای انتقال پیام‌ها میان پروسه‌ها از حافظه اشتراکی (Shared Memory) استفاده می‌کند، و این ارتباط به‌صورت غیرهمزمان (Asynchronous) انجام می‌شود. هرچند امکان پیاده‌سازی آن به‌صورت همزمان (Synchronous) نیز وجود دارد، اما این کار سربار زیادی به‌همراه خواهد داشت.

این فرآیند در سطوح مختلف انجام می‌شود، به همین دلیل هر بار که از لایه IPC عبور می‌کند، یک بررسی امنیتی انجام می‌شود تا اطمینان حاصل شود که یک پروسه با سطح دسترسی بیشتر نمی‌تواند پروسه‌ای با سطح دسترسی کمتر را تصاحب کند. برای مشاهده پروسه‌ها در مرورگر Firefox، می‌توانید از کلیدهای ترکیبی Shift+Esc استفاده کنید.

تصویر 9: نمایش پروسه‌ها در مرورگر فایرفاکس
تصویر 10: نمایش پروسه‌ها در brave

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

  • پروسه‌ای که مربوط به خود مرورگر (Main Process) است.
  • پروسه‌هایی که مربوط به تب‌های مرورگر هستند.
  • پروسه‌هایی که مربوط به افزونه‌های مرورگر (Extensions) هستند.
  • پروسه‌ای که مربوط به GPU است.

مکانیزم‌های امنیتی در مرورگرها

پیش‌تر درباره واژه sandbox در مرورگرها صحبت کردیم، اما سندباکس چیست و چه کاربردی دارد؟ بطور کلی، sandbox یک مکانیزم امنیتی است که به منظور پیچیده‌تر کردن فرآیند Exploitation (سو استفاده از آسیب‌پذیری‌ها) در مرورگرها مورد استفاده قرار می‌گیرد. در گذشته، موتورهای رندرینگ بسیار ساده بودند و کار آنها تنها به رندر کردن صفحات محدود می‌شد. با پیشرفت مرورگرها، این موتورها پیچیده‌تر شدند و در نتیجه باعث ایجاد Attack Surface (سطوح حمله) گوناگونی گردیدند. از این رو، داده‌ها در پروسه‌ای امن و ایزوله قرار گرفتند که آن را sandbox می‌نامیم.

یکی دیگر از مکانیزم‌های امنیتی که در مرورگر Chrome به کار گرفته شده، Site Isolation است. این مکانیزم از sandbox بهره می‌برد تا دسترسی سایت‌های غیرقابل اعتماد به اطلاعات حساب کاربران را دشوار کند. در حالت طبیعی، وب‌سایت‌ها اجازه دسترسی به داده‌های دیگر سایت‌ها در مرورگر ندارند، که این قابلیت مدیون سیاست Same-Origin Policy (SOP) است. Site Isolation مانند یک سپر دفاعی اضافی عمل کرده و تضمین می‌کند که صفحات وب‌سایت‌های مختلف در پروسه‌های مجزا قرار بگیرند و هر کدام از این پروسه‌ها نیز درون یک سندباکس ایزوله شده اجرا شوند. همچنین، اگر پروسه‌ای قصد دسترسی به داده‌های حساس سایت‌های دیگر را داشته باشد، این دسترسی مسدود می‌شود و در نهایت فرایند سرقت اطلاعات سخت‌تر خواهد شد.

با توجه به پیچیدگی مرورگرهای امروزی، استفاده از رویکرد دفاع در عمق (Defense in depth) برای محدود کردن آسیب‌پذیری‌ها بهترین شیوه است. در این حالت، حتی اگر مهاجم بتواند منطق و سیاست‌های امنیتی مرورگر را دور بزند، با سدهایی همچون Sandbox و Site Isolation مواجه خواهد شد. یکی دیگر از تهدیدات، آسیب‌پذیری‌های امنیتی در پروسه Renderer است که می‌تواند منجر به حملاتی مانند Remote Code Execution (RCE) شود. تیم امنیت Chrome برای مقابله با چنین تهدیداتی سیاست‌های زیر را در پیش گرفته است:

  • آموزش توسعه‌دهندگان
  • پیاده‌سازی فرایندهای توسعه ایمن
  • انجام عملیات Fuzzing
  • برگزاری برنامه‌های Bug Bounty

منابع