Могу ли я безопасно использовать XStream для обработки XML, поступающего извне моей системы?
Какова лучшая практика при работе с «потенциально вредоносным XML» с использованием xstream?
Скажем, у меня в коде есть класс, подобный этому:
package hazard;
class Dangerous {
public Dangerous() {
AtomicBomb.getInstance().nuke();
}
}
Злоумышленник может отправить файл XML, например:
<hazard.Dangerous/>
и make XStream вызывает метод nuke ().
Этот пример довольно теоретический. Как было указано, я не ожидаю, что конструктор будет делать такие вещи. Но могу ли я быть уверен, что ни один конструктор в любой библиотеке, доступной в пути к классам, не свободен от таких проблем (например, выделить какой-либо ресурс, например дескриптор файла).
Дело в том, что отправка файла XML позволяет злоумышленнику создавать произвольные объекты. Более реалистичным подходом может быть использование одного класса вместо другого.
public class Foo<T implements Bar> {
private T t;
// Getters/setters ...
}
public interface Bar {
public void bar();
}
public class Bar1 implements Bar {
// ...
}
public class Bar2 implements Bar {
// ...
}
С (вредоносным) вводом XML:
<foo>
<!-- I expect bar1 -->
<package.Bar2/>
</foo>
Теперь с кодом Java:
Bar<Foo1> bar = (Bar<Foo1>) xstream.fromXML(xml);
// I expect to have a bar1 but I have a bar2.
bar.getT().foo();
На первый взгляд, решение состоит в том, чтобы предоставить пользовательский Mapper (работа выполняется в методе realClass ()).