- بواسطة x32x01 ||
مع إني مش بحب أنزل Duplicate، بس الثغرة دي من أكتر الحاجات اللي كنت مقهور عليها 😅
المهم… حضّر كوباية الشاي وتعالى نفهم الموضوع لأن فيه تفاصيل مهمة جدًا لأي حد شغال Bug Bounty أو Mobile Application Security ☕
الثغرة كانت عبارة عن شوية مشاكل أمنية مترابطة جوه Android Mobile Application أثناء تنفيذ OAuth Authorization Code Flow، والنتيجة؟ 😶
المهاجم يقدر يسرق: Access Token - Refresh Token
وبالتالي يحصل على سيطرة كاملة على حساب الضحية (Full Account Takeover).
طلب الـ Authorization كان ناقص حاجات أساسية جدًا زى:
وده معناه إن Authorization Code مكنش مربوط بالتطبيق الأصلي.
طيب يعني إيه PKCE وليه مهم؟ 🤔
ببساطة، PKCE عبارة عن طبقة حماية إضافية معمولـة مخصوص لتطبيقات الموبايل والـ Public Clients.
الـ Flow الطبيعي بيكون كده:
وبعدها:
الميزة هنا إن حتى لو حد سرق الـ Authorization Code، مش هيعرف يستخدمه من غير الـ code_verifier ✅
لكن فى الحالة دي ؟ مفيش PKCE أصلًا 😶
وده خلّى أي شخص يقدر يسرق الـ Code ويستبدله بسهولة بـ:
وبعد فك التطبيق (Reverse Engineering) كان سهل جدًا الوصول له.
وده يعتبر Design غلط أصلًا.
ليه؟
لأن تطبيقات الموبايل تعتبر:
يعني أي Secret يتحط جوه التطبيق غالبًا هيكون قابل للاستخراج بسهولة باستخدام أدوات زى:
بعد فك الملفات ممكن تلاقي بيانات حساسة بالشكل ده:
وده كارثة أمنية حقيقية 😅
المشكلة إن أي تطبيق أندرويد تانى يقدر يسجل نفس الـ Custom Scheme.
وده معناه إن تطبيق خبيث ممكن يعمل: Intercept للـ OAuth Callback
كمان التطبيق الأصلي كان عنده Activity مفتوحة للتعامل مع Android Intents، وبالتالي التطبيقات التانية كانت تقدر تتفاعل معاها بسهولة.
اللي تم استخراجه من التطبيق.
بعدها السيرفر يرجع:
المهم… حضّر كوباية الشاي وتعالى نفهم الموضوع لأن فيه تفاصيل مهمة جدًا لأي حد شغال Bug Bounty أو Mobile Application Security ☕
الثغرة كانت عبارة عن شوية مشاكل أمنية مترابطة جوه Android Mobile Application أثناء تنفيذ OAuth Authorization Code Flow، والنتيجة؟ 😶
المهاجم يقدر يسرق: Access Token - Refresh Token
وبالتالي يحصل على سيطرة كاملة على حساب الضحية (Full Account Takeover).
السبب الأول: عدم استخدام PKCE فى OAuth 🔓
التطبيق كان بيستخدم OAuth Authorization Code Flow لكن من غير تفعيل PKCE.طلب الـ Authorization كان ناقص حاجات أساسية جدًا زى:
Code:
code_challenge
code_verifier طيب يعني إيه PKCE وليه مهم؟ 🤔
ببساطة، PKCE عبارة عن طبقة حماية إضافية معمولـة مخصوص لتطبيقات الموبايل والـ Public Clients.
الـ Flow الطبيعي بيكون كده:
- التطبيق يعمل Generate لقيمة عشوائية اسمها:
code_verifier
- يطلع منها قيمة تانية اسمها:
code_challenge
- يبعت الـ code_challenge مع طلب تسجيل الدخول.
- بعد نجاح الـ Login، السيرفر يرجع Authorization Code.
- التطبيق لازم يبعت الـ code_verifier الحقيقي علشان السيرفر يتأكد إن نفس التطبيق اللي بدأ العملية هو اللي بيطلب الـ Tokens.
Code:
GET /authorize?
client_id=mobile_app
&response_type=code
&code_challenge=abc123
&code_challenge_method=S256 Code:
POST /token
code=AUTH_CODE
code_verifier=real_secret_value لكن فى الحالة دي ؟ مفيش PKCE أصلًا 😶
وده خلّى أي شخص يقدر يسرق الـ Code ويستبدله بسهولة بـ:
Code:
access_token
refresh_token السبب التانى: تخزين client_secret داخل ملف APK 🚨
واحدة من المشاكل الخطيرة كمان إن OAuth client_secret كان متخزن بشكل ثابت جوه ملف الـ APK.وبعد فك التطبيق (Reverse Engineering) كان سهل جدًا الوصول له.
وده يعتبر Design غلط أصلًا.
ليه؟
لأن تطبيقات الموبايل تعتبر:
Public Clientsيعني أي Secret يتحط جوه التطبيق غالبًا هيكون قابل للاستخراج بسهولة باستخدام أدوات زى:
- jadx
- apktool
- MobSF
jadx app.apkبعد فك الملفات ممكن تلاقي بيانات حساسة بالشكل ده:
Code:
client_secret = "super_secret_key"; السبب التالت: استخدام Custom URI Scheme بشكل غير آمن ⚠️
التطبيق كان بيستخدم Redirect URI بالشكل ده: Code:
myapp://oauth-callback وده معناه إن تطبيق خبيث ممكن يعمل: Intercept للـ OAuth Callback
كمان التطبيق الأصلي كان عنده Activity مفتوحة للتعامل مع Android Intents، وبالتالي التطبيقات التانية كانت تقدر تتفاعل معاها بسهولة.
سيناريو الاستغلال الكامل للثغرة 🎯
طريقة الاستغلال كانت ماشية بالشكل ده:1- الضحية تثبت تطبيق خبيث
المهاجم يخلي الضحية تثبت Malicious Application.2- التطبيق الخبيث يسجل نفس الـ Redirect Scheme
التطبيق يعمل Register لنفس:myapp://oauth-callback3- الضحية تبدأ تسجيل الدخول
الضحية تعمل Login داخل التطبيق الأصلي.4- أندرويد يعرض رسالة "Open With"
بعد انتهاء تسجيل الدخول، النظام يسأل المستخدم:Open with5- الضحية تختار التطبيق الخبيث
وهنا تبدأ الكارثة 💀 التطبيق الخبيث يستقبل:Authorization Code6- تنفيذ Exchange للكود
المهاجم يستخدم: Code:
client_id
client_secret بعدها السيرفر يرجع:
Code:
access_token
refresh_token النتيجة النهائية: Full Account Takeover 💥
بمجرد الحصول على الـ Tokens، المهاجم يقدر:- الدخول على حساب الضحية
- الحفاظ على Session لفترة طويلة
- تجديد التوكن باستخدام Refresh Token
- تنفيذ سيطرة كاملة على الحساب
ازاى تمنع النوع ده من الثغرات؟ 🛡️
لو شغال على تطوير تطبيقات أندرويد أو Mobile Security، ركز على النقاط دي:✅ فعّل PKCE Mandatory
✅ متحطش client_secret جوه تطبيقات الموبايل
✅ استخدم App Links / Universal Links بدل Custom URI Schemes
✅ اقفل الـ Activities الحساسة باستخدام صلاحيات صحيحة
✅ اختبر الـ OAuth Flow بشكل دورى أثناء الـ Security Assessment
فى النهاية… ثغرات الـ OAuth ساعات بتبان بسيطة، لكن لما كذا مشكلة صغيرة تتربط ببعض، النتيجة ممكن تكون سيطرة كاملة على الحسابات 🔥✅ متحطش client_secret جوه تطبيقات الموبايل
✅ استخدم App Links / Universal Links بدل Custom URI Schemes
✅ اقفل الـ Activities الحساسة باستخدام صلاحيات صحيحة
✅ اختبر الـ OAuth Flow بشكل دورى أثناء الـ Security Assessment