Не удалось решить проблему 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
, Его легко обмануть, укрепить.