Serializing Java Beans do XML za pomocą XMLEncoder
i XMLDecoder
wydaje się całkiem fajnym podejściem: wiele klas z wielu źródeł może być serializowanych niezawodnie, po prostu używając ich publicznego interfejsu. Korzystanie z tego podejścia do serializacji jest nawet sugerowane w wielu miejscach odwołania do interfejsu API. Ale użyta do tego XML syntax wydaje się dość potężna. Czy istnieją jakieś mechanizmy bezpieczeństwa, które zapobiegną atakom pochodzącym ze złośliwych dokumentów? A może z powodów bezpieczeństwa należy unikać używania niezaufanych dokumentów na numerach XMLDecoder
?Czy można bezpiecznie używać XMLDecoder do odczytu plików dokumentów?
Odpowiedz
Deserializacja ziaren serializowanych XML może spowodować dowolne działanie, które może wykonać maszyna JVM. Aby dać ci brzydki examle, rozważmy następujący dokument, który napisze pewien plik bez zadawane pytania:
<?xml version="1.0" encoding="UTF-8" ?>
<java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>/tmp/Hacked.txt</string>
<void method="println">
<string>You have been hacked!</string>
</void>
<void method="close"/>
</object>
</java>
To jest mniej więcej taka sama jak metoda
PrintWriter deserialize() {
PrintWriter obj = new PrintWriter("/tmp/Hacked.txt");
obj.println("You have been hacked!");
obj.close();
return obj;
}
Z tego powodu, I zdecydowanie doradzić przed po prostu odczytanie danych z niezaufanych źródeł za pomocą XMLDecoder
.
Albo sprawdź poprawność dokumentu do dobrze zdefiniowanego i nieszkodliwego podzbioru języka XML, albo użyj własnych formatów razem z technologiami takimi jak jaxb. Lub wykonaj deserializację w ściśle kontrolowanym środowisku, z menedżerami bezpieczeństwa, którzy nie pozwolą na żadną nieoczekiwaną operację.
NIE absolutnie nie jest bezpieczne w użyciu.
Przykład przedstawiony przez MvG (w zaakceptowanej odpowiedzi) nie powoduje utworzenia pełnego obrazu.
Spójrz na przykładach pisałem na stanowisku Using XMLDecoder to execute server-side Java Code on an Restlet application (i.e. Remote Command Execution) blog, gdzie mogę pokazać jak:
- procesy start,
- Pliki klasy upload,
- zapisu na stronie serwera HTML OutputStream,
- tworzyć XSS i
- wyzwalacz zdalny shell
wszystko z plików XML/ciągi, które są analizowane przez XMLDecoder (iw przykładzie pokazanym w poście na blogu, za pomocą klasy REST API ObjectRepresentation Restleta)
Dla mnie moja odpowiedź wykazała wykonanie dowolnego kodu, a wszystkie inne aspekty, które opisujesz, są tylko symptomami tego. Sądzę jednak, że nie każdy może nawiązać połączenie, w szczególności z procesami serwerowymi, więc dobrze jest to wyraźnie stwierdzić. A znalezienie podatnej ramy sprawia, że jest to o wiele bardziej namacalne. Czy skontaktowałeś się z programistami Restlet na ten temat? – MvG
@MvG: http://osvdb.org/show/osvdb/96079 – h3xStream
- 1. Czy można bezpiecznie używać os.environ.setdefault?
- 2. Czy można bezpiecznie używać -DBL_MAX w kodzie?
- 3. Czy można bezpiecznie używać SQLalchemy z gevent?
- 4. Czy można bezpiecznie używać GetHashCode do porównywania identycznych typów anonimowych?
- 5. Czy można używać wstawianych komentarzy do plików .ini z PHP?
- 6. Czy można bezpiecznie przechodzić „argumenty” do „apply()”
- 7. -fomit-frame-pointer, czy można go bezpiecznie używać?
- 8. Czy można bezpiecznie używać funkcji SHFileOperation w wątku roboczym?
- 9. Czy można bezpiecznie używać ReadWriterLockSlim w asynchronicznej metodzie
- 10. Czy można bezpiecznie używać opcji węzła v8 w środowisku produkcyjnym?
- 11. Czy można bezpiecznie używać metody images.get_serving_url_async() wewnątrz zadania ndb?
- 12. Czy można bezpiecznie połączyć kilka plików JavaScript w jeden?
- 13. Czy można bezpiecznie używać LIMIT bez ZAMÓWIENIA PRZEZ
- 14. Czy można bezpiecznie używać hasła password_hash ze znakami Unicode?
- 15. Czy można bezpiecznie używać słowa python "typ" w moim kodzie?
- 16. Czy można bezpiecznie używać przypisywania ciągów i przypisywania zadań?
- 17. Czy można bezpiecznie używać Stream.Seek, gdy BinaryReader jest otwarty?
- 18. Czy można bezpiecznie używać boost :: opcjonalnie w pamięci międzyprocesowej?
- 19. Czy można bezpiecznie używać emplace_back z kontenerem unique_ptrs?
- 20. Czy bezpiecznie jest nadal używać ASIHTTPRequest?
- 21. jak bezpiecznie używać JSON.stringify
- 22. Czy można bezpiecznie #define NULL nullptr?
- 23. Czy możesz używać antyfiksu do tworzenia dokumentów XML?
- 24. Czy bezpiecznie używać "używać ścisłej" w IE 8/9
- 25. Jak używać Sinatry do serwowania dokumentów XML?
- 26. Czy można bezpiecznie założyć wartość liczbową DayOfWeek?
- 27. Czy można bezpiecznie wywołać RCW z finalizatora?
- 28. Czy można bezpiecznie wyłączyć ostrzeżenie MSVC C4482?
- 29. Sprawdź, czy okno dialogowe można bezpiecznie odrzucić.
- 30. Kopiowanie plików do biblioteki dokumentów w SharePoint
Rzeczywiście. Wytyczna 3-8 aktualnych Wytycznych dotyczących bezpiecznego kodowania dla języka programowania Java "Długoterminowa trwałość komponentów JavaBeans obsługuje wykonywanie instrukcji Java." http://www.oracle.com/technetwork/java/seccodeguide-139067.html#3-8 –