Как исправить «нарушение границы доверия - проблема безопасности» в Coverity (инструмент безопасности, похожий на veracode) в сервлете? - PullRequest
1 голос
/ 25 сентября 2019

При сканировании файла появляется следующая проблема безопасности:

«Использование« испорченных данных »« значение »в контексте, который часто считается заслуживающим доверия, поскольку доверенные данные не могут быть проверены или очищеныэти данные могут быть ошибочно использованы небезопасным образом. "

Я попытался исправить тремя способами, как показано ниже, но безуспешно, поскольку проблема безопасности все еще отображается в той же строке после повторного сканирования файла.

1) String value = request.getParameter(key);   
    if(value.matches("[0-9a-zA-Z_]+"){  
       if (key.startsWith("BOOKMARK"))
           book.put(key, value);
       else     
          session.setAttribute(key, value);
       }

2) String value = request.getParameter(key);  
    ESAPI.validator().getValidInput("Value", value, "valuePattern", 100,  false);
    if (key.startsWith("BOOKMARK"))             
        book.put(key, value);       
    else            
        session.setAttribute(key, value);
                }

3)String value = request.getParameter(key);
    if (session.getAttribute(key) != null) { 
       if (key.startsWith("BOOKMARK"))  
           book.put(key, value);
       else   
           session.setAttribute(key, value);
    }

Ниже приведен фрагмент кода и проблема безопасности в этой строке.

session.setAttribute (ключ, значение);

private Bookmark cacheRequest(HttpServletRequest request) {
        String key;
        Bookmark book = new Bookmark();
        HttpSession session = request.getSession();
        Enumeration enumVar = request.getParameterNames();
        System.out.println("after  enumVar creation");
        try {
            while (enumVar.hasMoreElements()) {
                key = (String) enumVar.nextElement();

                String value = request.getParameter(key);

                if (key.startsWith("BOOKMARK"))
                    book.put(key, value);
                else
                    session.setAttribute(key, value); //flaw
            }

        } catch (java.lang.NegativeArraySizeException value) {
        }
return book;
    }

Я не ожидал "испорченного" значения, которое приходит из запроса Http в этой строке

session.setAttribute(key, value);

1 Ответ

0 голосов
/ 27 сентября 2019

Здесь есть два пути:

1.) Подтверждение ввода, которое ваш вызов в №2 покрывает проверкой ESAPI.(Не уверен, какой валидатор вы там захватываете!)

2.) Передача на другой слой.В этом случае вы устанавливаете его в сеансе, который будет оставаться на сервере.Дисциплина, которую вам нужно использовать для успешного решения этой проблемы (и других подобных ей, таких как SQL-инъекция или XSS), заключается в том, чтобы отслеживать ваш путь к данным и спрашивать себя каждый раз, когда вы собираетесь обрабатывать эти данные: «Передается ли это?от переводчика? "

Каждый раз, когда ответ" да ", вы избегаете ввода для этого контекста.В вашем случае, где еще я использую это значение сеанса в моем коде?Если вы затем передаете его в запрос SQL, вы используете утилиты ORM или PreparedStatements, если вы делаете прямой доступ к базе данных.Во внешнем интерфейсе, если это значение когда-либо будет передано обратно для отображения пользователем, вам нужно также избегать использования соответствующих контекстов: если вы создаете одностраничное веб-приложение, которое вы хотите кодировать для Javascript / JSON,или если это ajax, XML / HTML и т. д.

Короче говоря, каждый раз, когда ваша «граница доверия» пересекается, вас просят оценить, передается ли ваше входное значениепереводчик.Если да, кодируйте, если нет, игнорируйте.Если это помогает, наметьте ВСЕ интерпретаторы, которые есть в вашем приложении, и убедитесь, что у вас постоянно есть стратегия для каждой руки.С небольшой практикой это становится второй натурой.

...