افزونهای که کارت شناسایی میلیونها بلژیکی رو در معرض خطر گذاشت
خلاصهٔ کاملتر
به نوشتهٔ تیم Am I Being Pwned، افزونهٔ Connective signing با بیش از ۲ میلیون کاربر هفتگی فقط یه لایهٔ ارتباطیه: پیام سایتها رو به یه برنامهٔ نیتیو روی همون کامپیوتر میرسونه و اون برنامه با کارتخوان حرف میزنه. این افزونه توی ۸ بانک از ۱۰ بانک بزرگ بلژیک و بیش از ۶۰ نهاد دولتی استفاده میشده. مشکل از اینجا شروع شد که افزونه هیچوقت مبدأ درخواست رو به برنامهٔ نیتیو نمیداد، پس اون برنامه اصلاً نمیدونست داره با کدوم سایت حرف میزنه.
تنها نگهبان ماجرا یه activationToken امضاشده با RSA بود که سایتهای طرف قرارداد میگرفتن. محققا نشون دادن این توکن هم مبدأ نداره و فقط شامل یه شناسه، یه زمان انقضا و یه بیتماسک دسترسیهاست؛ پس هر سایتی میتونست توکن یه سرویس معتبر رو دوباره استفاده کنه و بدون اطلاع کاربر، کارت شناسایی و کارت Maestro متصل به سیستم رو بخونه.
بدتر از اون pinToken بود. وقتی کاربر PIN کارتش رو توی پنجرهٔ نیتیو وارد میکرد، این توکن به صفحهٔ وب برمیگشت — و خود توکن هم متن رمزشده و هم کلید رمزگشایی رو با یه IV ثابت داخلش داشت، یعنی سایت میتونست PIN واقعی رو دربیاره و از اون به بعد هر وقت خواست توکن خودش رو بسازه. عنوان و متن اون پنجره هم کاملاً توسط صفحهٔ وب تعیین میشد، پس ساختن یه پنجرهٔ باورپذیر به اسم دولت بلژیک اصلاً سخت نبود.
نویسندهها میگن این یعنی فرض پایهای کل اکوسیستم eID بلژیک از بین میره: داشتن PIN بهعلاوهٔ توانایی فرستادن فرمان به کارت، عملاً معادل داشتن خود کارته، با این تفاوت که از دل یه iframe تبلیغاتی هم کار میکنه. امضاهای واجد شرایط eIDAS از نظر قانونی با امضای کاغذی برابرن و بار اثبات جعل روی دوش قربانیه. تیم تصاحب حساب یه سرویس متکی به eID رو عملاً نشون داد و سناریوی مشابهی رو برای itsme، لایهٔ هویت بلژیک، توضیح داد.
خطرناکترین یافته اما اجرای کد از راه دور بود: فرمان GET_READERS یه پارامتر library داشت که مسیر کتابخانهٔ موردنظر رو مستقیم از صفحهٔ وب میگرفت و مسیر نسبی هم قبول میکرد. یعنی سایت میتونست فایلی رو که تازه در ظاهر یه PDF دانلود شده بهعنوان کتابخانه بارگذاری و اجرا کنه؛ کاربر فقط یه دانلود معمولی میدید و سندباکس کروم دور زده میشد. هیچ تنظیم خاص یا کار پرخطری هم از سمت کاربر لازم نبود.
وصلهٔ اول Nitro در ۸ مه فقط مبدأ رو از راه یه سرور بررسی میکرد و RCE و نشت pinToken سر جاش بود؛ وصلهٔ کامل ۱ ژوئن با حذف فرمان library و نگهداشتن PIN داخل خود افزونه اومد و بررسی اجباری مبدأ از ۲۲ ژوئیه فعال شد. نویسندهها میپرسن با وجود ادعای تست نفوذ سالانه، چطور چنین ایرادهایی سالها دیده نشده، و پیشنهاد میکنن قانونگذار تست نفوذ واقعی رو برای ارائهدهندههای خدمات اعتماد واجد شرایط الزامی کنه.
نکات کلیدی:
- افزونهٔ Connective مبدأ درخواست رو به برنامهٔ نیتیو پاس نمیداد، پس هر سایت یا iframe میتونست فرمان بفرسته
- توکن دسترسی هم به مبدأ گره نخورده بود و قابل استفادهٔ مجدد بود
- توکن PIN هم متن رمزشده و هم کلید رو با خودش حمل میکرد؛ متن پنجرهٔ ورود PIN هم دست مهاجم بود
- پارامتر مسیر کتابخانه در یکی از فرمانها به اجرای کد سطح کاربر و فرار از سندباکس کروم منجر میشد
- وصلهٔ کامل ۱۴۶ روز بعد از اولین گزارش منتشر شد؛ پاداش پیشنهادی برای این گزارش ۲۰۰ دلار بود




