Исследователь безопасности обнаружил уязвимость удалённого выполнения кода на сайтах документации для разработчиков Google. Изучая поток OAuth, общий для этих сайтов, исследователь заметил, что эндпоинт /oauth2authorize устанавливает необычно большой cookie сессии Flask, около 1 200 байт, что намного больше, чем нужно для CSRF-токена и URL возврата. Cookie сессий Flask подписываются, но не шифруются, поэтому их содержимое могло прочитать любой, кто владел таким cookie.
Декодирование cookie показало объект, сериализованный через pickle, в котором открытым текстом находились client_id и client_secret OAuth от Google. Исследователь выяснил, что client secret также использовался как SECRET_KEY для Flask, то есть одно и то же значение и создавало, и проверяло подпись. Поскольку ключ подписи был раскрыт в самом cookie, исследователь мог офлайн пересчитывать корректные подписи и подделывать произвольные данные сессии.
Эндпоинт обратного вызова читает данные потока OAuth из сессии и передаёт их в pickle.loads. С подделанной сессией злоумышленник мог подставить вредоносную полезную нагрузку pickle, что превращало это в путь удалённого выполнения кода без аутентификации. Исследователь безопасно проверил проблему, используя полезную нагрузку, которая лишь вызывала time.sleep, не выполняя никаких команд на производственных системах Google.
Отчёт наглядно показывает, как хранение секретов в клиентских данных сессии и десериализация недоверенных данных pickle могут сочетаться в критическую уязвимость. За эту ошибку была выплачена награда в размере $90 000.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing