#java #spring #spring-mvc #security #fortify
#java #весна #spring-mvc #Безопасность #укрепить
Вопрос:
Я получаю проблему с динамической оценкой кода: небезопасная десериализация в строках ниже:
@RequestMapping(value="/v2/doc", method=RequestMethod.POST)
public JsonDocVerifyResponse verify(@RequestBody JsonDocVerifyRequestV3 request)
JsonDocVerifyRequestV3 temp = (JsonDocVerifyRequestV3)SerializationUtils.clone(request);
Решение для небезопасной десериализации заключается в следующем https://www.ibm.com/developerworks/library/se-lookahead /
Но, как вы можете видеть в моих кодах, я не использую ByteArrayOutputStream для десериализации объекта.
Является ли это ложным срабатыванием от Fortify? Если нет, как я могу использовать
org.apache.commons.io.serialization.ValidatingObjectInputStream
для проверки класса? Любой пример кода будет очень полезен!
Это фрагменты:
@RequestMapping(value="/v2/doc", method=RequestMethod.POST)
public JsonDocVerifyResponse verify(@RequestBody JsonDocVerifyRequestV3 request) {
debugJsonRequest(request, DOC_TYPE.khIdBack);
JsonDocVerifyResponse response = new JsonDocVerifyResponse();
return response;
}
public void debugJsonRequest(JsonDocVerifyRequestV3 request, DOC_TYPE docType) {
try {
JsonDocVerifyRequestV3 temp(JsonDocVerifyRequestV3) SerializationUtils.clone(request);
LOGGER.debug("{}|{}", docType, CommonUtil.debugJsonObject(temp));
} catch(Exception e) {
LOGGER.error("Error in debug json object", e);
}
}
Комментарии:
1. Не могли бы вы поделиться
request
деталями переменной?
Ответ №1:
Вы можете использовать accept
reject
методы и для более безопасной операции десериализации.
Пример:
import com.sun.xml.internal.ws.util.ByteArrayBuffer;
import org.apache.commons.io.serialization.ValidatingObjectInputStream;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Bar bar = new Bar("bar-test");
Foo foo = new Foo("test-foo", bar);
// write into an array buffer
ByteArrayBuffer buffer = new ByteArrayBuffer();
try (ObjectOutputStream serializeStream = new ObjectOutputStream(buffer)) {
serializeStream.writeObject(foo);
}
try (ValidatingObjectInputStream stream = new ValidatingObjectInputStream(buffer.newInputStream())) {
// add validated classes
stream.accept(Foo.class);
stream.accept(Bar.class);
Foo foo2 = (Foo) stream.readObject();
System.out.println(foo2);
}
}
public static class Foo implements Serializable {
private String name;
private Bar bar;
public Foo(String name, Bar bar) {
this.name = name;
this.bar = bar;
}
@Override
public String toString() {
return "Foo{"
"name='" name '''
", bar=" bar
'}';
}
}
public static class Bar implements Serializable {
private String name;
public Bar(String name) {
this.name = name;
}
@Override
public String toString() {
return "Bar{"
"name='" name '''
'}';
}
}
}
Комментарии:
1. Привет, спасибо, я воспользовался вашим предложением и могу успешно проверить классы! 😀 Однако Fortify по-прежнему не помечает проблему как исправленную. Я обновил описание дополнительными фрагментами. Я также обновил строки, вызывающие небезопасную десериализацию. Есть ли что-нибудь еще, что мы можем сделать в методе контроллера
verify()
для проверкиrequest
?