Динамическая оценка кода: небезопасная десериализация при SerializationUtils.clone()

#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 ?