هی هابر!
امروز در مورد کاری که من و همکارانم چندین ماه است انجام می دهیم صحبت خواهم کرد: اعلان های فشار برای پیام رسان های فوری موبایل. همانطور که قبلاً گفتم، در برنامه ما تأکید اصلی بر امنیت است. بنابراین، متوجه شدیم که آیا پوش نوتیفیکیشنها «نقاط ضعیفی» دارند و اگر چنین است، چگونه میتوانیم آنها را برای افزودن این گزینه مفید به سرویس خود، سطح بندی کنیم.
ترجمه ای از خودمان را منتشر می کنم
ما مواد را بررسی می کنیم
در مدل کلاسیک، اعلانهای فشاری، پیامرسانها را در برابر حملات MITM (Man-in-the-Middle) آسیبپذیر میکنند. به عنوان مثال، با گوگل، مایکروسافت و نسخه قدیمی iMessage، برنامه کلیدهای رمزگذاری را به سرورهای اپل ارسال می کند - در سرور، کاربران احراز هویت می شوند و سرصفحه پیام (یا محتوای آن) رمزگشایی می شود.
در نتیجه، فرصتی برای خواندن مکاتبات با دسترسی به سرور اعلان فشار وجود دارد. این بدان معنی است که هر گونه رمزگذاری مکاتبات بی فایده است: اعلان های فشار همچنان امکان خواندن توسط اشخاص ثالث را باقی می گذارد. نویسندگان مقاله این امکان را با جزئیات بیشتری مورد بحث قرار دادند.
اگر فکر میکنید سرورهای اپل و گوگل در برابر فاش شدن کلیدهای رمزگذاری کاربر 100٪ ایمن هستند، این واقعیت را در نظر بگیرید که کارمندان آنها به آنها دسترسی دارند. و کارمندان مردم هستند.
با وجود تمام آسیبپذیریهای پوش نوتیفیکیشن، بسیاری از پیامرسانهای فوری «ایمن» از جمله سیگنال و تلگرام از آنها استفاده میکنند. در غیر این صورت، کاربران باید با ورود مداوم به برنامه، پیام های جدید را به صورت دستی نظارت کنند. که بسیار ناخوشایند است و پیام رسان های رقیب مزیت خواهند داشت.
پارانویا و عقل سلیم
در پروژه خود، ما چندین ماه پیش این موضوع را از نزدیک بررسی کردیم. برای رقابتی بودن باید یک گزینه push notification اضافه کنیم. اما در عین حال، حفره امنیتی را باز نکنید، زیرا هر گونه نشت داده اعتماد به پروژه را تضعیف می کند.
با این حال، ما در حال حاضر یک مزیت مهم داریم: پیام رسان ما غیرمتمرکز است (داده ها در بلاک چین ذخیره می شوند)، و کارمندان به حساب ها دسترسی ندارند. فقط کاربران دارای کلیدهای رمزگذاری هستند و کلیدهای عمومی مخاطبین برای محافظت در برابر حملات MITM در بلاک چین در دسترس هستند.
در نسخه اول پوش نوتیفیکیشن تصمیم گرفتیم تا حد امکان آن را ایمن بازی کنیم و متن پیام را به هیچ وجه منتقل نکنیم. سرویس فشار متن پیام را از گره دریافت نکرد، بلکه فقط یک سیگنال در مورد واقعیت دریافت آن بود. بنابراین، کاربر اعلان "پیام جدید رسیده است" را مشاهده کرد. خواندن آن فقط در پیام رسان امکان پذیر بود.
پس از آن متوجه شدیم که آخرین نسخه نوتیفیکیشن های اپل دارای ویژگی های امنیتی جدیدی است. آنها
ما اکنون نسخه دوم اعلانهای فشاری را برای iOS توسعه دادهایم که به شما امکان میدهد متن پیام را بدون خطر امنیتی نمایش دهید. در مفهوم جدید، منطق به این صورت است:
- سرویس push یک اعلان فشاری با شماره تراکنش ارسال می کند (پیام رمزگذاری شده می تواند بسیار بزرگ باشد و اندازه اعلان ها بسیار محدود است)
- وقتی دستگاه اعلان دریافت میکند، NotificationServiceExtension ما را راهاندازی میکند - یک ریزبرنامه که یک تراکنش از گره با شناسه درخواست میکند، آن را با استفاده از عبارت عبور ذخیرهشده رمزگشایی میکند و یک اعلان جدید به سیستم ارسال میکند. عبارت عبور در حافظه امن ذخیره می شود.
- سیستم یک اعلان با پیام یا ترجمه رمزگشایی شده نمایش می دهد.
- کلیدها به هیچ جا نمی روند، درست مانند پیام متنی ساده. سرویس فشار راهی برای رمزگشایی پیام ندارد.
ما این نسخه را به عنوان کارآمد پذیرفتیم و آن را در آخرین آپدیت اپلیکیشن iOS پیاده سازی کردیم.
علاقه مندان به بخش فنی می توانند کد منبع را مشاهده کنند:
منبع: www.habr.com