Как исправить подделку логов в C#

Я использую Log4net для входа в свое приложение веб-API. Я использую приведенный ниже код для регистрации предупреждений и ошибок в базе данных.

public async Task<int> ExecuteNonQuery(string procedureName,params SqlParameter[] parameters)
{
try
{
  this.logger.DebugFormat("{0} stating call",procedureName);
  ......
  ......
  ......
}

further code

Когда я запустил сканирование fortify, у меня возникла проблема с подделкой журнала. Есть ли идеи, как мы можем решить эту проблему. Я пробовал код ниже, но не работал

  procedureName = Regex.Replace(procedureName, "[^ A - Za - z0 - 9 $]", string.Empty);

person user1770461    schedule 12.12.2017    source источник
comment
Какую именно ошибку вы получаете?   -  person timothyclifford    schedule 12.12.2017
comment
На самом деле укрепление сообщает о проблеме высокого уровня в том, что говорит «Подделка журнала», а в подробностях говорится: «Злоумышленник может воспользоваться этим поведением для подделки записей журнала или внедрения вредоносного содержимого в журнал».   -  person user1770461    schedule 12.12.2017
comment
А procedureName всегда предоставляется вами? Я имею в виду, что вы не разрешаете пользователям указывать это имя?   -  person Evk    schedule 12.12.2017
comment
Нет, мы не позволяем пользователю вводить это.   -  person user1770461    schedule 12.12.2017
comment
Тогда это ложноположительный результат. Я ничего не знаю о фортификации, поэтому не знаю, как об этом рассказать.   -  person Evk    schedule 12.12.2017


Ответы (2)


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

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

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

person Seafish    schedule 23.01.2018

Ответ от Seafish может быть немного сложным для анализа. Для этого я попытаюсь ответить на этот вопрос.

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

Резолюции обычно являются одним или несколькими из следующих:

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

Последнее предложение больше похоже на то, что Fortify, скорее всего, не поймет, поэтому я рекомендовал сделать это в сочетании с первым решением. Точно так же, как использование двойных кавычек для цитирования кого-то, вы можете использовать серию квадратных скобок вокруг значений в журналах, чтобы усложнить подделку, а также даже зашифровать дату/время в каждой строке и использовать их для начала строки, чтобы вы может подтвердить, что начало строки находится там, где у вас есть правильно расшифрованные дата/время, совпадающие с датой/временем в выходном сообщении.

person Kenneth Salomon    schedule 23.07.2019