Rumah  >  Artikel  >  Java  >  Bagaimana untuk mengelakkan kelemahan keselamatan dalam siri Java?

Bagaimana untuk mengelakkan kelemahan keselamatan dalam siri Java?

王林
王林asal
2024-04-16 12:36:021175semak imbas

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 KerentananBagaimana untuk mengelakkan kelemahan keselamatan dalam siri Java?

Terdapat dua jenis kelemahan pensirilan Java utama:

Pelaksanaan Kod Jauh (RCE)

: Penyerang boleh mengeksploitasi proses penyirian untuk melaksanakan kod komputer sewenang-wenangnya pada mangsa.

Deserialization Replay Serangan
    : Penyerang boleh memainkan semula objek bersiri sebelum ini untuk mencetuskan operasi yang tidak dibenarkan. . Ini mengurangkan risiko kerentanan 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
  • Gunakan penapis untuk memeriksa objek semasa bersiri dan penyahserian. Penapis boleh mengesahkan tandatangan objek, menyulitkan objek atau menyemak kehadiran atribut yang mencurigakan.
    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);
                        }
                        
                    };
                }
                
            };
        }
    
    }
3. Lumpuhkan penyahserilan

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

    Kerentanan siri Java adalah ancaman keselamatan yang serius. Dengan mengambil pendekatan berbilang serampang, termasuk menggunakan senarai putih, penapis, melumpuhkan penyahserilangan, mengasingkan penyahserilangan dan aplikasi pengerasan, kami boleh menghalang kerentanan ini dengan berkesan.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn