· kaynak Hacker News – Front Page (native)
Google'ın sızan OAuth secret'i aynı zamanda imzalama anahtarıydı: geliştirici sitelerinde RCE imkânı
Bir araştırmacı, Google'ın paylaşımlı DevSite oturum çerezindeki OAuth client secret'in aynı zamanda Flask imzalama anahtarı olduğunu buldu; bu sayede sahte çerezlerle Google sunucularında kimlik doğrulaması gerektirmeyen uzaktan kod çalıştırma yapılabiliyordu.

Bir güvenlik araştırmacısı, Google'ın geliştirici sitelerindeki paylaşımlı bir OAuth endpoint'inin kimlik doğrulaması gerektirmeyen uzaktan kod çalıştırmaya (RCE) yol açabileceğini gösterdikten sonra Google'dan 90.000 dolar ödül kazandı.
simonkoeck.com adresinde yayımlanan ve Hacker News'in ana sayfasına taşınan bir yazıda detaylandırılan bulgu, Google'ın geliştirici dokümantasyon sitelerinin paylaştığı OAuth giriş akışını hedefliyordu. Yazıdaki zaman çizelgesine göre Google, 6 Ağustos 2026'da gönderilen raporu bir gün içinde triyaj etti, sorunu 7 Ekim'de düzeltti ve 75.000 dolar ödül verdi — bu, Google'ın Normal Google Applications olarak adlandırdığı kategoride S0 şiddetinde bir RCE için temel ödeme — ve rapor kalitesi nedeniyle %20 artırıldı.
Aşırı büyük bir oturum çerezi
Çalışma, developers.google.com üzerindeki /oauth2authorize endpoint'iyle başladı; bu endpoint bir Flask oturum çerezi ayarlıyor ve hesap gerektirmeden kullanıcıyı Google'ın giriş sayfasına yönlendiriyordu. Çerez dikkat çekti çünkü yaklaşık 1.200 bayt boyutuyla, bir CSRF token'ı ve bir dönüş URL'sinin gerektirdiğinden çok daha büyüktü.
Flask oturum çerezlerini şifrelemek yerine imzalar, dolayısıyla içerikleri onu alan herkes tarafından okunabilir. Araştırmacı, payload'ı açtıktan sonra içinde Google'ın OAuth client_id ve client_secret bilgilerini barındıran eksiksiz bir OAuth2WebServerFlow nesnesine ayrışan, base64 ile kodlanmış bir pickle içeren bir JSON oturum nesnesi buldu. Yazıda secret'in yazım anında hâlâ geçerli olduğu belirtiliyor, ancak yayımlanan sürümde üzeri karartılmış.
Kendini imzalayan secret
Bir çerezde gezen client secret başlı başına bir bulgu, ancak araştırmacı daha kötü bir şey fark etti: aynı değer çerezin imzasını da doğruluyordu; yani Flask imzalama anahtarı, onu imzalamak için kullanıldığı nesnenin içinde gömülüydü.
Bunun tesadüf olmadığını doğrulamak için araştırmacı, Flask'ın itsdangerous çerez oturumu anahtar türetmesini kullanarak beklenen imzayı çevrimdışı yeniden hesapladı ve bayt bayt birebir eşleşme elde etti. İmzadaki tek bir karakteri değiştirmek reddedilmeye yol açarken, ele geçirilen secret ile orijinal payload'ın yeniden imzalanması kabul edildi. Anahtar bilindiğinde, oturumdaki her anahtar ve değer, sunucunun kabul edeceği bir imza üretilecek şekilde sahtelenebilirdi.
Sahte çerezden kod çalıştırmaya
Kod çalıştırma, OAuth callback'in oturumu ele alma biçiminden kaynaklandı: flow girdisini geri okuyor, base64 ile çözüyor ve baytları pickle.loads'a geçiriyor. Pickle bu konumda yalnızca başka hiç kimse geçerli bir çerez sahtelayamadığı sürece güvenlidir; imzalama anahtarı ortaya çıktığında bu varsayım çöküyor. Bir pickle REDUCE opcode'u çağrılabilir bir fonksiyonu ve argümanlarını adlandırır ve unpickle işlemi onu çağırır.
Saldırgan CSRF token'ını ve flow anahtar adını da kontrol ettiği için sunucuda hiçbir şeyin uyuşması gerekmiyor. Araştırmacı, Google'ın production sistemlerinde komut çalıştırmak yerine, çalıştırmayı zamanlama yoluyla kanıtladı: time.sleep(N)'e indirgenen payload'lar yanıtları tam olarak seçilen saniye sayısı kadar geciktirirken, kontrol istekleri — çerez yok, kurcalanmış imza veya eşleşen bir flow girdisi olmayan geçerli bir imza — hepsi düzgün şekilde başarısız oldu.
Tek bir site değil, bir platform
developers.google.com paylaşımlı DevSite platformu üzerinde yer aldığından, ele geçirilen anahtar yazıya göre firebase.google.com, developer.android.com, source.android.com ve docs.partner.android.com için de geçerli oturumlar imzalıyordu.
Düzeltme dört üst üste değişiklik gerektirdi: ifşa olan OAuth client secret'lerini döndürmek ve onlarla imzalanmış tüm oturumları geçersiz kılmak; her deployment'a sunucu tarafında saklanan kendi yüksek entropili Flask secret'ini vermek; OAuth flow nesnesini sunucuda tutmak böylece çerezlerin yalnızca opak bir referans taşımasını sağlamak; ve istemci sınırını geçen her şey için pickle'ı şema doğrulamalı, yalnızca veri içeren bir formata değiştirmek. Zincirdeki tek bir halkayı kırmak bile saldırıyı durdururdu.
Neden önemli
Bu zincir katmanlı hataların bir örneği: aşırı büyük bir çerez, çifte görev yapan bir secret ve tehlikeli bir deserializer'ın her biri tek başına göründüğünde sorun gibi durmuyordu, ama birlikte araştırmacıya göre yalnızca iki GET isteğiyle kimlik doğrulaması gerektirmeyen kod çalıştırmaya yol açtı. Ayrıca paylaşımlı platformların etki alanını nasıl büyüttüğünü de gösteriyor; zira tek bir anahtarın ele geçirilmesi beş Google alan adını kapsıyordu. Geliştiriciler için dersler somut: asla içinde anahtar saklanan bir çerezi o anahtarla imzalamayın, asla istemcinin etkileyebileceği pickle verisini deserialize etmeyin ve sunucu tarafı oturum durumunu yedek değil varsayılan olarak görün.
- #security
- #oauth
- #flask
- #bug-bounty
İlgili yazılar
- Aktif olarak istismar edilen F5 BIG-IP APM heap overflow'ı, ağ kenarında kimlik doğrulaması gerektirmeyen RCE imkânı sunuyor
- Google, Air ile Pixel Watch arasına OLED ekranlı 179,99 dolarlık Fitbit Edge'i tanıttı
- Tespit rehberi, Gitea SSRF zafiyeti CVE-2026-101027'nin istismarını yakalama yolunu haritalıyor