Information Exposure Through An Error Message Açıklığı (CWE-209)
Bu makalede Information Exposure Through An Error Message (CWE-209), yani Hata Mesajı Yoluyla Bilgi İfşası açıklığı anlatılacaktır.

Açıklık Önem Derecesi:

Düşük

Açıklığın Etkisi:

Bilgi ifşası, Saldırı metotlarını belirlemede kolaylık sağlama

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

Uygulamalar bulundukları ortamlar hakkında, kullanıcıları hakkında veya uygulamanın ilişkili verileri hakkında hassas bilgiler içeren hata mesajları oluşturabilirler. Bu hassas bilgiler başka saldırılar yapmak için basamak olarak kullanılabilecek bilgiler olabilir veya daha ciddi değerli bilgiler olabilir (örn; parolalar gibi).

Saldırganlar daha odaklı saldırılar yapmak için hata mesajlarındaki içerikleri kullanabilirler. Örneğin hata mesajları path traversal (dizin gezinme) açıklığını sömürme teşebbüslerinde yüklü uygulamanın tam (full) dizin yolunu verebilir. Bundan hareketle bu bilgi hedeflenen dosyaya gitmek için uygun sayıda “..” üst dizin karakterinin seçilmesinde kullanılabilir. Örneğin hata mesajları SQL Enjeksiyonunun kullanıldığı bir saldırıda saldırı en başta başarılı olamasa da tüm bozuk çalışan sorguyu gözler önüne serebilir. Bundan hareketle sorgu mantığını, hatta sorguda kullanılan muhtemel parolaları ve diğer hassas verileri (örn; veritabanı field’larını (kolon adlarını)) ortaya çıkarabilir.

Uygulamalardaki istemci arayüzüne dönülen veya kontrol edilemez log sink’leri (log kaydedicileri) ile log dosyalarına basılan hata mesajları bilgi ifşası riski barındırır. Örneğin bu duruma örnek verilmiştir:

JAVA - Güvensiz Hal:

// Güvensiz Kod

// ENG: Handle Exception by Printing To Output
// TR : İstisnayı Çıktıya Basarak İdare Etme

private void wrapCallToDB_Unsafe(HttpServletRequest request) 
throws ServletException, IOException {
    
    String paramValue = request.getParameter("Param");

    try {
        callDbProc(paramValue); 
    } 
    catch (SQLException ex) {
        ex.printStackTrace();
    }
}

Bu örnekte try bloğundan fırlaması muhtemel bir hatanın catch ile yakalandığı ve catch bloğunda hata mesajının kontrol edilemez bir log kaydedicisi (log sink’i) ile log dosyasına yazdırıldığı gösterilmiştir.

printStackTrace() Hakkında:

Java’da hata mesajı basma metodu printStackTrace() varsayılan olarak stderr’e hata detaylarını basar. std.err ise varsayılan olarak sistemdeki log dosyasına kayıtların basılmasını sağlayan bir stream’dir. std.err eğer farklı bir şekilde yapılandırılmışsa istemci arayüzüne de hatayı basabilir.

Burada hata mesajının kontrol edilemez bir log kaydedicisi ile log dosyasına yazdırılması bu kod bloğunu güvensiz kılmaktadır. Çünkü kontrolsüz log kaydedicileri;

  • Log seviyelendirme (verbose) ayarı
  • Hassas bilgileri filtreleme / maskeleme ayarı
  • Log taşkını (log flooding) önleme ayarı
  • v.b.

güvenliği arttırıcı özellikler bulundurmaz. Fakat framework temelli log kaydedicileri bu özelliklere sahiptirler. Bu güvensiz kod bloğundaki problem detay bilgilerin istemciye ifşa edilmesi veya edilmemesi değildir. Kontrol edilemez bir log kaydedicisi ile log alma işlemi yapılmasıdır. Basılan log kayıtlarının gelecekte olası bir sızdırılma senaryosu ile karşı karşıya kalındığında kontrolsüzce tam detay kayıtlar yer aldığndan bilgi ifşasına yol açacaktır.

Paylaşılan güvensiz kod bloğunun örnek bir güvenli hali sunulmuştur:

Java - Güvenli Hal:

// Güvenli Kod

// ENG: Write Exception Details to Log, Send 
//      Generic Error Message
// TR : İstisna Detaylarını Log’a Yazdırma ve 
//      Genel Bir Hata Mesajı Dönme

private void wrapCallToDB_SafePrintToLog(HttpServletRequest request) 
throws ServletException, IOException {

    String paramValue = request.getParameter("Param");

    try {
        callDbProc(paramValue); 
    } catch (SQLException ex) {
        writeExceptionToLog(ex);
        System.err.println("Veritabanı Hatası, detaylar için log dosyasına bakınız.");
    }
}

Bu örnekte try bloğundan fırlaması muhtemel bir hatanın catch ile yakalandığı ve catch bloğunda ise hata mesajının kontrolsüz bir log kaydedicisi ile log dosyasına basılması yerine framework kontrollü bir log kaydedicisi ile log dosyasına yazdırılması, sonra kontrolsüz bir log kaydedicisi ile std.err’e genel (detay unsur içermeyen) hata mesajı yazdırıldığı görülmektedir. Bu güvenli kodlama pratiği olarak kabul edilmektedir.

Uygulamalar istemciye kontrol edilemez log kaydedicisi (log sink ile) ile detay hata mesajları bastığında veya sunucu taraftaki log dosyalarına kontrol edilemez log kaydedicisi ile detay hata mesajları bastıklarında “Hata Mesajı Yoluyla Bilgi İfşası” açıklığı vardır denir.

Açıklığın Önlemi:

Bu açıklığın önlenmesinde takip edilmesi gereken hususlar şu şekildedir:

  • İstisna (exception) bilgileri istemcilere doğrudan sergilenmemelidir. Bunun yerine bu bilgiler detayları ile beraber log dosyalarına log’lanmalıdır ve istemciye durum hakkında bilgilendirici, spesifik olmayan, genel bir hata mesajı sunulmalıdır.

  • Log alma işleminde programlama dillerinin kontrol edilemez native (yerel) metotlarını kullanmak yerine programlama dillerinin kullanılan framework’üne ait kontrol edilebilir metotlarını ( örn; java’da logger.error() metodunu ) kullanmak tercih edilmelidir.

  • Uygulama kaynak kodlarında istisna (exception) fırlatabilen herhangi bir metot istisna işleyici (exception handler) bir blokla çevrelenmelidir. Fırlaması beklenen istisnalar için açık bir şekilde (explicitly) istisna işleyici (exception handler) tanımlanmalıyken fırlaması beklenmedik istisnalar için de varsayılan bir istisna işleyici (exception handler) tanımlaması dahil edilmelidir.

  • Ayrıca bir istisna işleyici (exception handler) ile çevrelenmemiş hataların uygulamadan çıkışını önlemek için “global istisna işleyici” (global exception handler) yapılandırılmalıdır.

Yararlanılan Kaynaklar:

  • https://cwe.mitre.org/data/definitions/209.html
  • https://www.geeksforgeeks.org/throwable-printstacktrace-method-in-java-with-examples/
Bu yazı 23.10.2025 tarihinde, saat 07:10:41'de yazılmıştır. 07.01.2026 tarihi ve 12:11:43 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 400
Yorumlar
Henüz yorum girilmemiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :