العودة
باحث يحصل على 90 ألف دولار مقابل ثغرة تنفيذ تعليمات برمجية عن بُعد في مواقع مطوري Google
SiTech AI Team3 دقيقة قراءة

باحث يحصل على 90 ألف دولار مقابل ثغرة تنفيذ تعليمات برمجية عن بُعد في مواقع مطوري Google

اكتشف باحث أن منصة DevSite التابعة لـ Google كانت تخفي أسرار OAuth في ملفات تعريف الارتباط لجلسات Flask وتستخدم المفتاح نفسه للتوقيع، مما أدى إلى تنفيذ تعليمات برمجية عن بُعد غير مصرّح به عبر ملفات تعريف ارتباط مزيفة.

بيانات OAuth السرية المخبأة في ملفات تعريف ارتباط الجلسة

اكتشف باحث الأمن Simon Koeck أن تدفق OAuth العام في مواقع وثائق المطورين التابعة لـ Google كان يعرض بيانات سرية حساسة مباشرة في ملفات تعريف ارتباط جلسات Flask. عند الدخول إلى العنوان /oauth2authorize على developers.google.com، يتم تعيين ملف تعريف ارتباط للجلسة يكون موقّعاً لكنه غير مشفر، مما يعني أن مالك ملف تعريف الارتباط يمكنه فك تشفير محتوياته.

عثر Koeck داخل ملف تعريف الارتباط على كائن oauth2client.client.OAuth2WebServerFlow مُسلسل باستخدام pickle، والذي كان يحتوي على client_id و client_secret الخاص بـ Google OAuth النشط كنص عادي. والأكثر خطورة أن نفس الـ client secret كان أيضاً SECRET_KEY الخاص بـ Flask، الذي كانت تُوقع به ملفات تعريف الارتباط نفسها. وقد أثبت ذلك بإعادة حساب التوقيع دون اتصال باستخدام HMAC وتوليد مفتاح cookie-session، مما أسفر عن نتيجة مطابقة بايتاً بايت للتوقيع الموجود على ملف تعريف الارتباط المُقدم.

من ملف تعريف ارتباط مزيف إلى تنفيذ تعليمات برمجية عن بُعد

بعد استعادة مفتاح التوقيع، تمكن Koeck من إنشاء ملفات تعريف ارتباط جلسات اعتباطية يقبلها الخادم باعتبارها صالحة. يقرأ callback الخاص بـ OAuth كائن flow من الجلسة ويمرره إلى pickle.loads، الذي ينفذ التعليمات البرمجية عبر رمز REDUCE أثناء عملية unpickling.

بدلاً من تنفيذ أوامر على أنظمة الإنتاج الخاصة بـ Google، أثبت Koeck الثغرة زمنياً. الحمولة التي تُرجع إلى time.sleep(N) أحدثت تأخيرات في الاستجابة تتناسب مع القيمة المختارة: 0,207 ثانية لـ sleep(0)، و3,193 لـ sleep(3)، و5,194 لـ sleep(5)، و8,283 لـ sleep(8). وأكدت الاختبارات الضابطة هذا السلوك: فغياب ملف تعريف الارتباط، أو تغيير بايت في التوقيع، أو غياب سجل flow، كانت جميعها تُرجع رسالة "Invalid request" في كل الحالات، بينما كانت حمولة sleep تُبطئ الاستجابة بالكمية المطلوبة تماماً.

التأثير والمكافأة

كانت الثغرة تؤثر على منصة DevSite بأكملها، لذا فإن المفتاح المستعاد كان يوقع جلسات صالحة على firebase.google.com و developer.android.com و source.android.com و docs.partner.android.com. قبلت Google البلاغ ومنحت مكافأة قدرها 90 ألف دولار، تُحسب على أنها المبلغ الأساسي البالغ 75 ألف دولار لثغرة RCE عادية في تطبيقات Google، مضروباً في 1,2 لخطورة البلاغ الاستثنائية. قُدم البلاغ في 6 أغسطس 2026، وتم التحقق منه وقبوله في 7 أغسطس، وأُصلح في 7 أكتوبر 2026.

الإصلاح

أدخلت Google تغييراً مقسماً إلى أربع طبقات: استبدلت كلا سري عميلي OAuth المكشوفين وأبطلت الجلسات الموقعة بهما، ومنحت كل نشر مفتاح SECRET_KEY خاصاً عالي الانتروبيا لـ Flask من مخزن موجود على جانب الخادم وغير مرتبط ببيانات OAuth، وتركت كائن flow الخاص بـ OAuth على الخادم مع تخزين مرجع غير قابل للقراءة فقط في ملفات تعريف الارتباط، واستبدلت pickle بتنسيق بيانات يتحقق من المخطط لكل شيء يتجاوز حدود العميل. أي تغيير واحد من هذه التغييرات كان سيقطع سلسلة الهجوم.

المصادر: simonkoeck.com

SSiTech

SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي

نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.