| 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;
Tavsiyeler şu şekildedir:
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:
|
|||||
Bu yazı 26.10.2025 tarihinde, saat 23:51:25'de yazılmıştır.
|
|||||
|
|||||
| Yorumlar |
|||||
| Henüz yorum girilmemiştir. | |||||
| Yorum Ekle | |||||
Bu yazı 26.10.2025 tarihinde, saat 23:51:25'de yazılmıştır.