شنود در اندروید های مدرن خطری برای App های بانکی و حساس
راهحل ارائه شده توسط nviso در لینک زیر ، یک تکنیک خلاقانه است که به جای تلاش برای فریب دادن اپلیکیشن یا سیستمعامل، یکی از اجزای اصلی و پایهای خود سیستمعامل اندروید را دستکاری میکند تا ترافیک را به سادگی قابل شنود کند.
بخش اول: مشکل کجاست؟ چرا روشهای قدیمی دیگر کار نمیکنند؟
برای درک اهمیت این روش جدید، باید ابتدا با مشکل آشنا شویم:
روش استاندارد (و قدیمی): برای شنود ترافیک HTTPS، ابزارهایی مانند Burp Suite یا mitmproxy از یک حمله “مرد میانی” (Man-in-the-Middle) استفاده میکنند. برای این کار، شما باید یک گواهینامه دیجیتال (CA Certificate) مربوط به ابزار خود را روی دستگاه اندروید نصب کنید. محدودیتهای اندروید مدرن: از اندروید ۷ (Nougat) به بعد، سیستمعامل به طور پیشفرض دیگر به گواهینامههایی که توسط کاربر نصب شدهاند، اعتماد نمیکند. این یعنی اپلیکیشنها فقط گواهینامههای موجود در “خزانه گواهینامههای سیستمی” (system′s trust storesystem′s trust store) را معتبر میدانند. انجام Certificate Pinning: بسیاری از اپلیکیشنهای امن (مانند اپهای بانکی) یک قدم فراتر میروند و از تکنیکی به نام “پین کردن گواهینامه” (Certificate PinningCertificate Pinning) استفاده میکنند. در این روش، اپلیکیشن فقط و فقط گواهینامه خاص سرور خودش را قبول میکند و هر گواهینامه دیگری (حتی اگر در سیستم معتبر باشد) را رد میکند. راه حلهای موجود (و مشکلاتشان): راه حل رایج برای دور زدن این محدودیتها، روت کردن دستگاه و قرار دادن گواهینامه ابزار شنود در خزانه سیستمی است. اما این کار هم همیشه جواب نمیدهد و ابزارهایی مانند Frida برای غیرفعال کردن Certificate Pinning در لحظه اجرا (runtime) نیاز است که پیچیدگیهای خاص خود را دارد.
نتیجه: شنود ترافیک در اندروید مدرن به یک بازی موش و گربه پیچیده تبدیل شده است.
بخش دوم: تکنولوژیهای کلیدی در روش جدید nviso
روش nviso بر پایه درک عمیق دو جزء اصلی از معماری مدرن اندروید استوار است: ۱. این Project Mainline (یا Google Play System Updates)
یک ابتکار از سوی گوگل برای ماژولار کردن سیستمعامل اندروید. به جای اینکه برای آپدیت یک جزء حیاتی (مثل کتابخانه امنیتی یا کدکهای رسانه) منتظر یک آپدیت کامل سیستمعامل (OTA) از سوی سازنده گوشی (مثل سامسونگ) بمانیم، گوگل میتواند این ماژولها را مستقیماً از طریق Google Play بهروزرسانی کند. چرا مهم است؟ این ماژولها در قالب فایلهایی با فرمتAPEX (Android Pony EXpress) ارائه میشوند. این فایلها در واقع بستههایی حاوی فایلهای سیستمی هستند که در زمان بوت شدن دستگاه، در یک مسیر خاص mount میشوند.
۲. بحث Conscrypt
کتابخانه پیشفرض و اصلی اندروید برای مدیریت ارتباطات امن TLS/SSL (همان S در HTTPS) است. وقتی یک اپلیکیشن میخواهد یک اتصال امن برقرار کند، در پشت صحنه از ConscryptConscrypt استفاده میکند. چرا مهم است؟ ConscryptConscrypt مسئول بررسی و تایید اعتبار گواهینامههاست. این کتابخانه خودش یک ماژول Mainline است، یعنی در یک فایل com.google.android.conscrypt.apex قرار دارد و توسط گوگل آپدیت میشود.
بخش سوم: روش خلاقانه nviso برای حل مشکل
ایده اصلی محققان nviso بسیار هوشمندانه است:
“اگر ConscryptConscrypt مسئول اعتماد کردن به گواهینامههاست و خودش یک ماژول قابل تعویض است، چرا خودِ ConscryptConscrypt را طوری دستکاری نکنیم که به گواهینامه ما ذاتاً اعتماد کند؟”
مراحل انجام این کار به شرح زیر است:
استخراج ماژول: ابتدا فایل com.google.android.conscrypt.apex را از یک دستگاه روت شده یا شبیهساز اندروید استخراج میکنند. باز کردن بسته APEX: این فایل را باز میکنند. درون آن یک فایل ایمیج به نام apex_payload.img وجود دارد که حاوی فایلهای اصلی ماژول است. یافتن خزانه اعتماد: درون این ایمیج، به دنبال فایل خزانه گواهینامههای سیستمی میگردند. این فایل معمولاً cacerts نام دارد و شامل تمام گواهینامههای ریشه (Root CAs) است که اندروید به آنها اعتماد دارد. تزریق گواهینامه مخرب: گواهینامه ابزار شنود (مثلاً Burp Suite) را به این فایل cacerts اضافه میکنند. بستهبندی و امضای مجدد: ماژول دستکاری شده را دوباره به فرمت APEX بستهبندی کرده و با کلیدهای شخصی خودشان امضا میکنند. این مرحله بسیار کلیدی است، زیرا سیستمعامل فایلهای APEX بدون امضا را قبول نمیکند.