5

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

9

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 . Lub wykonaj deserializację w ściśle kontrolowanym środowisku, z menedżerami bezpieczeństwa, którzy nie pozwolą na żadną nieoczekiwaną operację.

+1

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 –

3

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)

+2

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

+0

@MvG: http://osvdb.org/show/osvdb/96079 – h3xStream

Powiązane problemy