Kaynağı Görüntüle, Anahtarı Kopyala, Her Şeyi Ele Geçir
Bir araştırmacı ClickUp'ın sayfa kaynağını açtı, JavaScript içinde gömülü bir API anahtarı buldu ve bu anahtarı kullanarak tek bir istekte 959 e-posta adresi ile 3.165 iç özellik bayrağını çekti. Anahtarın kapsamı, hız sınırı ve son kullanma tarihi yoktu.
Bir güvenlik araştırmacısı clickup.com adresine gitti. Sayfa kaynağını açtı. JavaScript içine gömülü bir API anahtarı buldu. Anahtarı kopyaladı. Tek bir GET isteği gönderdi.
959 e-posta adresi ve 3.165 iç özellik bayrağı aldı. Home Depot, Fortinet, Autodesk, Tenable, Rakuten ve Mayo Clinic çalışanları.
Tek bir dize. Tek bir istek. Her şey.
Bu nasıl olur
Birinin ön yüzün bir API'yi çağırması gerekiyordu. API kimlik doğrulaması istiyordu. Bu yüzden anahtarı JavaScript içine koydular. Yayınla, devam et, sonraki sprint.
Bu sofistike bir saldırı değil. Ne istismar var, ne zero-day, ne de sosyal mühendislik. Sadece view-source: ve curl. Bir tarayıcı ve bir terminal. Meraklı bir stajyerin ilk gününde yapabileceği türden bir şey.
Anahtarın kapsamı yoktu — API'nin açığa çıkardığı her şeye erişebiliyordu. Hız sınırı yoktu — tek bir istek her şeyi döndürdü. Son kullanma tarihi yoktu — birisi fark edene kadar anahtar çalışıyordu. İkinci faktör yoktu — dizeye sahip olmak tek geçiş noktasıydı.
Para boyutu
İnsanlar veri açığa çıkmasından bahsediyor. Bu verinin ne kadar ettiğinden bahsedelim.
Fortune 500 şirketlerinden 959 kurumsal e-posta adresi. Tehdit aktörlerinin para ödediği bir oltalama hedef listesi. İsimler, roller ve bu şirketlerin ClickUp kullandığı bilgisi — oltalamayı işe yaratan sosyal mühendislik bağlamı budur.
3.165 iç özellik bayrağı. Bu bir yol haritası. Rakiplere ClickUp'ın ne geliştirdiğini, ne test ettiğini, hangi özelliklerin bir kapının arkasında olduğunu söyler. Saldırganlara hangi özelliklerin yarı tamamlandığını ve muhtemelen savunmasız olduğunu söyler.
Bu bir gizlilik olayı değil. Bir iş zekası sızıntısı.
Neden bu durmaya devam ediyor
Bu, bu ay hakkında yazdığımız kaynak kodunda kimlik bilgisi bulunan dördüncü olay. Bitwarden'ın CLI'ındaki kimlik bilgileri düz metin dosyaları oldukları için toplandı. Vercel'in ortam değişkenleri "hassas" bayrağı varsayılan olmadığı için şifresi çözülebilirdi. Bir geliştirici, şifre çözme anahtarı aynı diskte olduğu için 634 Chrome parolasını kaybetti.
Desen hep aynı: bir kimlik bilgisi bir dize olarak var olur — bir dosyada, bir değişkende, sayfa kaynağında — ve bir şey onu okur. O şey değişir. Desen değişmez.
JavaScript içindeki API anahtarı, saldırı gerektirmeyen en bariz sürümdür. Anahtar yayınlanmıştır. Her ziyaretçiye sunulur. Tarayıcı onu indirir, işler ve sağ tıklayan herkese gösterir.
Neyin farklı olması gerekirdi
API çağrısı, istemci tarafından sabit bir anahtarla asla kimlik doğrulanmamalıydı. Seçenekler:
- Arka uç vekil sunucusu. Ön yüz, anahtarı sunucu tarafında tutan ve API çağrısını vekil sunucu üzerinden yapan kendi arka ucunuzu çağırır. Anahtar tarayıcıya hiç ulaşmaz.
- Oturum kapsamlı belirteçler. Ön yüz, kimlik doğrulamasından sonra kısa ömürlü, dar kapsamlı bir belirteç alır. Süresi dolar. Yalnızca kimliği doğrulanmış kullanıcının yapmasına izin verilen şeyleri yapabilir. Ana anahtar değildir.
- Hiç anahtar yok. Veri herkese açıksa, kimlik doğrulaması olmadan sunun. Herkese açık değilse, kimliği doğrulanmamış JavaScript'e sunmayın.
İstemci tarafındaki koda bir API anahtarı gömmek, ev anahtarınızı paspasın altına koymak ve adresinizi yayınlamak gibidir.
Kimlik bilgisi yaşam döngüsü sorunu
Bu ClickUp anahtarı muhtemelen bir kez oluşturuldu, bir JavaScript dosyasına yapıştırıldı, bir depoya işlendi, üretime dağıtıldı ve bir daha hiç düşünülmedi. Kimse anahtarı yenilemedi. Kimse kapsamını belirlemedi. Kimse son kullanma tarihi koymadı. Kimse neye eriştiğini izlemedi.
Çoğu kuruluştaki çoğu API anahtarının yaşam döngüsü budur. Aceleyle oluşturulur, ihtiyaç duyulan yere yapıştırılır, unutulur. Kod tabanlarında, yapılandırma dosyalarında, CI/CD hatlarında ve görünüşe göre sayfa kaynağında birikirler — her biri asla kilitlenmeyen bir kapı.
Soru, kuruluşunuzda böyle bir anahtarın olup olmadığı değil. Soru, kaç tane olduğudur ve birisi bugün birini kopyalasa bunu bilip bilmeyeceğinizdir.