Po pierwsze musisz zrozumieć swój kontekst, aby określić zagrożenia bezpieczeństwa. (Kiedy mówię o "zaufaniu", robię małe skróty, mówię celowo złośliwie.)
Jeśli zserializowane dane zostały utworzone, zachowane i przeczytane z tym samym zaufaniem, to nie ma żadnych prawdziwy problem (poza zwykłymi błędami). Zauważ, że jeśli piszesz jakieś poufne informacje, to zserializowane dane są również wrażliwe (wydaje się oczywiste, ale tam jest spory margines).
Jeśli zsesekalizowane dane są niezaufane z jakiegokolwiek powodu, to jest nieco więcej do rozważenia. Wewnętrzna struktura odtworzonych obiektów może być "niezwykła". Dane mogą nie być spójne. Możliwe, że udostępniłeś zmienne obiekty, które powinny być oddzielne. Deserializacja może spowodować nieskończoną pętlę lub nieskończoną pętlę, która po prostu nie jest możliwa do wykonania przed śmiercią cieplną wszechświata. I oczywiście dane mogą być kłamstwami.
Jeśli piszesz kod biblioteki, który jest używany przez mniej zaufanego kodu, a potem robi się bardziej interesująca:
W przypadku „kalendarzowym bug” (i podobne), to jest o deserialising dowolny strumień z złośliwy dane i złośliwy kod. Wytyczne bezpiecznego kodowania Java sugerują przeprowadzanie sprawdzeń bezpieczeństwa (przy użyciu "Modelu zabezpieczeń Java2") w niestandardowych metodach readObject
, co oznacza, że nie należy wywoływać deserialization z większym zaufaniem niż kod i dane.
Po stronie obiektów, które można usualizować, sprawy są trudniejsze. Obiekty dostarczane przez ObjectInputStream
do readObject
, , , lub po prostu domyślna deserializacja mogą mieć odwołania przechwycone przez złośliwy kod lub, w przypadku klas nieostatecznych, mogą być złośliwie podklasy. Obiekt może być również używany podczas deserializacji, gdy jest częściowo zainicjowany. Deserializacja nie wywołuje "prawdziwego" konstruktora z deserializowanej klasy (readObject
/readObjectNoData
jest rodzajem konstruktora psuedo, który nie może ustawić wartości s final
). To trochę koszmar, więc prawdopodobnie nie chcesz, aby twoje wrażliwe klasy były odtwarzane seryjnie.
Wystąpiło szereg słabych punktów w implementacji serializacji i deserializacji. Naprawdę nie musisz się tym martwić, chyba że sam je wdrożysz.
+1 dokładna odpowiedź –