Stored Log Forging Açıklığı (CWE-117)
Bu makalede Stored Log Forging (CWE-117), yani Depolu Log Taklit Etme açıklığı anlatılacaktır.

Açıklık Önem Derecesi:

Düşük

Açıklığın Etkisi:

Uygulama verisini modifiye etme, aktiviteleri gizleme, yetkisiz kod veya komutlar çalıştırma

Açıklığın Açıklaması:

Uygulamalar bir hata meydana geldiğinde hata ayıklama için veya saldırı meydana geldiğinde gereken aksiyonu belirlemek için log kaydı alma mekanizmalarını kullanırlar. İstemci girdilerinin log’lara yazdırıldığı uygulamalarda eğer girdiler “denetlenmeden” / “olduğu gibi” uygulama veya sistem log dosyalarına yazdırılmaktaysa kötü niyetli kullanıcılar Log Taklit Etme (diğer adıyla; Log Enjeksiyonu) saldırıları düzenleyebilirler. Diğer taraftan eğer saldırganlar farklı kanallar yoluyla uygulamaya veriler depolatıp bu depolu veriler üzerinden uygulamanın farklı bir konumunda log enjeksiyonu gerçekleştirirlerse buna da Depolu Log Taklit Etme saldırıları (Stored Log Forging) adı verilir.

Stored Log Forging açıklığını izah etmek adına java dilinde güvensiz ve güvenli kod blokları örneklerine yer verilmiştir:

Java - Güvensiz Kod Örneği:

// GÜVENSİZ ÖRNEK

private int readUserId(ResultSet rs) { 
    String dbValue = rs.getString("UserId");
    int userId = 0; 
    
    try {
        userId = Integer.parseInt(dbValue); 
    } catch (NumberFormatException nfe) { 
        log.error("User Id: " + dbValue + " raised an error: " + nfe.getMessage());
    }    
    return userId;
}

Java - Güvenli Kod Örneği:

// GÜVENLİ ÖRNEK

private int readUserId(ResultSet rs) { 
    String dbValue = rs.getString("UserId");
    int userId = 0; 
    
    try {
        userId = Integer.parseInt(dbValue); 
    } catch (NumberFormatException nfe) { 
        log.error("User Id: " + dbValue.replace('\r', '').replace('\n', '') + 
                  " raised an error: " + nfe.getMessage());
    }    
    return userId;
}

Güvensiz kod örneğinde veri tabanından çekilmiş girdi numara olduğu varsayılarak parseInt() ile ayrıştırma aşamasından geçiriliyor. Ayrıştırma sırasında girdi sayı olmadığında NumberFormatEsception istisnası fırlıyor ve catch’e düşülüyor. Catch’te ise veri tabanından çekilmiş girdinin orijinal hali log alma metodu ile log dosyasına doğrudan yazdırılıyor. Bu kullanım güvensizdir. Çünkü veritabanı girdisinin saldırganların müdahalesiyle oluştuğu veya saldırganların müdahalesiyle değiştiği varsayımından hareket edildiğinde log kaydını bu şekilde orijinal haliyle filtrelenmeden log dosyasına yazdırmak log enjeksiyonuna kapı aralayacaktır.

Güvenli kod örneğinde veri tabanından gelen girdi yine sayı mı safhasından parseInt() ile geçerken sayı olmadığında catch’teki log alma işlemi girdiyi filtreledikten sonra log dosyasına yazdırmaktadır. Bu sayede log enjeksiyonu ihtimali yok olmuş olacaktır.

Yine java dilinde, fakat bu sefer farklı bir senaryoda stored log forging açıklığını somutlaştırmak gerekirse;

Java - Güvensiz Kod Örneği:

// GÜVENSİZ ÖRNEK

private boolean userLogin() throws Exception {

    String userID = System.getenv("username");
    String pass = System.getenv("password");

    log.info("Uygulama hesap bilgileri -> kullanıcı adı: {}, parola: {}", userID, pass);

    String result = clientAuthenticate(username, password);

    return result;
}

Bu güvensiz örnekte sistemdeki komut satırında depolu ortam değişkenleri (environment variables) kaynak kodda çekiliyor ve log alma işlemine sokularak log dosyasına doğrudan yazdırılıyor. Herhangi bir filtreleme olmadığı için uygulamada çıkabilecek olası “Environment Variable Injection” zafiyetlerinde saldırganlar ortam değişkenlerini manipule edebilir ve log dosyasına manipule edilmiş veri yazdırarak log enjeksiyonu uygulayabilirler.

Stored Log Forging (Keyfi log ekleme / log enjekte etme) açıklığı ile kötü niyetli kullanıcılar;

  • Uygulama sunucusundaki log dosyalarına log girişlerini taklit edecek sahte / yeni log girişleri ekleyebilirler. Bu sayede;

    • Bozuk hale getirilmiş log dosyaları ile log istatistiklerini çarpıtarak kendisinin veya bir başka saldırganın izlerini kapatabilirler.

    • Girişleri taklit edilmiş log dosyaları ile ayrıca kötü bir eylemin sorumlusu olarak bir başka kişiyi gösterebilirler.

  • Uygulama sunucusundaki zararlı log event’lerinin geliştiricilerce web tarayıcıda görüntülendiği durum ele alındığında log dosyalarına xss payload’u girerek XSS saldırıları düzenleyebilirler.

  • Uygulama sunucusunda komut çalıştırabilen log parser’lar (örn; PHP log parser’lar) kullanıldığı durum ele alındığında komut enjeksiyonu saldırıları düzenleyebilirler.

Açıklığın Önlemi:

Tavsiyeler şu şekildedir:

  • Tüm girdiler kaynağına bakılmaksızın denetlenmelidir. Denetleme sadece belirtilen yapıya uygun verileri kabul edecek şekilde beyaz liste temelli olmalıdır. Belirtilen yapıların reddedildiği siyah liste temelli olmamalıdır.

  • Girdilerin denetlenmesi encode’lamanın yerine geçecek bir önlem değildir. Tüm girdiler ayrıca encode’lanmalıdır.

  • Güvenli log alma mekanizmaları kullanılmalıdır.

Çeşitli dillerde stored log forging açıklığını kapatmanın yolu şu şekilde örneklenebilir:

C# - Güvenli Log Alma Örneği:


Log.Write( logGirdisi.Replace(CRLF, @"\CRLF") );


Bu örnekte logGirdisi değişkenindeki değerde CR ve LF satır atlatma karakterleri varsa log’a yazdırılırken yazıyla \CRLF kelimesi olarak ekleniyor. Böylece log enjeksiyonu meydana gelip log dosyasında satır atlanması yerine satır atlatma kodu var bilgisi log dosyasına yazdırılarak gösterilmiş oluyor.

Java - Güvenli Log Alma Örneği:


Log.Write( logGirdisi.Replace(CRLF, @"\CRLF") ); 


Bu örnekte logGirdisi değişkenindeki değerde yine CR ve LF satır atlatma karakterleri log’a yazdırılırken yazıyla \CRLF kelimesi olarak ekleniyor. Böylece log enjeksiyonu meydana gelip log dosyasında satır atlanması yerine satır atlatma kodu var bilgisi log dosyasına yazdırılarak gösterilmiş oluyor.

Objective-C - Güvenli Log Alma Örneği:


NSLog(@"%@", [logGirdisi stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]);


Bu örnekte logGirdisi değişkenindeki değerde yer alabilecek “LF”, yani \n satır atlatma karakterleri yazıyla \\n karakterlerine dönüştürülüyor ve log dosyasına o şekilde ekleniyor.

Swift - Güvenli Log Alma Örneği:


print(logGirdisi.stringByReplacingOccurrencesOfString("\n", withString: "\\n"))


Bu örnekte de yine logGirdisi değişkenindeki değerde yer alabilecek “LF”, yani \n satır atlatma karakterleri yazıyla \\n karakterlerine dönüştürülüyor ve log dosyasına o şekilde ekleniyor.

Yararlanılan Kaynaklar:

  • https://knowledge-base.secureflag.com/vulnerabilities/inadequate_input_validation/log_injection_vulnerability.html
  • https://kelumkp.medium.com/what-is-log-forging-5cfdf045979a
  • https://cwe.mitre.org/data/definitions/117
  • https://owasp.org/www-community/attacks/Log_Injection
Bu yazı 26.10.2025 tarihinde, saat 23:51:25'de yazılmıştır.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 6
Yorumlar
Henüz yorum girilmemiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :