Log forging в Java

Все мы пишем что-то в лог. Если строки для лога генерируются внутри программы, то проблем нет. Давайте рассмотрим случай, когда мы пытаемся залогировать строку пришедшую извне. Допустим, это будет ответ HTTP REST сервера:

На первый взгляд тут не происходит ничего страшного. Если response будет содержать просто JSON или XML, то действительно ничего страшного не произойдёт.

Представьте теперь, что злоумышленник составит ответ вот таким образом:

Что мы здесь видим?

Во первых, мы видим попытку атаки XSS (Cross-Site Scripting). Если мы запишем этот ответ в лог точно таким же, каким он к нам пришёл, то при попытке открытия файла лога каким-нибудь просмотрщиком, поддерживающим HTML и уязвимым к XSS, произойдёт нечто ужасное, так как будет выполнен скрипт “myhackerscript.js”.

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

Основная причина: Мы не проверяем пользовательский ввод и данные, полученные извне.

Как исправить?

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

Никогда не забывайте проверять данные, полученные из внешних источников.

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

Иногда неправильный парсинг XML тоже может стать дырой в безопасности, что тоже относится к проблеме проверки введённых пользователем данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *