Пожалуйста, помогите Veracode выпустить CWE 15 External Control of System or Configuration Setting n имя файла

Veracode выдает ошибку CWE 15:

Описание: Этот вызов system_data_dll.System.Data.OleDb.OleDbConnection.!newinit_0_1() позволяет внешнему управлению ›настройками системы. Аргумент функции строится с использованием ненадежных входных данных, что может нарушить работу службы или привести к непредвиденному поведению приложения. Первый аргумент !newinit_0_1() содержит испорченные данные. Испорченные данные ›были получены из более ранних вызовов system_web_dll.System.Web.HttpRequest.get_Files, ›system_data_dll.System.Data.SqlClient.SqlCommand.ExecuteScalar и system_web_dll.System.Web.HttpContext.get_User.

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

Я разрешаю веб-пользователям загружать файл через IHttpHandler в vb.net (веб-формы), который временно сохраняется во время обработки файла. Чтобы имя файла было уникальным, я добавляю context.user.identity.name в начало файла. Я не уверен, как это будет считаться ненадежным вводом или как его можно изменить.

Пользователи этой системы ограничены 6-символьным идентификатором, который должен начинаться с буквенного символа, а остальные 5 являются буквенно-цифровыми. У меня есть скруббер регулярных выражений в поле, прежде чем оно будет добавлено к имени локального файла. Я также проверяю, что пользователь аутентифицирован.

Я более чем обеспокоен, если это проблема доверия к аутентифицированному идентификатору пользователя. Очевидно, я мог бы выбрать какой-то другой способ добавления переменной перед файлом (но это усложнило бы отслеживание файлов, если что-то взорвалось).

dim wkId as string = "xxxxxx"
if context.User.Identity.IsAuthenticated then
    wkId = ScrubWkId(context.User.Identity.Name)
end if
For i = 0 To context.Request.Files.Count - 1
        controlName = context.Request.Form("controlName" & Trim(Str(i)))
        sFile = context.Request.Files.Get(i)
        If SharedCode.Common.Utilities.MimeTypeIsAllowed(sFile.FileName) Then
            Select Case action
                Case "dataload" 'only expect a single file on a dataload
                    'sFile = context.Request.Files.Get(i)
                    a = InStrRev(sFile.FileName.ToString, "\")
                    b = wkId & Right(sFile.FileName.ToString, sFile.FileName.ToString.Length - a)

                    Dim wkFile As String = GetFileUploadPath(context) & MakeValidFileName(b)
                    sFile.SaveAs(wkFile)

person Roger Corrin    schedule 22.08.2019    source источник


Ответы (1)


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

Public Shared Function generateTempFile(ByVal sfileName As String) As String

    Dim wkFilePrepend As String = "d" & DateTime.Now.ToString("yyyyMMddHHmmss") & "_" & Guid.NewGuid().ToString()
    Select Case Path.GetExtension(sfileName).ToUpper
        Case ".XLS"
            wkFilePrepend = wkFilePrepend & ".xls"
        Case ".XLSX"
            wkFilePrepend = wkFilePrepend & ".xlsx"
        Case ".TXT"
            wkFilePrepend = wkFilePrepend & ".txt"
        Case ".CSV"
            wkFilePrepend = wkFilePrepend & ".csv"

    End Select
    Return wkFilePrepend
End Function
person Roger Corrin    schedule 27.08.2019