Формирование журнала JVM

JVM Log Forging

1. обзор

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

2. Что такое ковка бревен?

СогласноOWASP, подделка журнала является одним из наиболее распространенных методов атаки.

Уязвимости подделки журналов возникают, когда данные поступают в приложение из ненадежного источника или данные записываются в файл журнала приложения / системы каким-либо внешним объектом.

СогласноOWASP guidelines, подделка или внедрение журнала - это метод записи непроверенных данных, вводимых пользователем, в файлы журнала, чтобы злоумышленник мог подделать записи журнала или внедрить в журналы вредоносное содержимое.

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

3. пример

Рассмотрим пример, когда пользователь отправляет запрос на оплату из Интернета. На уровне приложения, как только этот запрос будет обработан, одна запись будет зарегистрирована с суммой:

private final Logger logger
  = LoggerFactory.getLogger(LogForgingDemo.class);

public void addLog( String amount ) {
    logger.info( "Amount credited = {}" , amount );
}

public static void main( String[] args ) {
    LogForgingDemo demo = new LogForgingDemo();
    demo.addLog( "300" );
}

Если мы посмотрим на консоль, мы увидим что-то вроде этого:

web - 2017-04-12 17:45:29,978 [main]
  INFO  com.example.logforging.LogForgingDemo - Amount credited = 300

Теперь предположим, что злоумышленник предоставил ввод как“ web – 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully”,, тогда журнал будет:

web - 2017-04-12 17:52:14,124 [main] INFO  com.example.logforging.
  LogForgingDemo - Amount credited = 300

web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully

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

4. профилактика

Наиболее очевидное решение - не записывать ввод данных пользователем в файлы журналов.

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

Мы должны использовать какую-то другую альтернативу для решения такого сценария.

4.1. Ввести валидацию

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

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

4.2. Ведение журнала базы данных

Другой вариант - записать данные в базу данных. Это более безопасно, чем другой подход, поскольку‘ ' или новая строка ничего не значат в этом контексте. Однако это вызовет еще одну проблему с производительностью, поскольку для регистрации пользовательских данных будет использоваться огромное количество соединений с базой данных.

Более того, этот метод представляет другую уязвимость системы безопасности, а именноSQL Injection. Чтобы справиться с этим, мы могли бы написать много дополнительных строк кода.

4.3. ESAPI

ИспользованиеESAPI - наиболее распространенный и рекомендуемый метод в этом контексте. Здесь все пользовательские данные кодируются перед записью в журналы. ESAPI - это API с открытым исходным кодом, доступный изOWASP:


    org.owasp.esapi
    esapi
    2.1.0.1

Он доступен вCentral Maven Repository.

Мы можем закодировать данные, используя интерфейсESAPI ’sEncoder:

public String encode(String message) {
    message = message.replace( '\n' ,  '_' ).replace( '\r' , '_' )
      .replace( '\t' , '_' );
    message = ESAPI.encoder().encodeForHTML( message );
    return message;
}

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

В предыдущем примере, если мы закодируем сообщение с помощью этой функции-оболочки, журнал должен выглядеть примерно так:

web - 2017-04-12 18:15:58,528 [main] INFO  com.example.logforging.
  LogForgingDemo - Amount credited = 300
__web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully

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

Важно отметить, что для использованияESAPI нам нужно включить файлESAPI.properties в путь к классам, иначе APIESAPI выдаст исключение во время выполнения. Доступноhere.

5. Заключение

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

Как всегда, полный исходный код доступен наover on GitHub.