Tüm yazılar
Güvenlik olayı6 dk okuma

Railway ihlali: uygulamanın secret'larını kesinti olmadan nasıl yenilersin

Row of metal keys on hooks while a robotic arm swaps one key for a new glowing one

Railway'de deploy ediyorsan muhtemelen o e-postayı çoktan aldın: ortam değişkenlerini yenile. Başka bir yerde deploy ediyorsan da okumaya devam et. Bu olay, her indie geliştiricinin taşıdığı bir riskin net bir örneği ve temizlik adımları her platformda aynı.

Ne olduğunu, neden tam olarak senin gibi insanların hedef alındığını ve uygulamanı çökertmeden her şeyi yenilemenin pratik bir yolunu anlatıyoruz.

Ne oldu

21 Ekim'de Railway, yetkisiz bir tarafın müşteri ortam değişkenlerini saklayan sistemlere eriştiğini ve bunların bir kısmının şifresi çözülmüş içeriğini ele geçirmiş olabileceğini açıkladı. Railway tüm deploy'ları durdurdu, key'lerin iptal edilmesi için upstream sağlayıcıları bilgilendirdi ve tüm kullanıcılarından, özel registry kimlik bilgileri dahil, ortam değişkenlerini yenilemelerini istedi.

Ön raporu daha fazla ayrıntı veriyor:

  • Saldırı penceresi 20 Ekim'den 22 Ekim'in ilk saatlerine (UTC) kadar sürdü. Build altyapısında bir yetki yükseltme girişimiyle başladı.
  • Workspace'lerin en fazla %1,85'inde, yani yaklaşık 100.000 workspace'te, bazı değişkenler potansiyel olarak ele geçirildi. Key'lerin şifrelenme biçimi nedeniyle Railway, etkilenen bir projede tam olarak hangi secret'ların açığa çıktığını henüz söyleyemiyor.
  • Saldırgan özellikle yapay zekâ sağlayıcılarının API key'lerini ve platform API key'lerini aradı. Railway, çok sayıda ortam değişkeni ya da çok sayıda yapay zekâ key'i olan workspace'leri daha yüksek riskli olarak işaretliyor.
  • Railway, ele geçirilen key'lerle yapılan yapay zekâ harcamalarını iade edemeyeceğini söylüyor. Bunu ilgili sağlayıcıyla görüşmen gerekiyor.

TechCrunch'ın haberine göre Railway, bunun yapay zekâ inference sağlayıcılarını ele geçirmeyi amaçlayan ve platformlara yönelik daha geniş bir kampanyanın parçası olduğunu düşünüyor. Aynı hafta yapay zekâ kodlama aracı OpenCode da hackerların müşterilerinin %1'inden fazlasına ait API key'lerini ve diğer secret'ları ele geçirdiğini açıkladı.

Hedefte neden geliştiriciler var

Çalınan yapay zekâ key'leri gerçek para ediyor. Saldırganlar erişimi yeniden satıyor ya da senin kotanı kendi iş yükleri için tüketiyor; araştırmacılar bu örüntüye LLMjacking diyor. Bir hosting platformu bu key'leri toplamak için verimli bir yer, çünkü binlerce uygulama OpenAI, Anthropic, Stripe ve veritabanı key'lerini tek bir yerde tutuyor.

Railway'in raporunda rahatsız edici bir ayrıntı var. Değişkenler şifreliydi, ama platformun onları build'lerine ve çalışan servislerine enjekte edebilmesi için şifrelerini çözebilmesi gerekiyor. Saldırgan doğru iç erişimi elde ettiğinde, bekleyen veri şifrelemesi onu durdurmadı. Bu Railway'e özgü değil. Kodunu çalıştıran her host secret'larını okuyabilir.

Yani asıl soru "host'um güvenli mi?" değil. Asıl soru şu: "Host'umun secret'ları yarın sızsa durum ne kadar kötü olur ve ne kadar hızlı toparlanabilirim?"

Ne kadar açıkta olduğunu nasıl kontrol edersin

Birkaç şey için "yenile"ye zaten tıkladıysan bile buna 20 dakika ayır.

1. Her secret'ın envanterini çıkar. Staging ve preview ortamları dahil, her proje ve ortamdaki değişken adlarını listele. Bir .env.example dosyan varsa iyi bir başlangıç noktası:

grep -oE '^[A-Z0-9_]+' .env.example

Her biri için neyin kilidini açtığını not et: bir veritabanı, bir ödeme sağlayıcı, bir yapay zekâ sağlayıcı, e-posta, bir storage bucket, bir GitHub token'ı.

2. Yapay zekâ sağlayıcı kullanımını ve faturalarını kontrol et. 20 Ekim'den bu yana kullanım sıçramalarına, tanımadığın modellere veya garip saatlerdeki isteklere bak. Kötüye kullanımın ilk ortaya çıkacağı yer büyük ihtimalle burası.

3. Elindeki audit log'larını kontrol et. Railway özellikle GitHub audit log'larını ve yüklü uygulama erişimlerini, ayrıca Docker Hub gibi registry log'larını incelemeyi öneriyor. Ödeme sağlayıcının API log'larına ve veritabanının bağlantı log'larına da bak.

4. Veritabanına internetten erişilip erişilemediğini kontrol et. Railway'in raporu veritabanlarına genel ağ erişiminin kaldırılmasını öneriyor. Sızan bir bağlantı dizesi herkesin bağlanabildiği bir veritabanını gösteriyorsa, sızıntı anında kullanılabilir:

nc -zv your-db-host.example 5432   # "succeeded" from your laptop = publicly reachable

5. Frontend'inin zaten neleri ele verdiğini kontrol et. Bu tür ihlaller, gerçek secret'ları tasarım gereği herkese açık olan değerlerden ayırmanın önemini hatırlatıyor. JavaScript bundle'ında gönderilen bir key zaten hiçbir zaman gizli değildi.

Frontend kodundaki API key'leri: gerçek secret'ları public key'lerden nasıl ayırırsın

Production'ı bozmadan nasıl yenilersin

İnsanların baskı altında yaptığı hata, önce eski key'i iptal etmek, sonra uygulama hata döndürürken yenisini deploy etmeye çabalamak. Bunun yerine şu sırayla ilerle:

  • Sağlayıcıda yeni bir kimlik bilgisi oluştur (yeni API key, yeni veritabanı parolası, yeni webhook secret'ı). Eskisini şimdilik aktif bırak.
  • Değişkeni host'unda güncelle ve çalışan uygulamanın yeni değeri alması için yeniden deploy et.
  • Uygulamanın yeni değerle çalıştığını doğrula. O servisi gerçekten kullanan bir endpoint'i çağır.
  • Eski kimlik bilgisini sağlayıcıda iptal et.
  • Eskisinin artık çalışmadığını doğrula; örneğin onunla bir test çağrısı yapıp başarısız olduğunu kontrol et.

Listende etki alanı en büyük olandan başlayarak ilerle: ödeme key'leri, veritabanı kimlik bilgileri, bulut ve storage key'leri, yapay zekâ sağlayıcı key'leri, GitHub ve registry token'ları, sonra geri kalan her şey. Railway'in kendi rehberi 21 Ekim'den önce ayarlanmış değişkenlere odaklanıyor; sonraki tavsiyeleri ise GitHub bağlantısını yeniden kurmayı ve CLI ile CI kimlik bilgilerini yeniden oluşturmayı da ekliyor.

Bazı secret'lar ekstra özen istiyor:

  • Oturum imzalama veya JWT secret'ları. Bunları değiştirmek tüm kullanıcıların oturumunu kapatır. Bir ihlalden sonra bu genellikle kabul edilebilir, ama mümkünse kullanıcılarını önceden uyar.
  • Webhook imzalama secret'ları. Alıcı tarafı ve gönderen sağlayıcıyı birlikte güncelle, yoksa bir süre meşru event'leri reddedersin.
  • Veritabanı parolaları. Platformun destekliyorsa aynı yetkilere sahip yeni bir veritabanı kullanıcısı oluştur, uygulamayı ona geçir, sonra eski kullanıcıyı sil. Bu, parolayı yerinde değiştirmekten daha temiz.

Bir sonraki ihlalin daha az canını yakmasını sağla

Host'unun ihlal edilmesini engelleyemezsin. Ama sızan bir secret'ın değerini düşürebilirsin.

Key'lerin kapsamını dar tut. Sağlayıcılar sunuyorsa kısıtlı key'ler kullan. Yalnızca checkout oturumu oluşturabilen bir Stripe restricted key, tam yetkili bir secret key'e göre saldırgan için çok daha az işe yarar.

Harcamaya sınır koy. Her yapay zekâ sağlayıcısında aylık bütçe ve kullanım uyarıları ayarla. Böylece beş haneli sürpriz bir fatura, bir e-postaya dönüşür.

Ortamları ayır. Production key'lerini staging veya preview deploy'larında yeniden kullanma. Her ortamın kendi kimlik bilgileri olmalı ki birindeki sızıntı diğerini de teslim etmesin.

Veritabanlarını gizli tut. Platformunun özel ağını kullan; Supabase kullanıyorsan Row Level Security'nin açık olduğundan emin ol ki sızan bir anon key tablolarını açığa çıkarmasın.

Supabase Row Level Security: nasıl açılır ve test edilir

Secret'ları asla erişilebilir dosyalarda tutma. Web kök dizinine deploy edilmiş bir .env dosyası, hiçbir ihlale gerek kalmadan sızar.

Yenileme runbook'unu şimdi yaz: 1. adımdaki liste, yukarıdaki sıra ve her key'in nerede yönetildiği. Bir dahaki sefere yenileme bir hafta sonu yerine bir saat sürer.

Açıkta kalan .env dosyaları: saldırganlar onları nasıl bulur ve seninkini nasıl kontrol edersin

Hızlı kontrol listesi

Deploy ettiğin her uygulama için bunun üzerinden geç:

  • Her ortamdaki her secret, neyin kilidini açtığıyla birlikte listelendi.
  • Her biri oluştur, deploy et, doğrula, iptal et sırasıyla yenilendi.
  • 20 Ekim'den bu yana yapay zekâ sağlayıcı kullanımı ve faturaları incelendi, harcama limitleri ayarlandı.
  • GitHub, registry, ödeme ve veritabanı log'ları kontrol edildi.
  • Veritabanlarına internetten erişilemiyor.
  • Production ve staging farklı key'ler kullanıyor.
  • Frontend kodunda gerçek secret yok ve web üzerinden erişilebilen dosyalarda da durmuyor.

Özetle

Railway hızlıca açıklama yapıp yenilemeyi zorlayarak doğru olanı yaptı. Ama bu, hosting ve geliştirici platformlarının başına gelmeye devam ediyor, çünkü key'ler orada. Bunu sakin atlatan geliştiriciler, hangi secret'lara sahip olduğunu bilen ve hepsini bir öğleden sonrada değiştirebilenler.

Temizlik yaparken uygulamanın dışarıdan neleri açığa çıkardığını kontrol etmeye de değer. AppSafe canlı siteni JavaScript bundle'larındaki API key'leri, açıkta kalan .env ve .git dosyaları ve eksik güvenlik header'ları gibi yaygın sorunlar için tarar ve anlaşılır düzeltmeler sunar. Yapay zekâ ile geliştirilen uygulamalar için hazırladığımız yayın kontrol listesi diğer temel konuları kapsıyor.

Her şeyi yeniledikten sonra, başka hiçbir şeyin sızmadığından emin olmak için ücretsiz bir AppSafe taraması çalıştır.

Bu kontrol listesini otomatik çalıştır

Tek bir ücretsiz tarama, uygulamanı tüm bu sorunlara karşı kontrol eder ve her bulgu için sana bir AI düzeltme prompt'u verir.

Uygulamamı ücretsiz tara