Не удалось решить проблему Fortifing Log Forging

У меня проблемы с исправлением проблемы с подделкой журналов в Fortify. Проблема "записывает неподтвержденный пользовательский ввод в журнал" возникает из-за обоих вызовов ведения журнала в методе getLongFromTimestamp().

public long getLongFromTimestamp(final String value) {
    LOGGER.info("getLongFromTimestamp(" + cleanLogString(value) + ")");

    long longVal = 0;
    Date tempDate = null;
    try {            
        tempDate = new SimpleDateFormat(FORMAT_YYYYMMDDHHMMSS, Locale.US).parse(value);
    } catch (ParseException e) {
        LOGGER.warn("Failed to convert to Date: " + cleanLogString(value) + " Exception: " + cleanLogString(e.getMessage()));
        throw new Exception(e);
    }

    if (tempDate != null) {
        longVal = tempDate.getTime();
    }
    return longVal;
}

private cleanLogString(String logString) {
    String clean = logString.replaceAll("[^A-Za-z0-9]", "");

    if(!logString.equals(clean)) {
        clean += " (CLEANED)";
    }

    return clean;
}

Метод cleanLogString() исправил другие проблемы с Forging Logging Fortify в моем проекте, однако он не влияет на 2 выше.

Любая помощь будет оценена!

4 ответа

Решение

Первоначально, когда этот вопрос был написан, наша команда использовала log4j v1.2.8, однако мы заметили, что все проблемы с подделкой журналов исчезли после обновления до log4j v2.6.2.

После обновления версии log4j проблемы с подделкой журналов Fortify должны исчезнуть. Метод cleanLogString() из приведенного выше вопроса также не нужен. Например:

LOGGER.info("getLongFromTimestamp(" + value + ")");

Можно использовать аннотации fortify Java, чтобы сообщить Fortify, что данные, возвращаемые функцией очистки, теперь безопасны.

При рассмотрении проблем с подделкой журналов у меня были строки, поступающие через веб-API, и, таким образом, флаги XSS а также WEB на моих струнах. Я пытался найти аннотации, которые бы убрали только эти флаги, но не смог найти способ удалить WEB флаг. Единственная документация, которую я нашел, это Samples/advanced/javaAnnotation каталог.

Поскольку мой метод очистки выполняет очистку строк, я решил удалить все флаги. Это может быть проблемой, поскольку может скрывать нарушения конфиденциальности.

@FortifyValidate("return")
private String sanitizeString(String taintedString) {
    return doSomethingWithTheString(taintedString);
}

Я знаю, что сталкивался с ситуациями, когда сложность моего приложения не позволяла любому вредоносному вводу работать должным образом; Fortify не считает это безопасным. Бьюсь об заклад, вы сталкиваетесь с тем же.

Вы удаляете любые действительно полезные символы из сообщения журнала, но посмотрите, что произойдет, если вы сделаете некоторую кодировку на выходе перед записью в журнал.

http://www.jtmelton.com/2010/09/21/preventing-log-forging-in-java/

// ensure no CRLF injection into logs for forging records
String clean = message.replace( '\n', '_' ).replace( '\r', '_' );
if ( ESAPI.securityConfiguration().getLogEncodingRequired() ) {
    clean = ESAPI.encoder().encodeForHTML(message);
    if (!message.equals(clean)) {
        clean += " (Encoded)";
    }
}

Использование reflect или же try-catch, Его легко обмануть, укрепить.

Другие вопросы по тегам