Harvest uygulamasındaki açık yönlendirme Microsoft hesabı OAuth token’larının çalınmasına yol açabiliyordu
(eval.blog)- Harvest’in Outlook Calendar OAuth bağlantı akışında callback URL’i,
statedeğerindeki hedefe yeniden yönlenerek açık yönlendirme oluşturuyordu; örtük yetkilendirme akışıyla birleştiğinde token’lar harici URL’lere sızabiliyordu - Sorun Microsoft’ta değil, Harvest entegrasyonu tarafındaydı; kayıtlı OAuth
redirect_uri, kullanıcıyı saldırganın belirlediği domaine gönderen bir yönlendirme ara noktası haline geliyordu state, URI ile kodlanmış JSON’du;subdomainiçineexample.com/gibi sonunda eğik çizgi bulunan harici bir domain konduğundaexample.com/.harvestapp.com/...biçiminde yönlendirme yapıyordu- PoC, Microsoft OAuth authorize URL’inde
client_id=0dcef4db-36d8-4aed-9cc5-ab43e1814884,response_type=id_token,response_mode=fragment,scope=openidkullanarak#id_token=...fragment’ının yönlendirme hedefine eklendiği akışı gösteriyordu - Güvenlik açığı 23 Ağustos 2020’de bildirildikten sonra yamanın 1 Ağustos 2023’te yapıldığı doğrulandı; 22 Ekim 2023’te Harvest gecikmenin human error olduğunu söyleyerek özür diledi
OAuth callback’inde token’ın sızdığı akış
- Harvest, kullanıcıların Outlook Calendar’ı OAuth ile bağlayabildiği bir zaman takip yazılımıdır
- Yetkilendirme başarılı olduğunda kullanıcı
https://outlook-integration.harvestapp.com/auth/outlook-calendar/…adresine yönlendirilir - Bu callback, kullanıcıyı tekrar
stateiçinde sağlanan URL’ye taşır ve bu süreçte açık yönlendirme oluşur - İlk tespit edilen callback URL’inin
statedeğeri URI ile kodlanmış JSON’dur- Decode edildiğinde
{"return_to":"/","subdomain":"hackerone295"}biçimindedir subdomaindeğeri,hackerone295.harvestapp.comgibi bir Harvest uygulama alanını tahmin etmek için kullanılır
- Decode edildiğinde
subdomainiçineexample.com/gibi sonunda eğik çizgi bulunan bir değer koyulursa callback URL’i harici bir domaine yönlenecek hale gelir- Bu callback URL’i OAuth uygulamasına kayıtlı redirect_uri olduğundan, açık yönlendirme ile örtük yetkilendirme akışı birleştirildiğinde token yönlendirme hedefine sızabilir
- PoC authorize URL’i şu değerleri kullanır
client_id=0dcef4db-36d8-4aed-9cc5-ab43e1814884response_type=id_tokenredirect_uri=https://outlook-integration.harvestapp.com/auth/outlook-calendar/…?...scope=openidresponse_mode=fragmentstate=1nonce=123456
- Kullanıcı nihayetinde şu biçimde bir adrese yönlendirilir
https://example.com/.harvestapp.com/auth/… access token]&state=1
- Bu, Microsoft tarafında bir güvenlik açığı değildir
Bildirimden yamaya geçen süre
- Harvest ekibi, açığın açıklanması ve yama sürecinde çok az yanıt verdi; açığı triage ile kabul ettikten sonra da düzeltme uzun zaman aldı
- Güvenlik açığı 23 Ağustos 2020’de bildirildi ve Harvest ilk kez 16 Ekim 2020’de iletişime geçti
- 27 Kasım 2020’de rapor triaged durumuna alındı
- 28 Nisan 2022’de şirket düzeltme üzerinde çalıştığını ve tahmini süreyi 2 hafta olarak verdiğini söyledi, ancak gerçek düzeltme için yaklaşık 1 yıl daha gerekti
- 1 Ağustos 2023’te güvenlik açığının yamalandığı doğrulandı
- 21 Ekim 2023’te rapor, herkese açık bir yazıyla yayımlandı
- Aynı gün itibarıyla rapor hâlâ triage durumundaydı; bug bounty politikasında ödülden bahsedilmesine rağmen bounty veya HackerOne puanı verilmedi
- 22 Ekim 2023’te yazı dikkat çektikten sonra Harvest gecikmeyi human error olarak açıklayıp özür diledi
1 yorum
Hacker News yorumları
Bir bug bounty programı sorumlusu olarak içeride neler olduğunu açıklayayım. Zaten @0xcrypto’dan özür diledim ve içeride de açıkladım ama burada da toparlamanın doğru olacağını düşünüyorum
En başından beri bu sorunu tamamen yeniden üretemedik ve bir şeyi gözden kaçırırız diye kapatamadık. Son olarak “bir çözüm bulacağım” diye yanıt verdikten hemen sonra ise yeniden üretilemediği kanaatine yaklaşmıştık; benzer bir OAuth ile ilgili bildirim de gelince içeride karışıklık oldu ve bunun zaten işlenip iletildiğini sandık
Bildirim ayarları yüzünden sonraki mesajları kaçırdım ve konu Triage durumunda süresiz şekilde kaldı, güncelleme de yapılmadı. Bu bir bahane değil; ben de uzun süre bug bounty avcısı olarak çalıştım, bir şirketten güncelleme beklemenin ne kadar sinir bozucu olduğunu çok iyi biliyorum. Müşteri güvenliği en büyük önceliğimiz ve güvenlik sayfasında yazanlar da doğru
Üstelik artık yeniden üretilemeyen bir bildirimin nasıl ele alınacağı da belirsiz. Bunu HackerOne’da daha fazla tartışmak istedim ama özür mesajından sonra yine yanıtsızlık olmuş gibi görünüyor
Uygulamanın durumu sık sık sunucu durumuyla uyuşmuyor; sunucudaki değişiklikler ancak zorla yenilemeden sonra görünüyor ya da istemcideki değişiklikler kaydettikten sonra geri dönüyor. Zaman takibi kullanıcı deneyimi de rahatsız edici; butonlar ancak kaydırınca görünüyor ya da başlat/durdur/yeniden başlat/sil butonlarının yeri öğenin durumuna göre sürekli değişiyor. Eski uygulama güzel değildi ama sorunsuz çalışıyordu
Oldukça endişe verici. Harvest kullandığımda destek gerçekten harikaydı; yanıtlar hızlıydı, müşterilerin ürünü nasıl kullandığını çok ayrıntılı anlıyorlardı ve mevcut özellikleri yaratıcı biçimde nasıl kullanabileceğimi de detaylı anlatıyorlardı
Uygulanmamış özellikler için verilen yanıt ise “backlog’a ekleriz ama garanti veremeyiz” oluyordu. Mühendislik ekibinin 30 kişi olduğu yazıyor [1] ama bu kaynağın nereye gittiğini pek bilmiyorum. Çünkü başka özelliklerin de hızla çıktığını görmedim
“Harvest kullanıcısı” olarak spam almaya başlayınca müşteri listesini satmış olabileceklerinden şüphelendim ama şirket yöneticileri hemen devreye girip bunu güçlü şekilde reddetti ve derhal inceleme başlattı; yani bunu çok ciddiye aldılar. Bu iyiydi
Ama sonuçta bunun da bir mühendislik sorunu gibi göründüğünü söyleyebilirim. Aktif müşterileri oldukça kolay tahmin etmenin bir yolunu buldum; bu da “backlog”a girdikten sonra aylardır düzeltilmedi. Düzeltme çok küçük görünüyordu. Ayrıca MFA yalnızca Google ile girişte sunuluyor [2]. Yine de uygulamanın kendisi yaptığı işi gerçekten çok iyi yapıyor
1: https://www.getharvest.com/about/meet-the-team
2: https://support.getharvest.com/hc/en-us/articles/36005266713...
Bu başlıktaki bildirimi yapan kişiyle iletişimin bozulması tamamen benim hatamdı ve üstteki yanıtta açıkladığım gibi bunun bir daha yaşanmamasını sağlayacağım
Özellik isteklerimin bazıları gerçekten ürüne de girdi. Bunun benim etkimin sonucu olup olmadığını bilmiyorum ama en azından iyi bir zaman takip aracı konusunda benzer düşündüğümüzü hissettim
Başlık Microsoft’a karşı epey haksız görünüyor. Son dönemdeki kimlik doğrulama olayları nedeniyle Microsoft’un gündemde olmasından yararlanılmak istenmiş gibi; başlığı görür görmez “yine mi MS ihlali?” diye düşündüm
Gerçekte olan şey Harvest’in token’ı ve Harvest kodundaki enjeksiyon açığı yüzünden yalnızca Harvest uygulaması erişim yetkileri yanlış şekilde açığa çıkmış. Arkasında başka hangi kimlik sağlayıcısı olursa olsun aynı şekilde savunmasız olurdu
Çünkü bu açık yalnızca Microsoft hesap bağlantısı için kullanılan OAuth uygulamasını etkiliyor. İlk başlık “Microsoft OAuth token leak via open redirect in Harvest App” idi, sonra bunu “Microsoft Account's OAuth tokens leaking via open redirect in Harvest App” olarak değiştirdim. Hâlâ değiştirmeye açığım, önerilere açığım
RFC 6749, yetkilendirme sunucusunun bu tür saldırıları nasıl önlemesi gerektiğini ayrıntılı olarak ele alır
Yetkilendirme sunucusu, açık istemciler için yönlendirme URI’sinin kaydını zorunlu tutmalı; gizli istemciler için de bunu istemesi tavsiye edilir. İstekte bir yönlendirme URI’si verilirse, yetkilendirme sunucusu bunu kayıtlı değerle karşılaştırıp doğrulamalıdır
O halde Harvest uygulaması kötü amaçlı bir
redirect_urikaydetmemiş olmalı; peki bu nasıl mümkün oldu diye merak ediyorum. Microsoft OAuth sunucusu, OAuth istemcisinin kayıtlı yönlendirme URI’siyle karşılaştırırkenredirect_uriiçindeki URL parametrelerini görmezden mi geliyor?stateparametresine konmuş. Muhtemelen amaç, istenen herhangi bir yere yönlendirebilmektiAmaçlanan akış şu: Harvest yetkilendirme URL’sine git →
redirect_uri=registered_urivestate=some_encoded_final_uriile Microsoft yetkilendirme URL’sine yönlendiril → kullanıcı kimlik bilgilerini girsin → kayıtlı URI’ye yönlendirilsin →stateokunup içindeki URI’ye yeniden yönlendirilsinBu saldırı da hâlâ izin verilen URI’ye yönlendiriyor, ancak o uç nokta
statedeğerini okuyup yanıtı/token’ı olduğu gibi iletiyor. Hata üç parçalı:state’in kötüye kullanılması, madem kötüye kullanılacak en azındanstate’in şifrelenip doğrulanmaması ve örtük yetkinin açık bırakılması. Gerekliyse sınırlı amaçlı ayrı bir kayıt oluşturulmalıydıredirect_urideğeri Microsoft’a kayıtlı. Microsoft OAuth sunucusu Harvest’e yönlendirdikten sonra, Harveststateiçindeki verilere göre kendi yönlendirmesini uygulamışÖrtük yetki, bu yazıda da görüldüğü gibi, tam da bu nedenlerle epey korkunç
Bu arada yakında gelecek OAuth 2.1 spesifikasyonunda kaldırılması planlanıyor: https://www.ietf.org/archive/id/draft-ietf-oauth-v2-1-09.htm...
Açığın düzeltilmesi 3 yıl mı sürmüş? Ağustos 2020’den Ağustos 2023’e; Harvest ekibinin büyüklüğünü bilmiyorum ama yine de kabul edilemez görünüyor
Keşke bir OAuth uzmanı bu sorunu biraz daha ayrıntılı açıklasa. Blog yazısını birkaç kez okudum ama gerçek açığı hâlâ anlayamadım
Çok sınırlı OAuth bilgimle anladığım kadarıyla Harvest uygulaması Microsoft’tan kullanıcıyı doğrulamasını istiyor, Microsoft kullanıcıyı doğruladıktan sonra başarılı olursa callback URL’sine yönlendirip yanıt gövdesinde erişim token’ını iletiyor, öyle değil mi?
Bu durumda blog yazarı, dönüş URL’sini gerçek dönüş URL’si yerine example.com’a gidecek şekilde ayarlayan elle hazırlanmış bir URL üretmiş olmuyor mu?
harvestappalan adında ve saldırganın kontrol ettiği kısım, OAuth sunucusunun gözünde büyük ölçüde opak olanstateiçindeBu URL sayesinde birine
login.microsoftonline.combağlantısı gönderip “Harvest’e giriş yap” diyen bir giriş istemi gösterebilir ve ardından saldırgan gerçekten Harvest hesabıyla ilgili yetkileri elde edebilirNormalde bu mümkün değildir. Saldırgan,
example.coma yönlenen yeni bir uygulama kaydedebilir ama bu durumda Harvest’le ilgili yetkiler içeren bir erişim token’ı alamayacağı için işe yaramazMicrosoft tarafındaki OAuth uygulamasında geçerli yönlendirme izin listesi vardır; bu yüzden
login.microsoftonline.com/authorize?client_id=$harvestAppID&redirect_uri=attacker.comgibi denemeler Microsoft tarafında hata verir. Saldırının mümkün olmasının nedeni, geçerli biroutlook-integration.harvestapp.comURL’sinin erişim token’ını aldıktan sonra saldırganın sitesine yeniden yönlendirme yaparken erişim token’ını da aktarmasıdıroutlook-integration.harvestapp.comtarafındaydı. OAuth2 callback başarıyla tamamlandıktan sonra yapılacak işlemleri belirten bir JSON nesnesistateolarak kullanılıyordusubdomainözelliği, tarayıcıyıharvestapp.comalt alanına#id-tokenile birlikte yönlendirmek için kullanılıyordu. Sorun,subdomaindeğerinin aşağıdaki URL’ye doğrudan enjekte edilmesiydihttps://${subdomain}.harvestapp.com/...#id-token=...
JSON yükündeki
subdomainalanı sonuna eğik çizgi eklenmişattacker-controlled.com/gibi bir değerle ayarlanırsa URLhttps://attacker-controlled.com/.harvestapp.com/...#id-token=..olur ve tarayıcı başka bir alan adına giderken token sızarDolayısıyla bu OAuth’nun kendisinden kaynaklanan örtük bir sorun değil, zayıf bir uygulama
İş akışı kurulurken güvenilir callback URL’lerinin gerçek bir listesini oluşturmak yerine, callback URL izin listesinde joker karakter kullanmış olabilirler. Tamamen yanlış da olabilir
Neden 3 yıl beklediklerini anlamıyorum. Yayın öncesi erteleme süresi için 90 gün yeterli.
Yine de böyle ek ertelemelere araştırmacının ya da avukatının/temsilcisinin izin vermesi gerekir. Bu, normalden büyük meselelerde şirketin iyi niyetle talep edebileceği bir şeydir.
HackerOne şirketlerin böyle bir şeyi 3 yıl boyunca bekletmesine izin veriyorsa, rolünü düzgün yapmıyor gibi görünüyor.
En temel seviyede sadece bir güvenlik açığı ifşa platformu ve araştırmacının hukuk ekibi tarafından dava edilmemesini amaçlayan standart yasal metinler sağlar.
Çoğu durumda şirketler ifşa taleplerini reddeder. Araştırmacı izin almadan açıklarsa hem HackerOne hem de şirketle yaptığı anlaşmayı ihlal eder ve hukuki sorumlulukla karşı karşıya kalır. Bu durumda şirketin açıklamaya onay verdiği anlaşılıyor; müdahale çok yavaş olsa da bunu teslim etmek gerekir.
Benim de dört haneli ödül seviyesindeki hataların bir yıldan uzun süre düzeltilmediği birkaç deneyimim oldu ama bunu HackerOne'ın suçu olarak görmedim.
HackerOne umursamadı. Bu kişinin kendi kurallarını ihlal ettiğini defalarca bildirmemize rağmen ellerinden bir şey gelmediğini söylediler.
Çalışır durumdaki bir şirketi asgari operasyon kadrosuna kadar küçültüp, yetkisiz destek görevlilerinin soruları yanıtladığı bir yapı kalmış gibiydi. Oldukça eski bir olay, şimdi değişmiş olabilir ama o zamanki izlenim buydu.
HackerOne'ın haddini aştığını ve şirkete ne yapmasına “izin verileceğini” belirlediğini hissederlerse, şirketler basitçe HackerOne'dan ayrılıp kendi iç çözümlerini kurar.
Bu konunun neden Microsoft'a iletilmediğini anlamıyorum. Microsoft, sorun düzeltilene kadar bu OAuth uygulamasının erişim yetkisini iptal edebilirdi.
Yine de Microsoft'a OAuth ile bağlı buna benzer kötü uygulamadan binlerce tane vardır diye düşünüyorum.