Я попробовал следующий эксперимент (это просто псевдокод):Как обеспечить безопасность при чтении объектов из 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?
Я также думал, что объект должен содержать только его состояние. Но как тогда метод toString печатает «Я вредоносный объект»? – mercury0114
@ mercury0114 Потому что у вас уже есть «взломанный» .class файл в CLASSPATH, как я уже говорил. Если вы этого не сделаете, проблема не может возникнуть по причинам, о которых я уже говорил. – EJP
@downvoter Просьба указать соответствующий раздел [Спецификация сериализации объекта] (https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html), который не согласуется с этим ответом. Если вы его найдете. – EJP