- Yalnızca
git pushyolundaki dahili protokol kusuru üzerinden arka uçta uzaktan kod çalıştırma mümkündü; GitHub.com için azaltım zaten uygulanmış durumda, ancak GHES tarafında yama gerekiyor - Kullanıcı denetimindeki push option değeri doğrudan
X-Statbaşlığına girdiği için tek bir noktalı virgülle yeni alan enjekte edilebiliyordu; aynı anahtarın sonraki değeri önceki değeri ezdiği last-write-wins davranışı da istismar edildi - Enjekte edilebilen alanlar arasında
rails_env,custom_hooks_dir,repo_pre_receive_hooksbirlikte kullanılarak sandbox aşılabiliyor ve saldırganın belirlediği yoldaki hook'largitkullanıcısı yetkileriyle çalıştırılabiliyordu - Aynı mekanizma ile GitHub.com'un enterprise mode bayrağı da enjekte edilebildi; böylece shared storage node üzerinde kod çalıştırma doğrulandı ve o düğümdeki diğer kullanıcı ve kuruluş depolarının da okunabildiği bir duruma yol açtı
- Farklı servislerin paylaşılan biçime güvendiği çok servisli mimarilerde, girdi temizleme eksikliği, üretim dışı yürütme yolları ve yol doğrulama eksikliğinin birleşerek ciddi zafiyetlere dönüşebileceğini gösteriyor
Acil müdahale ve etki kapsamı
- GitHub.com tarafında bu sorun zaten azaltıldı; ek bir işlem gerekmiyor
- GitHub Enterprise Server için acil müdahale gerekiyor ve
CVE-2026-3854düzeltmesini içeren GHES 3.19.3 veya üstüne yükseltilmesi gerekiyor - Etkilenen sürüm aralığı GHES 3.19.1 ve altı; düzeltilmiş sürümler olarak
3.14.24,3.15.19,3.16.15,3.17.12,3.18.6,3.19.3veriliyor - Yazının hazırlandığı sırada GHES instance'larının %88'i hâlâ etkilenebilir durumdaydı
- GitHub'ın ek teknik bilgileri ve kurtarma prosedürleri GitHub güvenlik blogunda bulunabilir
- Wiz müşterileri, Wiz Threat Center'daki hazır sorgular ile savunmasız GHES instance'larını tespit edebilir
Araştırmanın arka planı ve yaklaşım
- GitHub'ın dahili git altyapısı, tüm
git pushişlemlerini işleyen bir yol ve birden fazla dahili servis farklı programlama dilleriyle yazılmış durumda - Bu tür çok servisli yapılarda, her bileşenin paylaşılan veriyi ayrıştırma ve ona güvenme biçimindeki farklar zafiyetlere yol açabiliyor
- Daha önce bu pipeline'ı oluşturan büyük miktardaki derlenmiş kara kutu binary'leri çıkarmak ve denetlemek aşırı zaman ve el emeği gerektiriyordu
- AI destekli araçlar ve
IDA MCPtabanlı otomatik tersine mühendislik sayesinde derlenmiş binary'ler hızlıca analiz edilip dahili protokol yeniden kurulabildi - Bu süreçte, kullanıcı girdisinin tüm pipeline boyunca sunucu davranışını etkilediği noktalar sistematik olarak izlendi ve girdi akışındaki temel kusur ortaya çıkarıldı
Dahili mimari ve güven sınırları
git pushSSH üzerinden geldiğinde istek sırasıylababeld,gitauth,gitrpcdve pre-receive hook üzerinden ilerliyorbabeld, tüm git işlemlerinin giriş noktası olarak SSH bağlantısını alıyor; kimlik doğrulama isegitauth'a iletiliyorgitauth, kullanıcı kimlik bilgilerini ve deponun push yetkisini doğruluyor; dosya boyutu sınırları veya branch adı kuralları gibi güvenlik politikalarını geri döndürüyorbabeld, bu yanıta dayanarak güvenlik metaverisi içeren dahiliX-Statbaşlığını oluşturuyorgitrpcd,X-Statbaşlığını alıp sonraki süreç ortamını ayarlıyor ve herhangi bir ek doğrulama yapmadan tamamenbabeld'ye güveniyor- pre-receive hook, push kabul edilmeden önce dosya boyutu sınırlarını, branch adı kurallarını, LFS bütünlüğünü ve yönetici tanımlı özel hook'ları denetliyor
- Temel bağlayıcı unsur,
;ile ayrılankey=valueçiftlerini taşıyan X-Stat başlığıydı - Dahili servisler
X-Stat'ı;karakterine göre bölerek bir map dolduruyor; aynı anahtar iki kez gelirse sonraki değer önceki değeri eziyor; bu last-write-wins kuralı izleniyor babeld,git push -oile iletilen push options değerlerini depush_option_0,push_option_1,push_option_countgibi alanlar olarakX-Statiçine ekliyordu
Zafiyetin nedeni: X-Stat alan enjeksiyonu
babeld, kullanıcı denetimindeki push option değeriniX-Statbaşlığına kopyalarken noktalı virgülleri temizlemiyordu;,X-Statalan ayıracı olduğundan, push option içindeki tek bir noktalı virgül orijinal alanın dışına çıkıp saldırgan denetiminde yeni alanlar oluşturabiliyordu- Örneğin
push_option_0içinelarge_blob_rejection_enabled=bool:falseenjekte edilirse, daha önce ayarlanmışbool:truedeğeri sonraki değer tarafından ezilebiliyordu - Bu davranış hem binary analizi sırasında hem de gerçek GHES instance'ları üzerindeki paket yakalamalarında doğrulandı
- Tersine mühendislik ve wire-level analizin birleşimiyle enjekte edilebilir
X-Statalanları haritalandı - Özellikle güvenlik açısından kritik alanlar olarak
rails_env,custom_hooks_dir,repo_pre_receive_hooks,large_blob_rejection_enabled,reject_sha_like_refs,user_operator_modebelirlendi - Bunlar içinde
rails_env,custom_hooks_dir,repo_pre_receive_hooksüçlüsü uzaktan kod çalıştırmaya götüren asıl unsurdu
GHES üzerinde RCE'ye giden yol
- GHES, push kabul edilmeden önce çalışan custom pre-receive hooks desteği sunuyor
- pre-receive binary'sinde, yalnızca
X-Statiçindekirails_envdeğerine göre ayrılan iki yürütme yolu vardı - Değer
productionise hook sandbox içinde çalıştırılıyor; başka bir değer ise sandbox veya izolasyon olmadan doğrudangitservis kullanıcısı yetkileriyle çalıştırılıyordu - Bu nedenle
rails_envalanına üretim dışı bir değer enjekte edilerek sandbox atlatılabiliyordu - Ardından
custom_hooks_direnjekte edilerek hook script'lerinin aranacağı varsayılan dizin saldırganın denetimine bırakılabiliyordu - Son olarak
repo_pre_receive_hooksalanına path traversal içeren bir hook tanımı enjekte edildiğinde, binary'nin yol çözümlemesi saldırgan denetimindeki dizin ile traversal yükünü birleştirerek dosya sisteminde keyfi bir yolu hedefliyordu - Üretim dışı yürütme yolu, bu şekilde çözümlenen yolu herhangi bir argüman olmadan, sandbox olmadan ve
gitservis kullanıcısı olarak doğrudan çalıştırıyordu - Gerçek doğrulamada tek bir
git pushileuid=500(git)çıktısı döndü ve böylecegitkullanıcısı yetkileriyle RCE doğrulandı - Bu yetkiyle, GHES instance'ının dosya sisteminde okuma-yazma ve dahili servis yapılandırmalarına görünürlük dahil tam denetim elde etmek mümkündü
GitHub.com'a genişleme ve tenant'lar arası maruziyet
- Aynı exploit zinciri GitHub.com deposuna uygulandığında ilk başta push başarılı oldu ancak custom hooks çalışmadı
user_operator_mode=bool:trueenjekte edilip iki platformun debug çıktıları karşılaştırıldığında, GitHub.com üzerinde custom hooks kod yoluna girilmediği görüldü- Ek tersine mühendislikle, sunucunun enterprise mode davranışını kontrol eden bir boolean bayrağın
X-Statbaşlığında bulunduğu anlaşıldı - GHES'te bu bayrak varsayılan olarak true olduğundan custom hooks yolu her zaman etkin; GitHub.com'da ise varsayılan değer false olduğu için normal durumda o yola ulaşılamıyor
- Bu bayrak da aynı mekanizma ile enjekte edilebildiğinden, bir alan daha eklenerek GitHub.com'da da tüm exploit zinciri çalıştırılabildi
- Sonrasında GitHub.com altyapısı içinden
hostnamekomutunun çıktısı döndü ve GitHub.com RCE doğrulandı - GitHub.com, çok kiracılı bir platform olduğu için farklı kullanıcı ve kuruluşların depoları paylaşılan arka uç altyapısında tutuluyor
- Kod çalıştırmanın gerçekleştiği yer bir shared storage node idi ve burada
gitkullanıcısı, o düğümdeki tüm depo işlemlerini yürütmek için geniş dosya sistemi yetkilerine sahipti - Bu kullanıcının ele geçirilmesi, düğümdeki diğer kuruluş ve kullanıcıların depolarının da sahiplerinden bağımsız olarak okunabilmesi anlamına geliyordu
- Ele geçirilen iki düğümde erişilebilir depo dizin girdileri listelendiğinde, her düğümde milyonlarca girdi bulunduğu ve bunların başka kullanıcı ve kuruluşların depolarını da içerdiği görüldü
- Başka tenant depolarının gerçek içeriklerine erişilmedi; yalnızca kendi test hesapları kullanılarak
gitkullanıcısının dosya sistemi yetkilerinin düğümdeki tüm depoları okuma imkânı verdiği doğrulandı
Temel dersler ve açıklama takvimi
- Yalnızca tek bir
git pushile dahili protokol kusuru istismar edilip arka uç altyapıda uzaktan kod çalıştırma mümkün olabildi - Farklı dillerle yazılmış birden fazla servis paylaşılan bir dahili protokol üzerinden veri alışverişi yaptığında, servislerin güven varsayımları başlı başına saldırı yüzeyi hâline geliyor
- Bu zincirde, bir servis push option değerini olduğu gibi ekledi, başka bir servis
X-Statiçindeki tüm alanlara güvendi ve pre-receive hook üretim ortamındarails_envdeğerininproductionolacağını varsaydı - Üretim binary'leri içindeki üretim dışı kod yolları, hook script'lerinde path traversal doğrulamasının olmaması ve ayraç tabanlı protokollerde girdi temizleme eksikliği; başka kod tabanlarında da görülebilecek kalıplar
- Çok servisli mimariler işleten ekiplerin, özellikle güvenlik açısından hassas yapılandırmalar paylaşılan veri biçimlerinden türediğinde, kullanıcı denetimindeki girdinin dahili protokol boyunca nasıl aktığını incelemesi gerekiyor
- Bu araştırmada
IDA MCPdahil AI destekli tersine mühendislik araçları, derlenmiş binary analizini ve dahili protokolün yeniden kurulmasını ciddi biçimde hızlandırdı - Bu tür araçlar olgunlaştıkça, derin bileşenler arası analiz gerektiren zafiyet sınıflarını bulmada daha da önemli bir rol oynayacak gibi görünüyor
- Açıklama takvimine göre
2026-03-04tarihinde X-Stat push option enjeksiyon zafiyeti bulundu; aynı günGHES 3.19.1üzerinde RCE doğrulandı ve GitHub'a bildirildi; GitHub.com düzeltmesi de aynı gün devreye alındı 2026-03-10tarihinde CVE-2026-3854 veCVSS 8.7atandı, GHES yaması yayımlandı2026-04-28tarihinde kamuya açıklandı
Henüz yorum yok.