Blog

Versiyon Kontrol Sistemleri: Git Path Traversal Zafiyeti

CVE-2023-23946: Kök Neden Analizi, İstismar Mekanizmaları ve Ekosistem Etkileri

Özet
Versiyon Kontrol Sistemleri (VCS), modern yazılım geliştirme yaşam döngüsünün temel taşlarıdır. Ancak, kaynak kodu ve hassas yapılandırma verilerini yönetmeleri, onları kritik güvenlik risklerine açık hale getirir. Bu makale, dağıtık VCS lideri Git’in git apply komutunda tespit edilen CVE-2023-23946 kodlu path traversal zafiyetini derinlemesine analiz etmektedir. Zafiyetin kök nedenini, sembolik bağlantı (symlink) işleme mantığındaki bir kusura dayandırarak inceliyor, pratik istismar senaryolarını ve yamalanmış davranışları ele alıyoruz. Ayrıca, bu tür bir zafiyetin CI/CD ardışık düzenleri üzerindeki potansiyel etkilerini ve diğer VCS’lerle (SVN, Mercurial) karşılaştırmalı bir güvenlik değerlendirmesini sunuyoruz. Analizimiz, VCS güvenliğinin yazılım tedarik zinciri güvenliği için önemini vurgulamakta ve geliştiriciler ile güvenlik profesyonelleri için dersler çıkarmaktadır.

1. Giriş: VCS Güvenliğinin Kritik Doğası

Yazılım geliştirme ekosisteminde Versiyon Kontrol Sistemleri (VCS), kod tabanındaki değişikliklerin izlenmesi, yönetilmesi ve ekipler arası işbirliğinin sağlanması açısından vazgeçilmez araçlardır. Git, Mercurial gibi dağıtık (DVCS) veya Subversion (SVN) gibi merkezi sistemler, projelerin entelektüel sermayesini barındırır. Bu nedenle, bu sistemlerdeki herhangi bir güvenlik zafiyeti, yetkisiz kod enjeksiyonu, hassas bilgi ifşası, hizmet kesintisi veya projenin bütünlüğünün bozulması gibi yıkıcı sonuçlara yol açabilir. Geçmişte, VCS implementasyonlarında çeşitli zafiyet sınıfları gözlemlenmiştir; bunlar arasında kimlik doğrulama bypass’ları, komut enjeksiyonları ve özellikle dosya sistemi manipülasyonuna olanak tanıyan path traversal (dizin geçişi) zafiyetleri bulunmaktadır.

Path traversal zafiyetleri, bir uygulamanın kontrollü çalışma dizini dışındaki dosya ve dizinlere erişmesine izin veren kritik güvenlik açıklarıdır. Tipik olarak, ../ gibi göreceli yol belirteçlerinin veya sembolik bağlantıların (symlinks) yetersiz doğrulanması veya işlenmesi sonucu ortaya çıkarlar. Bu durum, saldırganların sistem düzeyinde hassas dosyaları okumasına (örneğin, yapılandırma dosyaları, özel anahtarlar) veya üzerine yazmasına (örneğin, kabuk başlangıç betikleri, yetkilendirme dosyaları) olanak tanıyabilir. “Zip Slip” olarak bilinen yaygın zafiyet, arşiv dosyalarının açılması sırasında path traversal’ın nasıl istismar edilebileceğine dair klasik bir örnektir. Benzer şekilde, VCS’lerin yama (patch) uygulama, klonlama veya birleştirme gibi dosya sistemi operasyonları da bu tür saldırılara karşı hassas olabilir.

Bu makale, Git özelinde yakın zamanda kamuoyuna açıklanan CVE-2023-23946 path traversal zafiyetini, bir siber güvenlik araştırmacısı ve tersine mühendislik perspektifiyle ele almaktadır. Zafiyetin teknik kökenlerini, Git’in iç mekanizmalarını, istismar vektörünü, düzeltme stratejisini ve daha geniş ekosistem (özellikle CI/CD) üzerindeki potansiyel etkilerini inceleyeceğiz.

2. Git Mimarisi ve CVE-2023-23946’nın Kök Neden Analizi

Git’in temel mimarisi üç ana alana dayanır: Çalışma Dizini (Working Tree), İndeks (Staging Area) ve Nesne Deposu (.git dizini). Normal operasyonlarda Git komutları, kullanıcı tarafından görülebilen Çalışma Dizini’ndeki dosyaları manipüle eder. .git dizini ise Git’in kendi veritabanını içerir ve doğrudan kullanıcı müdahalesine kapalı olması beklenir. Git, güvenlik amacıyla, komutların (örneğin git checkout, git apply) Çalışma Dizini sınırları dışına taşmasını engellemek için çeşitli kontroller uygular. Sembolik bağlantılar (symlinks) bu noktada özel bir risk teşkil eder, zira Çalışma Dizini içindeki bir yolun, dosya sisteminde tamamen farklı bir konuma işaret etmesini sağlayabilirler. Git, bu riski azaltmak için symlink’leri takip ederek dosya yazılmasını engelleyen mekanizmalara sahiptir. CVE-2023-23946, tam da bu koruma mekanizmasındaki bir mantık hatasından kaynaklanmaktadır.

git apply komutu, git diff tarafından üretilen bir patch dosyasını mevcut Çalışma Dizini’ne uygulamak için kullanılır. Komut, güvenlik önlemi olarak, yamanın hedeflediği bir dosya yolunun mevcut bir symlink üzerinden geçip geçmediğini kontrol eder. Eğer yama, mevcut_symlink/yeni_dosya.txt gibi bir yola yazmaya çalışırsa ve mevcut_symlink gerçekten bir symlink ise, Git bu işlemi tehlikeli kabul ederek reddeder.

CVE-2023-23946’nın Kök Nedeni: Zafiyet, git apply komutunun yama uygulama sürecindeki durumsal farkındalık eksikliğinden kaynaklanır. Güvenlik kontrolü, yama uygulanmaya başlamadan önceki dosya sistemi durumuna göre yapılır. Ancak, yamanın kendisi, uygulama sırasında yeni bir symlink oluşturabilir. Eğer yama önce yeni_symlink -> /hedef/dizin şeklinde bir symlink oluşturur ve aynı yama içinde daha sonraki bir adımda yeni_symlink/zararli_dosya.txt yoluna bir dosya eklemeye çalışırsa, Git’in ilk kontrolü bu senaryoyu öngöremez. Yama uygulanırken yeni_symlink henüz mevcut olmadığından, ilk kontrol başarılı olur. Ancak yama işlenirken yeni_symlink oluşturulduktan sonra, sonraki dosya yazma işlemi, Git tarafından (yanlışlıkla) meşru bir alt dizine yazma olarak algılanır. Gerçekte ise işlem, yeni oluşturulan symlink üzerinden Çalışma Dizini dışındaki /hedef/dizin altına yapılır.

Bu durum, yama içindeki işlemlerin atomik veya izole bir şekilde değerlendirilmemesinden kaynaklanan bir “Time-of-check to time-of-use” (TOCTOU) benzeri bir zafiyet örüntüsüdür. Git, yamanın adımlarını ardışık olarak işlerken, bir adımın yarattığı yeni durumun (symlink oluşumu) sonraki adımların güvenlik bağlamını nasıl değiştirdiğini yeterince hesaba katmamıştır. Sonuç olarak, yamayı uygulayan kullanıcının yetkileri dahilinde, Çalışma Dizini dışındaki herhangi bir konuma rastgele dosya yazma (arbitrary file write) kabiliyeti elde edilir. Bu, yetki yükseltmeden (privilege escalation) hassas verilerin üzerine yazmaya kadar birçok kötü niyetli senaryoya kapı aralar.

3. Zafiyetin Keşfi, İstismar Vektörleri ve Kanıt (PoC)

CVE-2023-23946, GitLab güvenlik ekibinden Joern Schneeweisz tarafından Ocak 2023’te keşfedilmiş ve sorumlu ifşa (responsible disclosure) süreciyle Git güvenlik ekibine bildirilmiştir. Zafiyetin detayları ve yamaları 14 Şubat 2023’te kamuoyu ile paylaşılmıştır. Zafiyetin Git 2.39.1 ve öncesindeki birçok sürümü, hatta 2.9.0 (2016) gibi eski versiyonları dahi etkilediği belirlenmiştir. Bu durum, zafiyetin uzun süre fark edilmeden kaldığını ve ancak dikkatli kod analizi ve güvenlik odaklı testlerle ortaya çıkarılabildiğini göstermektedir.

İstismar Senaryosu:
Bir saldırganın bu zafiyeti istismar etmesi için aşağıdaki adımları izlemesi gerekir:

  1. Zararlı Yama Oluşturma: Saldırgan, iki temel adımdan oluşan özel bir patch dosyası hazırlar:
    • Adım 1: Çalışma Dizini içinde, saldırganın hedeflediği sistem dizinine (örneğin, /tmp/pwned veya kurbanın ~/.ssh/) işaret eden bir symlink oluşturulur.
    • Adım 2: Aynı yama içinde, bu yeni oluşturulan symlink üzerinden bir dosya (örneğin, symlink_adi/authorized_keys veya symlink_adi/backdoor.sh) oluşturulur veya üzerine yazılır.
  1. Teslimat: Saldırgan, bu zararlı yamayı kurbana ulaştırır. Bu, bir açık kaynak projeye katkı (pull request/patch e-postası), sosyal mühendislik veya manipüle edilmiş bir depo aracılığıyla olabilir.
  2. Tetikleme: Kurban, güvendiği veya test etmek istediği bu yamayı, etkilenen bir Git sürümü kullanarak git apply zararli.patch komutuyla uygular.

Örnek İstismar Yaması (PoC):
Aşağıdaki patch dosyası, zafiyeti göstermek için kullanılabilir:

Bu yama uygulandığında:

  1. Önce pwn_link adında bir symlink oluşturulur ve /tmp/target_directory yoluna işaret eder.
  2. Ardından, yamanın ikinci kısmı pwn_link/malicious_file.txt dosyasını oluşturmaya çalışır. Zafiyetli Git, pwn_link’in yeni oluşturulan bir symlink olduğunu fark etmez ve işlemi onaylar.
  3. Sonuç olarak, malicious_file.txt dosyası, Çalışma Dizini içinde değil, /tmp/target_directory dizini altında oluşturulur. Eğer /tmp/target_directory mevcut değilse, genellikle hata alınır; ancak saldırgan, kurbanın sisteminde var olan veya yazma izni olan bir dizini (örneğin, ~/.config/, ~/.local/share/) hedefleyebilir.

Remediation (Düzeltme):
Git 2.39.2 ve sonraki yamalı sürümlerde, git apply komutunun mantığı değiştirildi. Artık, yama içindeki her bir dosya oluşturma/değiştirme adımından hemen önce, hedeflenen yolun o anki durumu (bir symlink içerip içermediği ve bu symlink’in ötesine geçip geçmediği) tekrar kontrol edilir. Yukarıdaki PoC yaması yamalı bir Git sürümünde denendiğinde, aşağıdaki gibi bir hata mesajıyla işlem reddedilir:

$ git apply exploit.patch
error: affected file 'pwn_link/malicious_file.txt' is beyond a symbolic link
error: patch failed to apply

Bu düzeltme, yama uygulama sürecindeki dinamik durum değişikliklerini hesaba katarak zafiyeti etkin bir şekilde kapatmıştır. Zafiyetin CVSS v3.1 skoru 7.5 (Yüksek) olarak derecelendirilmiş olup, özellikle Bütünlük (Integrity) üzerindeki etkisi Yüksek (High) olarak belirlenmiştir, bu da başarılı bir istismarın hedef sistemdeki dosyaları keyfi olarak değiştirebileceğini teyit eder.

4. CI/CD Ardışık Düzenleri Üzerindeki Potansiyel Etkiler

Sürekli Entegrasyon ve Sürekli Dağıtım (CI/CD) ardışık düzenleri, otomasyonun temelini oluşturur ve sıklıkla Git komutlarını (klonlama, birleştirme, yama uygulama) otomatik olarak çalıştırır. CVE-2023-23946 gibi bir zafiyet, bu otomatikleştirilmiş ortamlarda ciddi riskler doğurur:

  • Otomatik Yama Uygulama Senaryoları: Bazı CI/CD iş akışları, dış kaynaklardan (örneğin, topluluk katkıları, bağımlılık güncellemeleri) gelen yamaları otomatik olarak test amacıyla uygulayabilir. Eğer CI/CD aracısı (agent/runner) yamalanmamış bir Git sürümü kullanıyorsa, zararlı bir yama CI/CD sunucusunun dosya sistemine sızabilir. Bu, CI/CD altyapısının ele geçirilmesine, hassas kimlik bilgilerinin (secrets) çalınmasına veya sonraki derleme/dağıtım süreçlerine kötü amaçlı kod enjekte edilmesine yol açabilir.
  • Genişletilmiş Saldırı Yüzeyi: CI/CD ortamları genellikle paylaşılan kaynaklar üzerinde veya belirli yetkilerle çalışır. Başarılı bir path traversal saldırısı, sadece mevcut derleme işini değil, aynı zamanda CI/CD aracısının çalıştığı ana makineyi veya diğer projelerin ortamlarını da tehlikeye atabilir (eğer izolasyon yetersizse). Saldırgan, örneğin CI aracısının SSH anahtarlarını veya bulut sağlayıcı kimlik bilgilerini hedefleyebilir.
  • Bulut Tabanlı Geliştirme Ortamları: GitHub Codespaces, Gitpod gibi hizmetler, arka planda Git operasyonları yürüten bulut tabanlı IDE’ler sunar. Bu platformlar da potansiyel olarak etkilenebilirdi. Nitekim, GitHub gibi büyük sağlayıcılar, zafiyetin duyurulmasının hemen ardından kendi altyapılarındaki Git sürümlerini güncelleyerek proaktif önlem almışlardır.

CI/CD için Önlemler: CI/CD ortamlarının güvenliğini sağlamak için şu adımlar kritiktir:
* CI/CD araçlarında kullanılan Git istemcilerini düzenli olarak güncellemek.
* CI/CD işlerini mümkün olan en düşük ayrıcalık prensibiyle (principle of least privilege) çalıştırmak.
* İşleri konteynerler veya sanal makineler gibi güçlü izolasyon mekanizmaları içinde yürütmek.
* Dışarıdan gelen yamaları veya kodları işlemeden önce güvenlik taramaları (statik analiz, bilinen zafiyet kontrolü) yapmak.
* Güvenilmeyen kaynaklardan gelen yamaların otomatik uygulanmasından kaçınmak veya ek onay mekanizmaları eklemek.

5. Diğer VCS’lerle Karşılaştırmalı Güvenlik Analizi (SVN, Mercurial)

Path traversal ve symlink ile ilgili güvenlik sorunları sadece Git’e özgü değildir. Diğer popüler VCS’ler de geçmişte benzer zafiyetlerle karşılaşmıştır:

  • Mercurial (hg): Git gibi dağıtık bir yapıya sahip olan Mercurial’da hg import komutu yama uygulamak için kullanılır. Geçmişte Mercurial da path traversal zafiyetleri yaşamıştır:
    • CVE-2008-2942: Mercurial 1.0.1’de, yama dosyalarındaki ../ dizin belirteçlerinin yetersiz filtrelenmesi sonucu path traversal’a izin veren bir açık bulunmuştur.
    • CVE-2019-3902: Mercurial 4.9 öncesi sürümlerde, symlink ve alt depo (subrepository) kombinasyonları kullanılarak depo dışına yazma korumaları atlatılabiliyordu. Bu, CVE-2023-23946’ya benzer şekilde symlink işleme mantığındaki bir zayıflıktan kaynaklanıyordu.
      Mercurial geliştiricileri, bu tür olayların ardından yol normalleştirme ve symlink takip kontrollerini sıkılaştırmıştır.
  • Subversion (SVN): Merkezi bir VCS olan SVN’de istemci tarafında yama uygulama (svn patch) daha az yaygındır, ancak imkansız değildir. SVN ekosisteminde de path traversal görülmüştür:
    • CVE-2007-3846 (TortoiseSVN): Popüler Windows istemcisi TortoiseSVN’de, yama işlenirken ..\ karakterlerinin filtrelenmemesi, Windows sistemlerinde keyfi dosya yazımına olanak tanıyordu.
    • Sunucu Taraflı Zafiyetler: SVN sunucusunun kendisinde de (örneğin, WebDAV modülünde) farklı path traversal açıkları raporlanmıştır (örn. CVE-2013-4131). Ancak SVN’nin merkezi doğası, istemci tarafı istismar senaryolarını Git/Mercurial’a göre sınırlar.

Hem dağıtık (Git, Mercurial) hem de merkezi (SVN) VCS’ler, dosya sistemi ile etkileşimlerinde path traversal riskleri taşır. Dağıtık sistemlerde, deponun tam kopyasının istemcide bulunması ve clone, apply, checkout gibi komutların yerel dosya sistemini doğrudan manipüle etmesi nedeniyle istemci tarafı saldırı yüzeyi daha geniştir. Nitekim, CVE-2023-23946 ile aynı dönemde duyurulan CVE-2023-22490, git clone sırasında özel hazırlanmış bir depo aracılığıyla symlink kullanarak kurbanın sisteminden dosya sızdırmaya (okuma) yönelik başka bir Git path traversal zafiyetidir. Bu, path traversal’ın hem yazma (integrity) hem de okuma (confidentiality) amaçlı istismar edilebileceğini gösterir.

