Mencegah kelemahan pensirilan Java memerlukan pendekatan pelbagai serampang, termasuk: Menggunakan senarai putih untuk mengehadkan kelas boleh bersiri. Gunakan penapis untuk memeriksa objek, mengesahkan tandatangan atau menyulitkan objek. Lumpuhkan proses penyahserikatan. Asingkan proses penyahserikatan dan laksanakannya dalam persekitaran terkawal. Laksanakan pengesahan input, gunakan amalan pengekodan selamat dan kemas kini perisian dan kebergantungan secara kerap untuk mengeraskan aplikasi. . Proses ini, jika tidak direka dengan teliti, boleh memperkenalkan kelemahan keselamatan yang serius. Artikel ini akan meneroka jenis kelemahan ini dan cara mencegahnya.
Jenis Kerentanan
Terdapat dua jenis kelemahan pensirilan Java utama: Pelaksanaan Kod Jauh (RCE)import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class SerializableFilter implements SerializableFilter { private Set<String> allowedClasses = new HashSet<>(); public SerializableFilter() { allowedClasses.add("com.example.user.User"); allowedClasses.add("com.example.product.Product"); } @Override public boolean accept(Class<?> clazz) { return allowedClasses.contains(clazz.getName()); } }2. Gunakan penapis
import java.io.IOException; import java.io.ObjectOutputStream; import java.io.ObjectOutputStream.PutField; import java.lang.reflect.Field; public class SerializationFilter implements ObjectOutputFilter { @Override public ObjectOutputStream filter(ObjectOutputStream out) { return new ObjectOutputStream(out) { @Override protected PutField putFields() throws IOException { return new PutField() { @Override public void put(String name, Object value) throws IOException { if (value instanceof SensitiveData) { throw new SecurityException("Cannot serialize sensitive data"); } super.put(name, value); } }; } }; } }
Lumpuhkan proses penyahserilan apabila boleh. Sebagai contoh, anda boleh melumpuhkan penyahserikatan dalam servlet.
import javax.servlet.ServletContext; public class ServletInitializer implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContextListener.super.contextInitialized(sce); sce.getServletContext().setAttribute("org.apache.catalina.connector.RMI_SERVER", "disabled"); } }
4. Asingkan penyahserilan
Jika anda tidak boleh melumpuhkan penyahserilan, anda boleh mengasingkan proses penyahserilan dan melaksanakannya dalam persekitaran terkawal. Contohnya, penyahserikatan boleh dilakukan dalam mesin atau bekas maya yang berasingan.
5. Keraskan aplikasi anda
Selain langkah keselamatan bersiri khusus, kelemahan boleh dicegah dengan mengeraskan aplikasi anda, termasuk:
Melaksanakan pengesahan input.
Gunakan amalan pengekodan selamat. Kemas kini perisian dan kebergantungan dengan kerap.Contoh Realistik
Pertimbangkan contoh berikut:
import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class VulnerableClass { private String name; public VulnerableClass(String name) { this.name = name; } public static void main(String[] args) { try (FileOutputStream fos = new FileOutputStream("malicious.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(new VulnerableClass("attacker-controlled-data")); } catch (IOException e) { e.printStackTrace(); } } }
Contoh kod ini mencipta objek VulnerableClass
yang mengandungi data dikawal penyerang. Objek bersiri ke fail malicious.ser. Penyerang boleh mengeksploitasi data ini untuk melaksanakan kod arbitrari pada komputer mangsa menggunakan eksploitasi RCE yang diubah suai. Dengan menggunakan langkah berjaga-jaga yang dinyatakan di atas, kita boleh melindungi daripada kelemahan tersebut. Sebagai contoh, kami boleh menggunakan senarai putih untuk membenarkan hanya versi VulnerableClass
yang dipercayai untuk disirikan.
Kesimpulan
Atas ialah kandungan terperinci Bagaimana untuk mengelakkan kelemahan keselamatan dalam siri Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!