SecurityManager denetimlerinden açık yetkilendirmeye
Devre dışı bırakılan SecurityManager denetimlerini açık uygulama yetkilendirmesi ve dağıtım yalıtımıyla değiştirin.
SecurityManager manager = System.getSecurityManager();
if (manager != null) {
manager.checkRead(path.toString());
}
return Files.readString(path);
// Untrusted users must not be able to modify this tree
Path root = allowedRoot.toRealPath();
Path resolved = root.resolve(requested)
.normalize()
.toRealPath();
if (!resolved.startsWith(root)) {
throw new SecurityException(
"Path is outside the allowed root");
}
return Files.readString(resolved);
Açık politika
Yetkilendirme, uygulama mantığında görünür ve test edilebilir durumdadır.
Gerçek yalıtım
Süreç, konteyner ve işletim sistemi sınırları uygulamanın tamamını korur.
Zorunlu geçiş
JDK 24 ve sonraki sürümlerde artık politika uygulayamayan denetimleri kaldırır.
JEP 486'nın Security Manager'ı kalıcı olarak devre dışı bıraktığı JDK 24 ve sonraki sürümlerde zorunludur.
JEP 486, JDK 24'te Security Manager'ı kalıcı olarak devre dışı bıraktığından System.getSecurityManager() üzerinden yapılan denetimler yalnızca JDK 23 ve önceki sürümlerde politika uygulayabilir. Uygulamalar, etki alanı mantığında erişimi açıkça yetkilendirmelidir; güvenilmeyen kullanıcılar söz konusu ağacı eşzamanlı olarak değiştiremiyorsa gerçek dosya sistemi yollarının çözümlenmesi, mevcut sembolik bağlantıların izin verilen bir kök dizinin dışına çıkmasını önler. Saldırganın yazabildiği ağaçlar için SecureDirectoryStream gibi yarış durumlarına dayanıklı, tanıtıcıya göreli erişim kullanın. Yalıtım için süreç, konteyner veya işletim sistemi sınırlarını kullanın. JDK 24, kullanımdan kaldırılmış API'yi geçici olarak korur; ancak bu API etkinleştirilemez ve yerine başka bir süreç içi sanal alan getirilmemiştir.