Güvenli Kodlama: CWE-377 – Güvenli olmayan geçici dosyalar ve bunlardan nasıl kaçınılacağı

Saberie

Active member
Uygulamada geliştiriciler, bir uygulama çalışırken verileri geçici olarak depolamak için sıklıkla geçici dosyalar kullanır. Bu verilerin doğrudan işlenmesi veya bir programın diğer bölümlerine iletilmesi gerekir ve hassas bilgiler içerebilir. Ancak bu geçici dosyalar güvenli bir şekilde işlenmezse uygulamanın gizliliğini, bütünlüğünü veya kullanılabilirliğini tehlikeye atabilecek güvenlik açıklarını açabilirler. Ortak Zayıflık Sayımı CWE-377, geçici dosyaların güvenli olmayan şekilde oluşturulması ve yönetilmesiyle ilgili bu tür bir güvenlik açığının ayrıntılarını vermektedir.


Duyuru








Sven, 1996'dan bu yana ve 15 yılı aşkın bir süredir dünya çapında otomotiv, havacılık, sigorta, bankacılık, Birleşmiş Milletler ve Dünya Bankası gibi endüstrilerde endüstriyel projelerde Java programlıyor. 10 yıldan fazla bir süredir Amerika'dan Yeni Zelanda'ya kadar konferanslarda ve topluluk etkinliklerinde konuşmacı olarak yer alıyor, JFrog ve Vaadin için geliştirici savunucusu olarak çalışıyor ve düzenli olarak BT dergileri ve teknoloji portalları için makaleler yazıyor. Ana konusu olan Core Java'nın yanı sıra TDD ve güvenli kodlama uygulamalarını da kapsar.







CWE-377: Java'da güvenli olmayan geçici dosya


CWE-377'ye göre “güvenli olmayan geçici dosya” terimi, bir programın güvenli olmayan bir şekilde geçici bir dosya oluşturması durumunda ortaya çıkan bir güvenlik açığını ifade eder. Saldırganlar, veri manipülasyonu, yetkisiz veri erişimi veya hizmet reddi (DoS) gibi çeşitli kötü amaçlı etkinlikleri gerçekleştirmek için bu güvenlik açığından yararlanabilir. Güvenli olmayan geçici dosyalar oluşturulurken genellikle aşağıdaki sorunlar ortaya çıkar:

Tahmin edilebilir dosya adları: Geçici dosyalar öngörülebilir adlara sahip olduğunda, saldırganlar bunları kolayca tahmin edebilir ve dosyanın içeriğini okumak veya değiştirmek için erişim sağlayabilir.

Güvenli olmayan dosya izinleri: Yanlış izinler, geçici dosyalara yetkisiz kullanıcılar tarafından erişilmesine veya değiştirilmesine yol açabilir.

Yarış koşulları: Bir saldırganın bir uygulamayı geçip oluşturmayı amaçladığı uygulamayla aynı adda bir dosya oluşturması durumunda Kontrolden Kullanıma Kadar Zaman (TOCTOU) yarış durumu ortaya çıkabilir.

Java'da geliştiriciler genellikle geçici dosyaları önbelleğe alma, ön veri işleme veya geçici sonuçları depolama gibi çeşitli amaçlarla kullanır. Java, geçici dosyalar oluşturmak için aşağıdaki yöntemler de dahil olmak üzere çeşitli yollar sunar: File.createTempFile()bu, varsayılan geçici dosyalar dizininde benzersiz bir ada sahip geçici bir dosya oluşturur.

Bu API'lerin uygunsuz kullanımı, aşağıdaki kod örneklerinde de gösterildiği gibi, CWE-377'de açıklanan riskleri oluşturmaya devam edebilir:


import java.io.File;
import java.io.IOException;

public class InsecureTempFileExample {
public static void main(String[] args) throws IOException {
File tempFile = new File("/tmp/tempfile.txt");
tempFile.createNewFile();
System.out.println("Temporary file created at: " + tempFile.getAbsolutePath());
}
}


Bu örnekteki kod, /tmp dizininde sabit kodlanmış dosya adına (tempfile.txt) sahip geçici bir dosya oluşturur. Bu yaklaşım birkaç nedenden dolayı güvensizdir: Dosya adı tahmin edilebilir olduğundan, saldırgan uygulamadan önce aynı adda bir dosya oluşturabilir ve bu da bahsedilen TOCTOU yarış durumuna yol açabilir. Dosya, dosya izinleri üzerinde kontrol olmadan oluşturulur ve bu da hassas bilgilerin açığa çıkmasına neden olabilir.

