Maison >Java >javaDidacticiel >Comment prévenir les failles de sécurité dans la sérialisation Java ?
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.
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.
Il existe deux principaux types de vulnérabilités de sérialisation Java :
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 :
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
VulnerableClass
. ConclusionLa 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!