2016-05-23 2 views
0

Я попробовал следующий эксперимент (это просто псевдокод):Как обеспечить безопасность при чтении объектов из ObjectInputStream?

class Server { 
    public static void main(final String args[]) { 
     final ServerSocket server = new ServerSocket(PORT); 
     final Socket client = server.accept(); 
     final ObjectInputStream stream = new ObjectInputStream(client.getInputStream()); 
     final Object object = stream.readObject(); 
     // Can we hope that standard toString method will be called? 
     System.out.println(object.toString()); 
    } 
} 

затем создал вредоносный объект:

class MaliciousObject extends Object implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Override 
    public String toString() { 
     return "I am malicious object"; 
    } 
} 

и, наконец, послал экземпляр вредоносного объекта в разъединяет с помощью другой программы:

public static void main(final String args[]) { 
    final Socket socket = new Socket(); 
    socket.connect(serversAddress, TIMEOUT); 
    final ObjectOutputStream stream = new ObjectOutputStream(socket.getOutputStream()); 
    stream.writeObject(new MaliciousObject()); 
} 

Вывод, что сервер печати на экране был

I am malicious object 

Таким образом, кажется, что хакер может реализовать объект класса расширения, переопределяет метод M, чтобы выполнить некоторые вредоносный код, а затем отправить этот объект по сети в надежде, что сервер будет вызывать М.

Следовательно , мой вопрос: как защититься от этого? Если мы с читаем объекты ObjectInputStream, как мы можем быть уверены, что они не искажены?

В качестве побочного вопроса в этом случае используется загрузчик классов Java при чтении объектов из ObjectInputStream?

ответ

1

Таким образом, кажется, что хакер может реализовать объект класса расширения, переопределяют метод M для выполнения какой-то вредоносный код, а затем отправить этот объект по сети в надежде этот сервер будет звонить M.

№ Объект не содержит кода. Класс содержит код, а класс не сериализуется. У вас уже был «взломанный» код, поэтому у вас уже была проблема до любой сериализации.

мой вопрос: как защититься от этого? Если мы читаем объекты ObjectInputStream, как мы можем быть уверены, что они не искажены?

Вы не можете, но ситуация может возникнуть только в том случае, если скомпилированный код, который выводит указанный результат, уже присутствует в вашем CLASSPATH, так что у вас уже есть проблема, сериализация или сериализация. Обратите внимание, что сериализация не сериализует классы .

В качестве побочного вопроса в этом случае используется загрузчик классов Java при чтении объектов из ObjectInputStream?

Да.

NB Псевдокод - это не эксперимент, не являющийся мысленным экспериментом. Я предлагаю вам попробовать его в реальном мире.

+0

Я также думал, что объект должен содержать только его состояние. Но как тогда метод toString печатает «Я вредоносный объект»? – mercury0114

+1

@ mercury0114 Потому что у вас уже есть «взломанный» .class файл в CLASSPATH, как я уже говорил. Если вы этого не сделаете, проблема не может возникнуть по причинам, о которых я уже говорил. – EJP

+0

@downvoter Просьба указать соответствующий раздел [Спецификация сериализации объекта] (https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html), который не согласуется с этим ответом. Если вы его найдете. – EJP

0

Возможно, serialVersionUID может помочь в защите от этого. Вы можете прочитать: http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/

What is a serialVersionUID and why should I use it?

+0

Если 'serialVersionUIDs' не совпадают, было бы выбрано' InvalidClassException'. В любой из ваших ссылок нет ни одного вопроса, который бы затрагивал вопрос. – EJP

+0

Должен быть бросок, с 'serialVersionUID' java подтвердил, что серверные и клиентские объекты одинаковы, если изменение хакера может его поймать, поэтому он предотвращает появление вредоносных объектов. – nikli

+0

Если «изменение хакера», вы должны уже иметь взломанный файл .class на вашем CLASSPATH. В противном случае проблема не может возникнуть; и если у вас уже есть взломанный файл .class, у вас уже есть проблема, независимо от сериализации. Вы смешиваете объекты с классами и данные с кодом. – EJP

Смежные вопросы