Efficacité de Java 3rd Edition Section 85 Choix d'une alternative à la sérialisation Java

J'ai eu l'occasion de travailler avec la sérialisation en Java, j'ai donc lu le chapitre 12 de Effective Java 3rd Edition. Voici un résumé.

Qu'est-ce que Serialize / Deserialize?

Une technique pour encoder un objet sous forme de flux d'octets et vice versa. Dans le framework Java, il peut être facilement implémenté en implémentant l'interface Serializable sur l'objet.

Par exemple, lorsque User est sérialisé comme suit, l'objet User instancié peut être facilement désérialisé en appelant ```ObjectInputStream # readObject () `` `.

public class User implements Serializable {
    private static final long serialVersionUID = 199035831519635924L;
    private String name;
    private String cardNumber;

    public User(String name, String cardNumber) {
        this.name = name;
        this.cardNumber = cardNumber;
    }
}

Danger de sérialisation

La sérialisation est pratique, mais l'exemple ci-dessus signifie également que l'instance User peut être désérialisée de n'importe où.

Un tel code est un point faible pour les attaques telles que l'exécution de code à distance (RCE) et les attaques DoS. En outre, les sous-systèmes Java populaires tels que RMI, JMX et JMS, ainsi que les bibliothèques tierces, utilisent également la sérialisation, ce qui tend à augmenter la ** zone d'attaque **. (Les méthodes avec des types sérialisables Java utilisées à divers endroits tels que ces bibliothèques et produits sont appelées ** gadgets **. En combinant ces gadgets (chaîne de gadgets), un attaquant peut appeler du code natif. Finira.)

De plus, même sans gadget, vous pouvez utiliser la technologie de sérialisation pour lancer une attaque DoS et créer une «bombe désérialisée». Cela exploite la nécessité de calculer le code de hachage pour le champ ou l'élément lors de la désérialisation d'une instance, par exemple en créant une instance HashSet profondément imbriquée et en la désérialisant. Il s'agit d'une méthode d'attaque qui nécessite un temps de calcul énorme.

Contre-mesures contre les attaques de désérialisation

Le mieux est de ne faire aucune désérialisation dans le système. Il existe des représentations de données structurées multiplateformes (≠ systèmes de sérialisation) dans le monde, et en les utilisant, il est possible d'effectuer en toute sécurité une conversion entre un objet et une séquence d'octets par une méthode autre que la sérialisation. Ces représentations ne prennent en charge que les types de données de base et les tableaux et sont beaucoup plus simples que la sérialisation Java.

Les principaux sont JSON et protobuf, qui sont ** indépendants du langage **. -JSON → Un format d'échange de données léger souvent utilisé sur le Web. Développé pour JavaScript, il peut représenter des données dans un format textuel lisible par l'homme. ・ Protobuf → Développé par Google en C ++. Il est au format binaire et est plus efficace.

Ensuite, si vous développez un système Java existant et que vous ne pouvez pas éviter d'utiliser la sérialisation, ne désérialisez pas du tout les flux d'octets non approuvés. (N'acceptez pas les demandes RMI provenant de sources non fiables) → Les directives de codage sécurisé de Java déclarent que «la désérialisation de données non fiables est intrinsèquement dangereuse et doit être évitée», et est mise en évidence en majuscule, en gras, en diagonale et en rouge tout au long des directives. ing. Secure Coding Guidelines for Java SE

Si la sérialisation est inévitable et que la sécurité des données ne peut être assurée, il est également nécessaire d'utiliser ObjectInputFilter introduit dans Java 9. Cela permet d'effectuer le filtrage appliqué au flux de données avant la désérialisation. Il existe les deux types de méthodes de filtrage suivants. Liste noire ... Comment accepter les classes par défaut et rejeter les classes potentiellement dangereuses Liste blanche ... Comment rejeter les classes par défaut et accepter les classes sûres

La liste noire ne peut pas répondre aux nouvelles menaces, alors choisissez *** Liste blanche *** (Un outil appelé Serial Whitelist Application Trainer prépare automatiquement des listes blanches pour éviter une utilisation excessive de la mémoire et des objets profondément structurés, mais il existe également des attaques telles que des bombes désérialisées qui ne peuvent pas être évitées. )

Livres de référence

[Effective Java 3rd Edition](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-Joshua-Bloch/dp/4621303252/ref=tmm_pap_swatch_0?_encoding = UTF8 & qid = & sr =)

Recommended Posts

Efficacité de Java 3rd Edition Section 85 Choix d'une alternative à la sérialisation Java
Efficacité de Java 3rd Edition Chapitre 5 Génériques
Méthodes efficaces du chapitre 8 de Java 3rd Edition
Effective Java 3rd Edition Chapitre 9 Programme Général
Enum et annotations du chapitre 6 de Java 3rd Edition efficace
Efficacité de Java 3rd Edition Chapitre 4 Classes et interfaces
Efficace Java 3e édition Chapitre 7 Lambda et Stream
3ème résumé efficace de Java
Effective Java 3rd Edition Chapitre 2 Création et disparition d'objets
Efficace Java 3rd Edition Chapitre 3 Méthodes communes à tous les objets
Ce qui a changé entre la 2e édition effective de Java et la 3e édition
Point 85: Préférez les alternatives à la sérialisation Java
Sérialisation Java
Résumé de l'enquête sur les questions relatives à Java 2e édition efficace
J'ai essayé d'expliquer Effective Java 3rd Edition "presque tous les chapitres" en "japonais facile à lire".