Effektive Java 3rd Edition Abschnitt 85 Auswählen einer Alternative zur Java-Serialisierung

Ich hatte die Möglichkeit, mit Serialisierung in Java zu arbeiten, und las daher Kapitel 12 von Effective Java 3rd Edition. Hier ist eine Zusammenfassung.

Was ist Serialisieren / Deserialisieren?

Eine Technik zum Codieren eines Objekts als Bytestream und umgekehrt. Das Java-Framework kann einfach implementiert werden, indem die serialisierbare Schnittstelle auf dem Objekt implementiert wird.

Wenn der Benutzer beispielsweise wie folgt serialisiert wird, kann das instanziierte Benutzerobjekt einfach durch Aufrufen von `ObjectInputStream # readObject ()` deserialisiert werden.

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

Gefahr der Serialisierung

Die Serialisierung ist praktisch, aber das obige Beispiel bedeutet auch, dass die Benutzerinstanz von überall aus deserialisiert werden kann.

Ein solcher Code ist eine Schwachstelle für Angriffe wie Remote Code Execution (RCE) und DoS-Angriffe. Darüber hinaus verwenden beliebte Java-Subsysteme wie RMI, JMX und JMS sowie Bibliotheken von Drittanbietern die Serialisierung, wodurch der ** Angriffsbereich ** tendenziell vergrößert wird. (Methoden mit Java-serialisierbaren Typen, die an verschiedenen Orten wie diesen Bibliotheken und Produkten verwendet werden, werden als ** Gadgets ** bezeichnet. Durch Kombinieren dieser Gadgets (Gadget-Kette) kann ein Angreifer nativen Code aufrufen. Wird enden.)

Auch ohne Gadget können Sie mithilfe der Serialisierungstechnologie einen DoS-Angriff starten und eine "Deserialisierungsbombe" erstellen. Dies nutzt die Notwendigkeit aus, den Hash-Code für das Feld oder Element beim Deserialisieren einer Instanz zu berechnen, indem beispielsweise eine tief verschachtelte HashSet-Instanz erstellt und deserialisiert wird. Dies ist eine Angriffsmethode, die viel Rechenzeit erfordert.

Gegenmaßnahmen gegen Deserialisierungsangriffe

Die beste Wette ist, keine Deserialisierung im System durchzuführen. Es gibt plattformübergreifende strukturierte Datendarstellungen (≠ Serialisierungssysteme) auf der Welt, und mit diesen ist es möglich, die Konvertierung zwischen einem Objekt und einer Bytesequenz mit einer anderen Methode als der Serialisierung sicher durchzuführen. Diese Darstellungen unterstützen nur grundlegende Datentypen und Arrays und sind viel einfacher als die Java-Serialisierung.

Die wichtigsten sind JSON und Protobuf, die ** sprachneutral ** sind. -JSON → Ein leichtes Datenaustauschformat, das häufig im Web verwendet wird. Es wurde für JavaScript entwickelt und kann Daten in einem für Menschen lesbaren Textformat darstellen. ・ Protobuf → Von Google als C ++ entwickelt. Es ist im Binärformat und effizienter.

Wenn Sie ein vorhandenes Java-System entwickeln und die Verwendung der Serialisierung unvermeidbar ist, deserialisieren Sie nicht vertrauenswürdige Bytestreams überhaupt nicht. (Akzeptieren Sie keine RMI-Anfragen von nicht vertrauenswürdigen Quellen.) → In den Richtlinien für die sichere Codierung von Java heißt es, dass "die Deserialisierung nicht vertrauenswürdiger Daten von Natur aus gefährlich ist und vermieden werden sollte" und in den Richtlinien in Großbuchstaben, fett, schräg und rot hervorgehoben ist. ing. Secure Coding Guidelines for Java SE

Wenn eine Serialisierung unvermeidbar ist und die Datensicherheit nicht gewährleistet werden kann, muss auch der in Java 9 eingeführte `` `ObjectInputFilter``` verwendet werden. Dadurch kann die auf den Datenstrom angewendete Filterung vor der Deserialisierung durchgeführt werden. Es gibt die folgenden zwei Arten von Filtermethoden. Blacklist ... So akzeptieren Sie standardmäßig Klassen und lehnen potenziell gefährliche Klassen ab Whitelist ... So lehnen Sie Klassen standardmäßig ab und akzeptieren sichere Klassen

Die Blacklist kann nicht auf neue Bedrohungen reagieren. Wählen Sie daher *** Whitelist *** (Ein Tool namens Serial Whitelist Application Trainer erstellt automatisch Whitelists, um eine übermäßige Speichernutzung und tief strukturierte Objekte zu verhindern. Es gibt jedoch auch Angriffe wie deserialisierte Bomben, die nicht verhindert werden können. )

Nachschlagewerke

[Effektive 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

Effektive Java 3rd Edition Abschnitt 85 Auswählen einer Alternative zur Java-Serialisierung
Effektive Java 3rd Edition Kapitel 5 Generika
Effektive Java 3rd Edition Kapitel 8 Methoden
Effektives Java 3rd Edition Kapitel 9 Programm Allgemein
Effektive Java 3rd Edition Kapitel 6 Aufzählung und Anmerkungen
Effektive Java 3rd Edition Kapitel 4 Klassen und Schnittstellen
Effektive Java 3rd Edition Kapitel 7 Lambda und Stream
effektive Java 3. Zusammenfassung
Effektive Java 3rd Edition Kapitel 2 Objekterstellung und Verschwindenlassen
Effektive Java 3rd Edition Kapitel 3 Allen Objekten gemeinsame Methoden
Was hat sich zwischen Effective Java 2nd Edition und 3rd Edition geändert?
Punkt 85: Bevorzugen Sie Alternativen zur Java-Serialisierung
Java-Serialisierung
Effektive Zusammenfassung der Umfrage zu Java 2nd Edition
Ich habe versucht, Effective Java 3rd Edition "fast alle Kapitel" in "leicht lesbarem Japanisch" zu erklären.