- 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ı
1 yorum
Hacker News görüşleri
Dahili kimlik doğrulama hizmeti tarafından ayarlanan kritik güvenlik başlıklarına,
son kullanıcının
git push -oile verdiği rastgele bir dizgeyi de sokmuşlarSonradan konuşmak kolay ama bu yine de fazla absürt
Yapay zeka destekli tersine mühendislik yaklaşımı, mevcut LLM ajanlarının güçlü yanlarını iyi gösteriyor
Kodla yoğun biçimde eğitilmiş modeller, karmaşık sistemlerin içini anlama hızını inanılmaz artırabiliyor
Güvenlik araştırması genelde 1) karmaşık iç işleyişi çözmek ve 2) bunun içinde zafiyet bulmak işlerinin üst üste gelmesinden oluşuyor,
ama bazen gerçek iç mekanizma bir kez ortaya çıkınca zafiyetin kendisi şaşırtıcı derecede kolay görünebiliyor
CVE-2026-3854 için durum, içi bilseniz bile hemen apaçık görülen bir tür değildi,
ama daha geleneksel ya da erişimi kolay bir saldırı yüzeyinde olsaydı bu komut enjeksiyonu çok daha çabuk bulunurdu diye düşünüyorum
Ama son zamanlarda bu akış biraz bozulmuş gibi, ya da C++ sözdiziminin karmaşıklığından doğan geliştirici/vendor lock-in'i korumak isteyen taraflar yüzünden bilerek engelleniyormuş hissi veriyor
Sanki Wiz'de çalışan biri varmış gibi sonuçlar epey iyi görünüyor
Ürün de aşırı büyüme ve özellik şişmesine rağmen hâlâ oldukça iyi ayakta kalıyor,
güvenlik ekibi de gerçekten sık sık ilginç şeyler buluyor
osv-scannervetrivyçalıştıran özel bir pipeline kullanıyoruzama CLI ile DC sorgulayıp kimlik bilgisi sıfırlamak gibi biraz şüpheli işlerde sessiz kalınca insanın hevesi kaçıyor
babeld, push isteğini iletirken dahili isteğin X-Stat başlığına push option'larını koyuyor,ve bu değer kullanıcının
git push -oile verdiği rastgele bir dizgeAma noktalı virgülleri sanitize etmeden değeri olduğu gibi kopyalayınca,
;X-Stat alan ayırıcı olduğu için asıl alandan çıkıp saldırganın yeni alanlar oluşturmasına izin veriyorGerçekten yapılabilecek en basit hatalardan birini olduğu gibi yapmışlar; meyve o kadar alçakta değil de sanki toprağa gömülü gibi
Bu, daha istismar edilmeden yakalanmış bir zafiyetken
BREAKING, unauthorized access, millions of repositories gibi ifadelerle gereksiz korku büyütmeye gerek var mı emin değilim
https://x.com/wiz_io/status/2049153209982140718
GitHub, devlet destekli bir saldırgana değil de Wiz'in fuzzing'ine denk geldiği için şanslı sayılır
GHES instance'larının %88'inin, 7 hafta önce çıkan kritik güvenlik yamasını hâlâ uygulamamış olması epey ciddi görünüyor
https://docs.github.com/en/enterprise-server@3.19/admin/release-notes#3.19.3
Sadece bir patch-level sürümü uygulamak için bile saatlerce kesinti gerekiyor,
desteklenen bir HA yükseltme yöntemi de yok; bu yüzden düzenli müşteriler bile en güncel sürümü yakından takip etmekte zorlanıyor
Şikâyet edince herkese GitHub Enterprise Cloud'a geçmeleri söyleniyor,
ama bugünlerde bunu ne kadar kişinin gönül rahatlığıyla seçeceği de tartışılır
Yine de GHES'in bir artısı var: github.com'un günlük kesintilerinde durmuyor
ve muhtemelen operasyonel etkisi düşük bir tarih seçip yükseltme yapmak istiyorlar
Ama public bir instance ise hemen güncellenmeli
Haberdeki bilgiler ve herkese açık GitHub Enterprise kaynaklarıyla bile yeniden üretim yöntemi çıkarmak zor görünmüyor
ya da plana sadık kalıp bir şey olmamasını umabilirsiniz; çoğu zaman ikincisi seçiliyor
on-prem bir ürünün yılda bir kez güncellenmesi bile garip karşılanmaz
Verisi büyük enterprise yazılımlarda ufak bir şey yüzünden kurulumun bozulması ve operasyon ekibinin rollback yapması çok yaygındı
Eski SharePoint yükseltmeleri resmen zar atmak gibiydi
Bu olay da Wiz için büyük bir başarı,
ve yapay zeka araçlarının RE ile ihlal yollarını bulmayı ne kadar hızlandırdığını gösteren bir dönüm noktası gibi hissettiriyor
Sonuçta güvenliğin security through obscurity'ye dayanmaması gerektiğine dair bir veri noktası daha eklenmiş oluyor
Herkes GitHub'a alternatif bulalım diyor ama o zaman ne kullanacağımız sorusu kalıyor
GitHub ölçeğinde bir yerde bile artık RCE çıkıyorsa, diğer seçeneklerin daha iyi olduğunu rahatça söylemek zor
https://news.ycombinator.com/item?id=46961345
https://news.ycombinator.com/item?id=47712656
GitHub'ı yalnızca ücretsiz CI kullandığınız sürece mirror olarak değerlendirmek
Secret'ları da ayrı bir secret-hosting sağlayıcısına bırakabilirsiniz
Forgejo'nun bu kadar hızlı tepki verip GitHub'ın bu kadar yavaşlamış olması hâlâ bana tuhaf geliyor
İç projeleri private bir Forgejo instance'ında tutuyoruz, açık projeleri ise GitHub'a koyup Forgejo'ya mirror'luyoruz
Forgejo'nun pratikte tek binary olması ve yapılandırmasının kolaylığı beni şaşırttı,
ayrıca tüm dahili servisleri Forgejo'ya bakacak şekilde kurduğumuz için GitHub'dan ayrılmamız gerekirse sürtünme az olur
Hepsi bir arada Docker imajı ve birkaç GitLab runner, küçük ve orta ölçekli ekipler için yeterli
Gerçekten gerekmiyorsa işi Kubernetes sürümüne kadar karmaşıklaştırmaya gerek yok
Kaynak koddan yapay zekanın zafiyet bulması zaten etkileyiciydi,
bunu binary yürütülebilir dosyalarda da yapabilmesi gerçekten şaşırtıcı
Bunun hem iyi hem kötü yönde çok büyük bir potansiyeli var
Ve bir kez daha, veriyi komut gibi ele almamak gerektiği dersi ortaya çıkıyor
Tüm kullanıcı girdileri sanitize edilmeli
Bu yüzden source-to-source ya da text-to-source işlerinde güçlü olması zaten tanıdık bir hikâyeydi,
asm sürümlerini anlamaya da uygun çıkması tamamen şok edici sayılmayabilir
Yine de hâlâ etkileyici
Bunun gerçekten istismar edilip edilmediğini belirlemek mümkün olur mu diye merak ediyorum
HTTP/git protocol log'larından istismar olup olmadığını bir ölçüde anlamak mümkün olabilir,
ama gerçekte neye erişildiği ve bunu kimin yaptığına dair kayıt kalmamış olması da muhtemel
Çünkü exploit git sunucusunda bağımsız çalıştırılabildiyse, tanımı gereği loglamadan kaçabilmiş olabilir