Ошибка CWE 73 - приложение Veracode Issue -.net

У меня возникла проблема с назначением Veracode Scanner в моем проекте. Я создал функцию для проверки файла, но она не прошла через сканер веракода;

Вот код моей функции:

    public static string GetSafeFileName(string fileNameToValidate)
    {
        fileNameToValidate= fileNameToValidate.Replace("'", "''").Replace(@"../", "").Replace(@"..\", "");
        char[] blackListChars = System.IO.Path.GetInvalidPathChars();
        char[] blackListFilename = System.IO.Path.GetInvalidFileNameChars();

        foreach (var invalidChar in blackListChars)
        {
            if (fileNameToValidate.Contains(invalidChar))
            {
                fileNameToValidate = fileNameToValidate.Replace(invalidChar, ' ').Trim();
            }
        }

        string fullPath = Path.GetFullPath(fileNameToValidate);

        string directoryName = Path.GetDirectoryName(fullPath);
        string fileName = Path.GetFileName(fullPath);

        foreach (var invalidChar in blackListFilename)
        {
            if (fileName.Contains(invalidChar))
            {
                fileName = fileName.Replace(invalidChar, ' ').Trim();
            }
        }

        string finalPath = Path.Combine(directoryName, fileName);
        return finalPath;

    }

Какие изменения нужно внести, чтобы исправить встречу cwe 73 в сканере Veracode? Кто-нибудь может мне помочь?

Мой проект - это формы Windows, работающие на .net 4.0

Спасибо,

Бруно


person user3149261    schedule 26.01.2018    source источник


Ответы (2)


Я попытался решить аналогичную проблему, но в контексте Java. Мы использовали ESAPI как внешнюю библиотеку. Вы можете просмотреть проект esapi (чтобы узнать, как реализовать лучшее решение в своем проекте): https://github.com/ESAPI/esapi-java-legacy

На самом деле использование валидатора esapi не решило проблему с veracode, но, на мой взгляд, снизило риск атаки. С такой библиотекой вы можете гарантировать, что пользователь не может читать файл из родительской папки (вы должны жестко закодировать такой каталог) и что пользователь не может читать файл с несоответствующим расширением -> вы можете добавить такой список с расширениями файлов . Но эта библиотека не может гарантировать, что вы не можете манипулировать файлами в родительском каталоге с разрешенными расширениями.

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

Также, если вы думаете, что создали хорошую проверку пути к файлу, вы можете использовать аннотацию очистителя, чтобы отметить свой метод. Здесь вы можете узнать больше о пользовательских очистителях https://help.veracode.com/reader/DGHxSJy3Gn3gtuSIN2jkRQ/xrEjru~XmUHpO6~0FSae2Q

person xyz    schedule 16.02.2018

Ваша проблема в том, что Veracode на самом деле не определяет, что делает ваш код, он определяет, какая функция очистки вызывается (или не вызывается). Если вы войдете в Veracode и выполните поиск справки в разделе «Поддерживаемые функции очистки», вы найдете список, обнаруженный на вашем языке.

К сожалению, в списке для .Net нет ничего для CWE-73.

Итак, ваше решение - специально обозначить вашу функцию как очиститель для CWE-73, используя специальную аннотацию очистителя. Поищите в справке Veracode "Аннотирование пользовательских очистителей".

using Veracode.Attributes;

[FilePathCleanser]
public static string GetSafeFileName(string fileNameToValidate)
   {
    ...

Тем не менее, ваша реализация небезопасна. Попробуйте передать "C: \ Windows \ System32 \ notepad.exe" в качестве имени файла для записи, и вы увидите проблему.

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

person CarryWise    schedule 16.04.2018
comment
Отличный пост, это указывало мне в правильном направлении, но я думаю, что атрибут немного неправильный и должен быть FilePathCleanser, согласно этому сообщению на веб-сайт veracode - person Steve Goodman; 20.12.2018
comment
Спасибо, Стив, радости вырезания и вставки. - person CarryWise; 29.05.2019