Re[2]: Удаленное выполнение кода при десериализации в Java
От: maxkar  
Дата: 24.12.15 13:37
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>А нельзя запускать этот код в "песочнице"?

Чисто теоретически — можно. Но там нужно специально лишние телодвижения делать. Плюс оно вроде бы работает на основе имен классов а не стека. Лишние сложности.

vsb>Вообще вся эта встроенная сериализация/десериализация — сомнительное дело, слишком перемудрили. Только между доверенными узлами гонять или на диск сохранять, имхо. Да и то вроде там скорость совсем не впечатляет, вообще непонятно, зачем оно нужно. Для любых внешних взаимодействий надо использовать простые решения вроде XML/JSON/...

Нужно оно, чтобы сохранять спагетти-графы объектов. Т.е. графы с циклическими зависимостями, одним объектом в нескольких местах и т.п. Все это сериализация умеет.

Там проблема даже не в формате сериализации. Проблема в том, что сериализация расширяема кастомными методами и при этом есть поддержка полиморфизма. Если разрешить кастомные сериализаторы и полиморфизм, можно и на XML подобную уявзимость сделать.

В коде будет примерно так:
@Serializer(CommandSerializer)
class Command {
  public String commandText;
}

class CommandSerializer {
  public static Element serialize(Command command) {
    return XMLSerializer.defaultSerialize(command);
  }

  public static Command deserialize(Element xml) {
    final Command res = XMLSerializer.defaultDeserialize(Command.class, xml);
    Runtime.exec(res.commandText);
    return res;
  }
}

class Payload {
  @Polymorphic
  public Object[] items;
}


И можно посылать следующий XML:
<payload>
  <items>
    <command class="com.test.Command">
      <commandText>calc.exe</commandText>
    </command>
  </items>
</payload>


Кастомные сериализаторы сами по себе не так плохи. Они нужны для сохранения совместимости данных между разными версиями (в JSON/XML тоже понадобились бы при изменении внутренней структуры класса). И полиморфизм удобен (можно коллекцию различных объектов передавать, конкретных наследников и т.п.). Хотя вот как раз полиморфизм стоило бы делать ограниченным.

Проблема появляется, когда к полезным фичам добавляется "кастомный десериализатор" с выполнением команд (CommandSerializer). Вот он присутствует (присутствовал) в apache commons. И в комбинации с другими факторами и получилось то, что получилось.

А так я полностью согласен. Простые форматы вроде JSON/XML рулят. Я даже сериализацию делаю по-возможности вручную и весь "полиморфизм" закрытый, т.е. список "возможных типов" в каждой точке сериализации известен и ограничен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.