
Дослідник отримав 90 000 доларів за виявлення вразливості віддаленого виконання коду на сайтах розробників Google
Дослідник виявив, що платформа Google DevSite зберігала секрети OAuth у сесійних куках Flask і використовувала той самий ключ для підпису, що дозволяло підроблені куки та несанкціоноване віддалене виконання коду.
Секретні дані OAuth, заховані в сесійних куках
Дослідник безпеки Simon Koeck виявив, що на сайтах документації для розробників Google загальний процес OAuth безпосередньо розміщував чутливі секретні дані в сесійних куках Flask. При вході за адресою /oauth2authorize на developers.google.com створюється сесійна кука, яка підписана, але не зашифрована, що означає, що власник куки може декодувати її вміст.
Усередині куки Koeck знайшов серіалізований за допомогою pickle об'єкт oauth2client.client.OAuth2WebServerFlow, який містив діючі client_id та client_secret Google OAuth у відкритому тексті. Ще більш критичним було те, що той самий client secret також був SECRET_KEY Flask, за допомогою якого самі куки підписувалися. Він підтвердив це шляхом офлайн-перерахунку підпису з використанням HMAC та генерації ключа cookie-session, в результаті чого отримав байт-у-байт ідентичний результат підпису на виданій куці.
Від підробленої куки до віддаленого виконання коду
Після відновлення ключа підпису Koeck міг створювати довільні сесійні куки, які сервер приймав як дійсні. Callback OAuth зчитує об'єкт flow із сесії та передає його в pickle.loads, який під час unpickling виконує код за допомогою опкоду REDUCE.
Замість запуску команд на продакшн-системах Google Koeck тимчасово підтвердив вразливість. Payload, який зменшувався до time.sleep(N), створював затримки відповіді відповідно до обраного значення: 0,207 секунди для sleep(0), 3,193 для sleep(3), 5,194 для sleep(5) та 8,283 для sleep(8). Контрольні тести підтвердили цю поведінку: відсутність куки, змінений байт підпису або відсутність запису flow у всіх випадках повертали повідомлення «Invalid request», тоді як sleep payload затримував відповідь рівно на необхідну кількість часу.
Вплив і винагорода
Вразливість стосувалася всієї платформи DevSite, тому відновлений ключ дозволяв підробляти дійсні сесії на firebase.google.com, developer.android.com, source.android.com та docs.partner.android.com. Google прийняла звіт і присудила винагороду в розмірі 90 000 доларів, що розраховується як базова сума 75 000 доларів за звичайний RCE в Google Applications, помножена на 1,2 за виняткову серйозність облікового запису. Звіт був подано 6 серпня 2026 року, перевірено й прийнято 7 серпня, а виправлено 7 жовтня 2026 року.
Виправлення
Google внесла чотирирівневу зміну: замінила обидва розкриті секрети клієнтів OAuth та анулювала сесії, підписані ними, кожному розгортанню надала власний високоентропійний SECRET_KEY Flask із сховища на стороні сервера, яке не пов'язане з даними OAuth, об'єкт flow OAuth залишила на сервері, а в куках зберігає лише непрозоре посилання, і замінила pickle на схемо-валідований формат лише для даних для всього, що перетинає межу клієнта. Будь-яка з цих змін окремо розірвала б ланцюг атаки.
Джерела: simonkoeck.com
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.