Güvenli Kodlama: CWE-377 – TOCTOU yarış koşullarına yönelik
“CWE-377 – Güvenli olmayan geçici dosyalar ve bunlardan nasıl kaçınılacağı” tartışmasından ilham alarak, bu bağlamda ortaya çıkabilecek sinsi bir güvenlik açığını araştırmak önemlidir: TOCTOU (Kontrol Zamanından Kullanım Zamanına) . TOCTOU güvenlik açıkları, bir kaynağın (örneğin bir dosya) doğrulanması ile sonraki kullanımı arasında bir zaman farkı olduğunda ortaya çıkar. Kötü niyetli saldırganlar, özellikle geçici dosyalarla birlikte bu güvenlik açığından yararlanarak ciddi güvenlik ihlallerine neden olabilir.
Duyuru
Bu takip makalesi, TOCTOU koşullarının uygulamalarda, özellikle de geçici dosyaları yönetirken kendilerini nasıl gösterdiğini inceliyor. Makalede ayrıca bu riskleri azaltmaya ve sağlam ve güvenli uygulama geliştirmeyi sağlamaya yönelik stratejiler tartışılmaktadır.
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 Bağlamında TOCTOU'yu Anlamak
TOCTOU (Kontrol Zamanından Kullanım Zamanına Kadar), bir kaynağın durumu (dosya, bellek veya değişken gibi) kontrol edildiğinde (doğrulandığında veya doğrulandığında) ve daha sonra kullanıldığında ortaya çıkan bir tür yarış koşuludur ( değiştirilmiş veya erişilmiş) ayrı adımlarda. Bir saldırgan bu iki adım arasında erişim kazanır ve kaynağı değiştirirse, kötü amaçlı davranışlar başlatmak veya bir uygulamanın güvenliğini tehlikeye atmak için bu güvenlik açığından etkin bir şekilde yararlanabilir.
Geçici dosyalar için TOCTOU
Geçici dosyaların oluşturulmasıyla ilgili olarak TOCTOU güvenlik açıkları, bir program geçici bir dosyanın varlığını kontrol edip ardından bu dosyayı açtığında veya oluşturduğunda ortaya çıkar. Saldırgan bu işlemler arasındaki sürede aynı adda bir dosya oluşturmayı başarırsa, programın oluşturmanın veya erişmenin güvenli olduğunu varsaydığı dosyanın içeriğini veya özelliklerini kontrol edebilir.
Örnek olarak işlem sırasına bakalım:
- Program, geçici bir dosyanın (örneğin tempfile.txt) mevcut olup olmadığını kontrol eder.
- Dosya mevcut değilse program onu oluşturacaktır: gerekirse açın.
TOCTOU güvenlik açığının ayrıntılı kod örneği:
import java.io.File;
import java.io.IOException;
public class TOCTOUVulnerabilityExample {
public static void main(String[] args) throws IOException {
File tempFile = new File("/tmp/tempfile.txt");
// Time-of-check: Verify whether the file exists
if (!tempFile.exists()) {
// Time-of-use: Create the file
tempFile.createNewFile();
System.out.println("Temporary file created at: " + tempFile.getAbsolutePath());
}
}
}
- Program ilk önce dosyayı kullanarak kontrol eder. exists()-Yöntem eğer tempfile.txt var.
- Dosya yoksa şu komutu kullanın: createNewFile() aynı isimde yeni bir dosya oluşturulur.
TOCTOU'yu geçici dosyalarda kullanın
Saldırganlar TOCTOU güvenlik açıklarından çeşitli şekillerde yararlanabilir:
Dosya ön oluşturma: Saldırgan, uygulamanın erişebileceği bir dizinde amaçlanan geçici dosyayla aynı adı taşıyan bir dosya oluşturur. Dosya izinleri zayıfsa saldırgan o dosyanın içeriğinin kontrolünü ele geçirebilir.
Sembolik bağlantı saldırısı: Saldırgan, geçici dosyayla aynı adı taşıyan hassas bir dosyaya (örneğin /etc/passwd) işaret eden sembolik bir bağlantı (sembolik bağlantı) oluşturabilir. Program geçici dosyaya yazmaya veya geçici dosyadan okumaya çalışırsa, bunun yerine hassas dosyaya erişebilir ve bu da veri bozulmasına veya bilgi sızıntısına neden olabilir.
Ayrıcalık Artışı: Bir program yükseltilmiş ayrıcalıklarla (örneğin, root olarak) çalıştırılıyorsa, bir saldırgan, normalde erişme veya değiştirme yetkisine sahip olamayacakları dosyaları veya verileri değiştirmek için TOCTOU yarış koşulundan yararlanabilir.
Java'da TOCTOU güvenlik açıklarını önleme
TOCTOU güvenlik açıklarını önlemek için, özellikle geçici dosyalarla uğraşırken geliştiricilerin yarış durumu riskini en aza indiren birkaç en iyi uygulamayı izlemesi gerekir:
1. Atomik işlemleri kullanın
Nükleer operasyonlar ayrılmaz bir şekilde bağlantılıdır. Tamamen tamamlanır veya hiç gerçekleşmez, saldırganın müdahale etmesine fırsat bırakmaz. Yöntem File.createTempFile() Geçici dosyalar oluştururken Java atomiktir. Bu, dosya oluşturma ve ad oluşturmanın tek bir adımda gerçekleştiği ve tipik TOCTOU zaman penceresini ortadan kaldırdığı anlamına gelir.
import java.io.File;
import java.io.IOException;
public class AtomicTempFileCreation {
public static void main(String[] args) throws IOException {
// Atomic operation to create a temporary file
File tempFile = File.createTempFile("tempfile_", ".tmp");
tempFile.deleteOnExit();
System.out.println("Secure temporary file created at: " + tempFile.getAbsolutePath());
}
}
File.createTempFile() dosyanın benzersiz bir isme sahip olmasını ve uygulamayı yarış koşullarına maruz bırakmadan güvenli bir şekilde oluşturulmasını sağlar.
2. Güvenli dizinleri kullanma
Geçici dosyalar, diğer kullanıcıların erişemeyeceği, güvenli, özel bir dizine yerleştirilmelidir. Bu, saldırganların TOCTOU güvenlik açıklarından yararlanma yeteneklerini önemli ölçüde sınırlıyor çünkü saldırganlar bu dizinlerdeki dosyaları kolayca depolayamıyor veya değiştiremiyor.
3. Dosya ve Yolu Kullanma (NIO.2 API)
Java'nın NIO.2 API'si (java.nio.file), atomik dosya işlemleri de dahil olmak üzere gelişmiş dosya işleme mekanizmaları sağlar. Örneğin, izin verir Files.createTempFile() Güçlü izinler gibi özelleştirilebilir dosya niteliklerine sahip atomik dosyalar oluşturarak TOCTOU güvenlik açığı riskini daha da azaltın.
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;
public class SecureAtomicTempFile {
public static void main(String[] args) throws IOException {
// Create a temporary file with atomic operations and secure permissions
Path tempFile = Files.createTempFile("secure_tempfile_", ".tmp",
PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rw-------")));
System.out.println("Secure temporary file created at: " + tempFile.toAbsolutePath());
}
}
Bu yaklaşım, atomik dosya oluşturmayı kısıtlayıcı dosya izinleriyle birleştirerek hem TOCTOU güvenlik açıklarının oluşumunu hem de diğer potansiyel güvenlik risklerini azaltır.
Çözüm
TOCTOU güvenlik açıkları, özellikle bu dosyalar güvenli olmayan şekilde veya atomik olmayan şekilde oluşturulmuşsa, geçici dosyaları işlerken önemli bir güvenlik riski oluşturur. Bu güvenlik açıklarından kaçınmanın anahtarı, genellikle aşağıdaki gibi güvenli API'ler gibi atomik dosya oluşturma yöntemlerini kullanarak inceleme zamanı ile kullanım zamanı arasındaki boşluğu ortadan kaldırmaktır. File.createTempFile() VEYA Files.createTempFile().
Geliştiriciler, TOCTOU yarış koşullarıyla ilişkili riskleri anlayarak ve en iyi uygulamaları takip ederek, Java uygulamalarının bu saldırılara karşı koyabilmesini ve yazılım bütünlüğünü ve güvenliğini koruyabilmesini sağlayabilirler.
Mutlu programlama
Sven
(harita)