Olası etkiler

CWE-377, geçici dosyanın kullanımına ve içerdiği verilerin hassasiyetine bağlı olarak ciddi sonuçlar doğurabilir. Olası etkiler şunları içerir:

Bilginin açığa çıkması: Saldırgan geçici bir dosyanın adını tahmin edebiliyorsa, dosya uygun şekilde korunmamışsa içeriğini de okuyabilir. Bu daha sonra şifreler, belirteçler veya kişisel veriler gibi hassas bilgilerin açığa çıkmasına yol açar.

Veri manipülasyonu: Bir saldırgan, uygulama onu kullanmadan önce geçici bir dosya oluşturabilir veya değiştirebilir; bu da verilerin bozulmasına veya yetkisiz değişikliklere yol açabilir. Bunun olası sonuçları, uygulamaların yanlış davranışı veya sisteme kötü amaçlı verilerin girmesi olabilir.

Hizmet Reddi (DoS): Bir saldırgan, bir uygulamanın kullanmayı beklediği adlara sahip geçici dosyaları önceden oluşturarak, özellikle bir uygulamanın düzgün çalışmasını engelleyebilir ve hizmet reddine neden olabilir.

Düzeltici önlemler

CWE-377'yi önlemek için geliştiricilerin geçici dosyalarla çalışırken güvenli kodlama uygulamalarını takip etmesi gerekir. Aşağıda Java'da geçici dosyaları güvenli bir şekilde oluşturmak ve yönetmek için çeşitli stratejiler gösteriyorum:

1. Kullan File.createTempFile() doğru şekilde

Yöntem File.createTempFile() benzersiz ancak rastgele bir geçici dosya adı oluşturarak öngörülebilir dosya adları riskini azaltır. Ayrıca, sistemin Temp dizini varsayılan olarak kullanılsa da, geliştiricilerin dosya için bir dizin belirlemesine de olanak tanır.


import java.io.File;
import java.io.IOException;

public class SecureTempFileExample {
public static void main(String[] args) throws IOException {
File tempFile = File.createTempFile("tempfile_", ".tmp");
tempFile.deleteOnExit(); // Ensures the file is deleted when the JVM exits
System.out.println("Temporary file created at: " + tempFile.getAbsolutePath());
}
}


Bu yaklaşım çeşitli riskleri azaltır: Dosya adı rastgele oluşturulur ve saldırganın tahmin etmesini zorlaştırır. Java Sanal Makinesi'nden (JVM) çıkıldığında dosya otomatik olarak silinir ve dosyaların eskime olasılığı azalır.

2. Dosya izinlerinin doğru olduğundan emin olun

Geçici dosyalar oluştururken, uygun dosya izinlerini ayarlamak, yetkisiz erişimi önlemek açısından kritik öneme sahiptir. Bu, Java'da aşağıdaki yöntemler kullanılarak ayarlanabilir: setReadable(), setWritable() VE setExecutable() Dosya izinlerini kontrol etmek için kullanılır.


import java.io.File;
import java.io.IOException;

public class SecureTempFileWithPermissionsExample {
public static void main(String[] args) throws IOException {
File tempFile = File.createTempFile("secure_tempfile_", ".tmp");
tempFile.setReadable(true, true);
tempFile.setWritable(true, true);
tempFile.setExecutable(false);
tempFile.deleteOnExit();

System.out.println("Temporary file created with secure permissions at: " + tempFile.getAbsolutePath());
}
}


Bu kod örneğinde dosya yalnızca sahibi tarafından okunabilir ve yazılabilir olduğundan yetkisiz erişim riski en aza indirilir.

3. Sabit kodlanmış dosya adlarından kaçının

Yukarıdaki ilk güvenli olmayan örnekte gösterildiği gibi sabit kodlanmış dosya adlarının kullanılması risklidir çünkü geçici dosya adını tahmin edilebilir hale getirir. Her zaman benzersiz ve öngörülemeyen dosya adları üreten mekanizmaları kullanın. File.createTempFile().

4. Geçici dosyaları ayrıcalıklı bir bağlamda yönetin

Hassas verilerle uğraşırken geçici dosyaların kontrollü veya ayrıcalıklı bir ortamda yönetilmesi yararlı olabilir. Bu, dosyaları sınırlı erişime sahip bir dizinde oluşturmayı veya Java kullanmayı mümkün kılar AccessControllerdosya işlemleri için daha sıkı güvenlik politikaları uygulamak için kullanılabilir.

Gelişmiş hususlar

5. Java.nio.file paketini kullanın

Java 7'de sunulan java.nio.file paketi, geçici dosyaların oluşturulması da dahil olmak üzere dosya yönetimi için daha sağlam ve esnek mekanizmalar sağlar. THE Filessınıf şunları sunar: createTempFile()izinler gibi dosya niteliklerini de belirtebilen yöntem. Kod örneği, dosya güvenliği öznitelikleri üzerinde ayrıntılı denetim uygulamak için NIO paketini kullanarak dosya izinlerinin nasıl ayarlanacağını gösterir:


import java.io.File;
import java.io.IOException;

public class SecureTempFileWithPermissionsExample {
public static void main(String[] args) throws IOException {
File tempFile = File.createTempFile("secure_tempfile_", ".tmp");
tempFile.setReadable(true, true);
tempFile.setWritable(true, true);
tempFile.setExecutable(false);
tempFile.deleteOnExit();

System.out.println("Temporary file created with secure permissions at: " + tempFile.getAbsolutePath());
}
}


6. Bellek içi çözümleri kullanmayı düşünün

Bazı uygulamalar için, aşağıdakiler gibi bellek içi depolama çözümlerini kullanarak geçici dosyalar oluşturmaktan tamamen kaçınmak mümkündür: ByteArrayOutputStream geçici veriler için kullanın. Bellek içi çözümler, Java uygulamalarındaki geçici dosyaların yerini alabilir, böylece daha fazla verimlilik ve daha hızlı işlem sağlanır. Yalnızca çalışma zamanı sırasında veri gerektiren uygulamalar için özellikle kullanışlıdırlar. Ancak artan depolama gereksinimleri, veri değişkenliği, ölçeklenebilirlik zorlukları ve güvenlik riskleri gibi dikkatle değerlendirilmesi gereken dezavantajlar da vardır.

Ancak bellek içi yaklaşım, geçici dosya sistemi tabanlı depolamayla ilişkili riskleri ortadan kaldırır ancak büyük veri kümeleri veya önemli bellek sınırlamaları olan uygulamalar için sınırlıdır.

CWE-377 ile uğraşırken en iyi uygulamalar


Java'da geçici dosyaların güvenli bir şekilde işlenmesini sağlamak için geliştiricilerin aşağıdaki en iyi uygulamaları izlemesi gerekir:

Güvenli varsayılanları tercih edin: Her zaman gibi yöntemleri kullanın File.createTempFile() VEYA Files.createTempFile()Dosya oluşturmak için güvenli varsayılan ayarlar sağlayan.

Dosya izinlerini açıkça ayarlayın: Geçici dosyaların gerekli minimum izinlere sahip olduğundan emin olun ve diğer kullanıcılara gereksiz erişim vermekten kaçının.

Tahmin edilebilir dosya adlarından kaçının: Geçici dosyalar için hiçbir zaman sabit kodlanmış veya öngörülebilir adlar kullanmayın. Her zaman güvenli API'leri kullanarak benzersiz dosya adları oluşturun.

Kullanım deleteOnExit(): Mümkün olduğunda kullanın deleteOnExit() JVM'den çıkıldığında geçici dosyaların otomatik olarak temizlenmesini sağlamak için.

Geçici dosyaların boyutunu sınırlayın: Geçici dosyaları sınırlı erişime sahip dizinlerde saklayın ve daha sıkı güvenlik kontrolleri gerektiren geçici dosyalar için özel bir dizin oluşturmayı düşünün.

İstisnaları doğru şekilde ele alın: Geçici dosyalarla çalışırken, dosya işlemleri başarısız olsa bile uygulamanızın güvenli ve istikrarlı bir şekilde çalışmaya devam etmesini sağlamak için her zaman tüm istisnaları ele alın.

Java geliştiricileri, açıklanan yönergeleri ve en iyi uygulamaları izleyerek CWE-377 ile ilişkili riskleri azaltabilir ve uygulamalarının geçici dosyaları güvenli bir şekilde işlemesini sağlayabilir. Güvenli API'lerin kullanılması, uygun dosya izinleri ve dikkatli dosya yönetimi uygulamaları, bir Java uygulamasında veri gizliliğinin, bütünlüğünün ve kullanılabilirliğinin korunması açısından kritik öneme sahiptir.

Geçici dosyaların güvenli yönetimi yalnızca en iyi uygulama değil, aynı zamanda sağlam ve güvenli Java uygulamaları geliştirmenin temel bir yönüdür. Bu ilkelere bağlı kalmak, uygulamaları yaygın tehditlerden korur ve daha güvenli bir yazılım ekosistemine katkıda bulunur.
 
Üst