Platformda bat ve cmd komut dosyalarını çalıştıran uygulamalar Windows Standart işlem başlatma fonksiyonlarını kullanan uygulamalar, başlatma sırasında özel karakterler düzgün bir şekilde kaçırılmadan argümanlar geçirilirse özel kod yürütülmesine olanak tanıyan bir güvenlik açığına karşı savunmasızdır. BatBadBut kod adlı bu güvenlik açığı, Rust, PHP, Node.js, Python, Ruby, Go, Erlang ve Haskell gibi dillerdeki standart kütüphaneleri kullanan uygulamaları etkiler.
Bu sorun, Rust'taki Command::arg ve Command::args gibi, argümanları komut yorumlayıcısı tarafından işlenmeden doğrudan bir işleme iletmek üzere tasarlanmış kütüphane fonksiyonlarını etkilediği için bir güvenlik açığı olarak işaretlenmiştir. Bunun anlamı, uygulama geliştiricisinin argümanları doğrulamaya gerek duymayabileceği, çünkü argümanların doğrudan başlatılan işleme iletildiğidir. Unix sistemlerinde ise argümanlar, bir dizide tek tek işleme iletilir. Windows CreateProcess API'sini kullanırken, argümanlar tek bir dize olarak biçimlendirilir ve bu dizenin ayrıştırılması başlatılan sürecin sorumluluğundadır.
Platformda bat ve cmd komut dosyaları çalıştırılırken Windows CreateProcess() fonksiyonu, uygulama bunu belirtmese bile, örtük olarak cmd.exe yürütülebilir dosyasını çağırır. cmd.exe, kendi argümanlarını, çalıştırılan betiği ve o betiğin argümanlarını ayırmak için kendi karmaşık argüman bölme mantığını içerir. Platformda argüman ikamesine karşı koruma sağlamak için, Windows Programlama dillerinin standart kütüphaneleri ayrı kaçış işleyicileri kullanır; ancak çift tırnak işaretlerini manipüle ederek bunların atlatılabileceği ortaya çıkmıştır.
Örneğin, kullanıcı tarafından sağlanan verilere dayalı bir argümanla './test.bat' betiğini çağıran bir programda, bir saldırgan '»&calc.exe' değerini geçirebilir ve bu değer, betik çalıştırıldığında 'C:\' dizesine genişletilir.Windows`\System32\cmd.exe /c .\test.bat ""&calc.exe"'` komutu calc.exe işlemini başlatacaktır. Bu yöntem, uzantısı belirtilmeden "test" adlı bir yürütülebilir dosya başlatıldığında ve PATH ortam değişkeninde belirtilen dizinlerden birinde "test.bat" adlı bir dosya bulunduğunda, örtülü komut dosyası başlatmalarında da çalışır.
Rust standart kitaplığı için artık bir düzeltme yayımlandı (CVE-2024-24576) ve Rust 1.77.2 güncellemesine dahil edildi. Node.js ve PHP'ye yönelik güvenlik açığını ortadan kaldıracak güncellemeler hazırlanma aşamasındadır (8.2.18 ve 8.3.5 etiketleri zaten ayarlanmıştır ancak sürümler henüz açıklanmamıştır). Python, Ruby, Go, Erlang ve Haskell projeleri şu ana kadar kendilerini, özel karakterlerin uygun şekilde kaçmaması durumunda bir güvenlik açığının ortaya çıkışına ilişkin bir uyarıyı belgelere dahil etmekle sınırladı.
Rust 1.77.2'de standart kitaplığa, çalışan betiğin argümanında güvenli bir şekilde kaçılması garanti edilemeyen özel karakterler varsa hata döndüren ek bir kontrol eklendi. Kaçış mantığını bağımsız olarak uygulayan geliştiriciler için, kitaplık çağrıları tarafında kaçışı tamamen devre dışı bırakan CommandExt::raw_arg yöntemi sağlanır.
Koruma eklemeyi engelleyen şey, kabuk "%PATH%" gibi değişkenleri işleyip genişlettiği için çift tırnaktan kaçmanın yeterli olmamasıdır. Örneğin, "%CMDCMDLINE%" ortam değişkeni '"&calc.exe' yerine '%CMDCMDLINE:~-1%&calc.exe' belirtilerek değiştirilerek tırnak işareti değiştirilebilir.
Kaynak: opennet.ru
