Исправление подделки журнала

Я использую Fortify SCA, чтобы найти проблемы с безопасностью в моем приложении (в качестве домашней работы в университете). Я столкнулся с некоторыми проблемами "подделки журналов", от которых я не могу избавиться.

По сути, я регистрирую некоторые значения, которые поступают как пользовательский ввод из веб-интерфейса:

logger.warn("current id not valid - " + bean.getRecordId()));

и Fortify сообщает об этом как о проблеме подделки журналов, потому что getRecordId() возвращает пользовательский ввод.

Я следил за этой статьей, и я заменяю "новую строку" пробелом, но проблема все еще сообщается

logger.warn("current id not valid - " + Util.replaceNewLine(bean.getRecordId()));

Кто-нибудь может предложить способ исправить эту проблему?

4 ответа

Решение

Алина, я на самом деле автор статьи, которую вы использовали для решения проблемы с инъекцией журнала. Надеюсь, это было полезно.

Виталий прав в отношении фортификации. Вам нужно будет создать то, что Fortify называет "пользовательским правилом".

Скорее всего, это будет правило очистки потока данных. Базовый пример можно найти здесь: http://www.cigital.com/newsletter/2009-11-tips.php. Если вы владеете Fortify, в документации вашего продукта должно быть руководство по написанию пользовательских правил.

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

Я знаю, что на это уже ответили, но я подумал, что пример будет хорошим:)

<?xml version="1.0" encoding="UTF-8"?>
<RulePack xmlns="xmlns://www.fortifysoftware.com/schema/rules">
  <RulePackID>D82118B1-BBAE-4047-9066-5FC821E16456</RulePackID>
  <SKU>SKU-Validated-Log-Forging</SKU>
  <Name><![CDATA[Validated-Log-Forging]]></Name>
  <Version>1.0</Version>
  <Description><![CDATA[Validated-Log-Forging]]></Description>
  <Rules version="3.14">
    <RuleDefinitions>
      <DataflowCleanseRule formatVersion="3.14" language="java">
        <RuleID>DDAB5D73-8CF6-45E0-888C-EEEFBEFF2CD5</RuleID>
        <TaintFlags>+VALIDATED_LOG_FORGING</TaintFlags>
        <FunctionIdentifier>
          <NamespaceName>
            <Pattern/>
          </NamespaceName>
          <ClassName>
            <Pattern>Util</Pattern>
          </ClassName>
          <FunctionName>
            <Pattern>replaceNewLine</Pattern>
          </FunctionName>
          <ApplyTo implements="true" overrides="true" extends="true"/>
        </FunctionIdentifier>
        <OutArguments>return</OutArguments>
      </DataflowCleanseRule>
    </RuleDefinitions>
  </Rules>
</RulePack>

Вам нужно пометить ваш replaceNewLine как дезинфицирующее средство в Fortify (если я правильно помню), и он перестанет сообщать о проблеме.

Фактически вы можете создать новое правило из определенного метода.

После сканирования перейдите к функции в правой части инструмента аудита. Найдите свой метод очистки и щелкните его правой кнопкой мыши.

Из него можно сгенерировать правило. Вам нужно общее правило DataflowCleanseRule.

Я просто сделал это на основе xml, опубликованного выше. Вы можете сохранить правило в виде файла .xml. При обновлении сканирования вы можете передать аргумент -rule и указать на файл .xml.

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