Maison  >  Article  >  Java  >  Comment prévenir les failles de sécurité dans la sérialisation Java ?

Comment prévenir les failles de sécurité dans la sérialisation Java ?

王林
王林original
2024-04-16 12:36:021222parcourir

La prévention des vulnérabilités de sérialisation Java nécessite une approche à plusieurs volets, notamment : Utiliser des listes blanches pour limiter les classes sérialisables. Utilisez des filtres pour inspecter les objets, vérifier les signatures ou chiffrer les objets. Désactivez le processus de désérialisation. Isolez le processus de désérialisation et exécutez-le dans un environnement contrôlé. Mettez en œuvre la validation des entrées, utilisez des pratiques de codage sécurisées et mettez régulièrement à jour les logiciels et les dépendances pour renforcer les applications.

Comment prévenir les failles de sécurité dans la sérialisation Java ?

Comment prévenir les vulnérabilités de sécurité dans la sérialisation Java

La sérialisation Java est un processus de conversion d'objets au format binaire pour le stockage ou la transmission. Ce processus, s’il n’est pas conçu avec soin, peut introduire de graves vulnérabilités en matière de sécurité. Cet article explorera les types de ces vulnérabilités et comment les prévenir.

Types de vulnérabilités

Il existe deux principaux types de vulnérabilités de sérialisation Java :

  • Exécution de code à distance (RCE) : un attaquant peut exploiter le processus de sérialisation pour exécuter du code arbitraire sur l'ordinateur de la victime.
  • Deserialization Replay Attack : un attaquant peut rejouer un objet précédemment sérialisé pour déclencher des opérations non autorisées.

Précautions

La prévention des vulnérabilités de sérialisation Java nécessite une approche à plusieurs volets :

1. Utilisez une liste blanche

Utilisez une liste blanche pour limiter les classes qui peuvent être sérialisées et autoriser uniquement la sérialisation des classes de confiance. Cela atténue le risque de vulnérabilités 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. Utilisez des filtres

Utilisez des filtres pour inspecter les objets pendant la sérialisation et la désérialisation. Les filtres peuvent vérifier la signature d'un objet, chiffrer l'objet ou vérifier la présence d'attributs suspects.

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. Désactivez la désérialisation

Désactivez le processus de désérialisation lorsque cela est possible. Par exemple, vous pouvez désactiver la désérialisation dans un 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. Isoler la désérialisation

Si vous ne pouvez pas désactiver la désérialisation, vous pouvez isoler le processus de désérialisation et l'effectuer dans un environnement contrôlé. Par exemple, la désérialisation peut être effectuée dans une machine virtuelle ou un conteneur distinct.

5. Renforcez votre application

En plus des mesures de sécurité spécifiques à la sérialisation, les vulnérabilités peuvent être évitées en renforçant votre application, notamment :

  • Mise en œuvre de la validation des entrées.
  • Utilisez des pratiques de codage sécurisées.
  • Mettez régulièrement à jour le logiciel et les dépendances.

Exemple réaliste

Considérez l'exemple suivant :

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();
        }
    }
    
}

Cet exemple de code crée un objet VulnerableClass qui contient des données contrôlées par l'attaquant. L'objet est sérialisé dans le fichier malware.ser. Un attaquant pourrait exploiter ces données pour exécuter du code arbitraire sur un ordinateur victime à l'aide d'un exploit RCE modifié. VulnerableClass 对象,其中包含攻击者控制的数据。该对象被序列化到文件恶意.ser。攻击者可以使用经过修改的 RCE 漏洞攻击利用此数据在受害者计算机上执行任意代码。

通过应用上述预防措施,我们可以抵御此类漏洞。例如,我们可以使用白名单仅允许 VulnerableClass

En appliquant les précautions mentionnées ci-dessus, nous pouvons nous protéger contre de telles vulnérabilités. Par exemple, nous pourrions utiliser une liste blanche pour autoriser uniquement la sérialisation des versions fiables de VulnerableClass.

Conclusion

La vulnérabilité de sérialisation Java est une menace sérieuse pour la sécurité. En adoptant une approche à plusieurs volets, notamment l'utilisation de listes blanches, de filtres, la désactivation de la désérialisation, l'isolation de la désérialisation et le renforcement des applications, nous pouvons prévenir efficacement ces vulnérabilités. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn