1 puan yazan GN⁺ 2025-07-09 | Henüz yorum yok. | WhatsApp'ta paylaş
  • Unix türevi sistemlerde güvenilmeyen bir depoyu git clone --recursive ile klonlamak, CVE-2025-48384 nedeniyle uzaktan kod çalıştırmaya yol açabilir; bu yüzden Git'in ve Git'i yerleşik olarak kullanan yazılımların güncellenmesi gerekir
  • Neden, Git yapılandırmasını okuma ve yeniden yazma sürecinde carriage return (\r) işleme biçimlerinin farklılaşması ve doğrulanan değer ile fiilen kullanılan değerin uyuşmamasıdır
  • .gitmodules içindeki alt modül path değerinin sonuna \r eklenirse checkout yolu doğrulamadan sonra farklı bir yola dönüşebilir
  • Windows dosya adlarında kontrol karakterlerine izin vermediği için doğrudan savunmasız değildir; ancak macOS hem CVE-2024-32002'ye hem de CVE-2025-48384'e karşı savunmasızdır
  • Yama, \r içeren yapılandırma değerlerini tırnak içine alacak şekilde değiştirerek .git içinde dosya yazma ve Git hook oluşturma gibi saldırı yollarını engeller

Güvenlik açığına genel bakış ve acil önlemler

  • CVE-2025-48384, Unix türevi platformlarda güvenilmeyen bir depoyu git clone --recursive ile klonlarken uzaktan kod çalıştırmaya yol açabilecek bir Git güvenlik açığıdır
  • Düzeltilmiş Git sürümüne güncelleyin; GitHub Desktop dahil Git'i yerleşik olarak kullanan yazılımları da birlikte güncellemek gerekir
  • Komut satırında yalnızca git clone çalıştırılırsa alt modüller otomatik olarak klonlanmaz
    • Hafifletme için önce git clone komutunu --recursive olmadan çalıştırıp, .gitmodules dosyasının güvenli olduğunu doğruladıktan sonra alt modülleri başlatmak mümkündür
  • GitHub Desktop varsayılan olarak recursive seçeneğiyle klonladığından bu davranışta etkilenebilir

Carriage return ve Git yapılandırma dosyaları

  • Carriage return, ASCII karakter numarası 13 olan Carriage Return karakteridir ve C dizgilerinde \r olarak gösterilir
  • Unix satır ayırıcı olarak yalnızca LF, yani \n kullanmak istemiştir; ancak Windows ve birçok internet protokolü CR+LF, yani \r\n kullanır
  • Git'in .ini tarzı yapılandırma biçimi, kullanıcı yapılandırma dosyalarının yanı sıra depoya dahil edilen .gitmodules dosyasında da kullanılır
  • Git yapılandırma ayrıştırıcısı DOS satır sonlarını desteklemek için karakter okurken şöyle davranır
    • Geçerli karakter \r ise sonraki karakteri kontrol eder
    • Sonraki karakter \n ise \r karakterini atar ve bunu satır sonu olarak işler
    • Sonraki karakter \n değilse sonraki karakteri geri koyar ve \r karakterinin kendisini döndürür
  • Bu işlem satır bazında uygulandığından, bir satır CR ile bitiyorsa dosyanın genel biçiminden bağımsız olarak ilgili CR kaldırılabilir

Okuma ve yazma arasındaki uyumsuzluk

  • Git, yapılandırma dosyalarını okumakla kalmaz; git config gibi yapılandırma değerlerini yazarken de aynı biçimde key = value çiftleri kaydeder
  • Mevcut kod, yapılandırma değerini yeniden yazarken yalnızca aşağıdaki durumlarda değeri çift tırnak içine alıyordu
    • Değer boşlukla başlıyorsa
    • Değerin içinde ; veya # varsa
    • Değer boşlukla bitiyorsa
  • Buna karşılık yapılandırma okuma kodu çift tırnaklı dizgileri desteklediğinden, write_pair tarafından yazılan değer daha sonra yeniden okunduğunda sondaki \r düşebilir
  • Örneğin yapılandırma dosyasında key = "foo^M" varsa, yeniden yazıldıktan sonra key = foo^M biçimine gelebilir
    • Burada ^M literal CR karakteridir
  • Bu davranış güvenilmeyen .gitmodules değerleriyle birleştiğinde alt modül yolu işleme süreci kararsız hale gelir

Alt modül yolu karışıklığı ve etki alanı

  • Unix tabanlı sistemlerde dosya adlarına kontrol karakterleri konabildiğinden .gitmodules içindeki path değerine CR içeren bir değer koymak mümkündür
  • Örnek şu biçimdedir
[submodule "foo"]
  path = "foo^M"
  • Bu değer Git yapılandırma kodu tarafından .git/modules/foo/config dosyasına kaydedildiğinde şu biçime dönüşebilir
[core]
  workdir = ../../../foo^M
  • Doğrulama, .gitmodules içinden okunan güvenilmeyen yol için zaten tamamlanmış durumdadır
  • Daha sonra yapılandırma yeniden okunurken sondaki \r kaldırılırsa Git doğrulanan yoldan farklı bir yol kullanır
  • Sonuç olarak alt modül klonlama sırasında path = ... içinden okunan konum ile fiilen kaydedilip kullanılan konum farklılaşabilir
  • Bu prensip CVE-2024-32002'ye benzer
    • CVE-2024-32002, alt modülde büyük/küçük harf duyarlılığından yararlanarak Git'i yanıltır
    • CVE-2025-48384 ise dosya adlarında kontrol karakterlerine izin veren bir dosya sistemi gerektirir
  • Windows dosya adlarında kontrol karakterlerine izin vermediğinden bu belirli hataya doğrudan savunmasız değildir
  • macOS hem CVE-2024-32002'ye hem de CVE-2025-48384'e karşı savunmasızdır

Yama ve saldırı olasılığı

  • Yama, write_pair içinde değerde \r varsa dizgiyi tırnak içine alacak şekilde değiştirir
  • Değişiklik, yalnızca ; veya # kontrol eden koşula '\r' ekleyen basit bir biçimdedir
 	for (i = 0; value[i]; i++)
-		if (value[i] == ';' || value[i] == '#')
+		if (value[i] == ';' || value[i] == '#' || value[i] == '\r')
 			quote = "\"";
  • Yol karışıklığıyla alt modülün kötü amaçlı dosyaları dosya sisteminde neredeyse istenen herhangi bir konuma yerleştirilebilir; doğrulama atlatılmış durumda olduğu için depo dışındaki sembolik bağlantılar da izlenebilir
  • En doğrudan istismar yöntemi, .git dizini içine dosya yazıp bir Git hook script'i oluşturarak Git hook'u çalıştırdığında saldırganın kontrolündeki kodun çalışmasını sağlamaktır
  • Başka bir olasılık .git/config dosyasının üzerine yazılmasıdır
  • PoC henüz yayımlanmadı, ancak CVE-2024-32002 exploit'inin neredeyse önemsiz bir değişiklikle uyarlanabileceği belirtiliyor
  • Düzeltme commit'indeki test, saldırı yöntemi hakkında önemli ipuçları verebilir

Tekrarlayan CR sorunu ve çıkarılan dersler

  • Carriage return'ün Git'te sorun yarattığı ilk vaka bu değil
  • Ocak ayında RyotaK, carriage return ile kandırılabilen credential helper protokolü sorununu keşfetti
  • 2023'te André Baptista ve Vítor Pinho, yapılandırma ayrıştırmadaki mantık hatası olan CVE-2023-29007'yi keşfetti
  • Bu güvenlik açığı C dilinin kendisinden kaynaklanan bir sorun değil, neredeyse her dilde ortaya çıkabilecek bir mantık hatasına daha yakındır
  • Ortak nokta, Git iç bileşenleri arasında veya Git ile dış süreçler arasındaki süreçler arası iletişimde ortaya çıkmalarıdır
  • HTTP'deki CRLF injection, request smuggling ve SMTP smuggling ile de benzer bir yapı görülebilir
  • Geçmişte internet, Postel'in sağlamlık ilkesi olan “gönderirken muhafazakâr, alırken hoşgörülü ol” yaklaşımına dayanıyordu; ancak bugün bu en makul tavsiye olmayabilir
  • Bu konu RFC 9413 içinde daha ayrıntılı ele alınır

Teşekkürler ve ilgili düzeltmeler

Henüz yorum yok.

Henüz yorum yok.