VCS geliştiricileri, geçmişteki olaylardan ders çıkararak güvenlik kontrollerini sürekli iyileştirmektedir (URL doğrulaması, symlink kontrolleri, .git/.hg dizini temizliği vb.). Ancak CVE-2023-23946 vakası, karmaşık etkileşimlerin (yama + symlink oluşturma) hala gözden kaçabilen kenar durumları (edge cases) yaratabileceğini göstermiştir. Bu nedenle, farklı VCS projelerinin birbirlerinin güvenlik bulgularını takip etmesi ve benzer desenleri kendi kod tabanlarında proaktif olarak araması önemlidir.

6. Sonuç ve Çıkarımlar

CVE-2023-23946 zafiyeti, en yaygın kullanılan versiyon kontrol sistemlerinden biri olan Git’in bile, temel dosya sistemi operasyonlarındaki ince mantık hataları nedeniyle ciddi güvenlik riskleri barındırabileceğini göstermiştir. Sembolik bağlantıların dinamik olarak oluşturulduğu bir yama senaryosunda, mevcut güvenlik kontrollerinin yetersiz kalması, path traversal yoluyla çalışma dizini sınırlarının aşılmasına ve keyfi dosya yazımına olanak tanımıştır.

Bu vaka, aşağıdaki önemli dersleri sunmaktadır:

  1. VCS Güvenliği Tedarik Zinciri Güvenliğidir: VCS’ler, yazılım geliştirme sürecinin merkezindedir. Bu sistemlerdeki bir zafiyet, tüm yazılım tedarik zincirini tehlikeye atabilir.
  2. Symlink İşleme Riskleri: Sembolik bağlantılar, dosya sistemi operasyonlarında güçlü bir özellik olsa da, güvenlik açısından dikkatli ele alınması gereken karmaşık bir unsurdur. Kontroller, sadece mevcut duruma değil, işlem sırasındaki potansiyel değişikliklere karşı da dayanıklı olmalıdır.
  3. CI/CD Ortamlarının Önemi: Otomatikleştirilmiş sistemler, bu tür zafiyetler için cazip hedeflerdir. CI/CD güvenliği, sadece yapılandırma değil, kullanılan araçların (Git dahil) güncelliğini ve güvenliğini de kapsamalıdır.
  4. Sürekli Tetikte Olma Gerekliliği: En olgun ve yaygın kullanılan yazılımlar bile yeni veya gözden kaçmış zafiyetler içerebilir. Güvenlik araştırmaları, kod denetimleri ve sorumlu ifşa süreçleri ekosistemin sağlığı için hayati öneme sahiptir.

Son kullanıcılar ve geliştiriciler için temel çıkarım, kullanılan Git istemcisini ve CI/CD ortamlarındaki Git sürümlerini ivedilikle güncel tutmaktır. Ayrıca, güvenilmeyen kaynaklardan gelen yamaları uygularken dikkatli olmak ve mümkünse –stat gibi komutlarla yamanın içeriğini önceden incelemek faydalıdır. Geliştirici toplulukları ve kuruluşlar için ise, güvenlik odaklı kodlama pratiklerini benimsemek, kapsamlı test senaryoları (özellikle kenar durumları ve güvenlik kontrolleri için) oluşturmak ve güvenlik açıklarına karşı hızlı ve şeffaf bir yanıt mekanizması işletmek esastır.

CVE-2023-23946, versiyon kontrol sistemlerinin sadece kod depolama araçları olmadığını, aynı zamanda işletim sisteminin dosya sistemiyle doğrudan etkileşen güçlü uygulamalar olduğunu hatırlatan önemli bir vakadır. Bu etkileşimin güvenliğini sağlamak, tüm paydaşların ortak sorumluluğudur.

Kaynak
CVE-2023-23946 DetailCVE-2023-23946Git security vulnerabilities announcedmirror of https://git.kernel.org/pub/scm/git/git.git"git apply" overwriting paths outside the working treeDirectory TraversalCVE-2023-22490, CVE-2023-23946What is a symbolic link (symlink)?Zip Slip - snyk

İlgili Makaleler

Bir yanıt yazın

Başa dön tuşu