2014-12-12 1 views
0

Я использую klocwok для просмотра своего кода. Для данной строки кода:SV.DOS.ARRSIZE: неутвержденный пользовательский ввод 'sigFileInputStream.available()' в Klocwork для следующей строки

byte sigToVerify = new byte[sigFileInputStream.available()]; 

я получаю следующее сообщение об ошибке:

SV.DOS.ARRSIZE: непроверенные ввод данных пользователем sigFileInputStream.available() используется для размера массива - злоумышленник может указать что приводит к большому использованию ресурсов на сервере и атаке DOS

Пожалуйста, помогите мне решить эту проблему.

ответ

0

Без дополнительного фрагмента кода, чтобы продолжить, я думаю, что Klocwork сообщает о действительной проблеме здесь. Вы должны просмотреть документацию, предоставленную для проверки SV.DOS.ARRSIZE, что объясняет, почему это сообщается. На уязвимости и риски:

Использование данных из другого приложения должно проверяться до использования приложения. Если эти данные используются для распределения массивов объектов в приложении, то содержимое данных должно быть близко к . Атакующие могут использовать эту уязвимость, чтобы заставить приложение выделить очень большое количество объектов, что приведет к высокому использованию ресурсов на сервере приложений и потенциалу для условия отказа в обслуживании (DoS). .

На смягчении и предотвращения:

Предотвращение DoS-атаки из пользовательского ввода может быть достигнуто путем проверки любые и все входной извне приложения (пользовательский ввод, входа файла, системные параметры и т. Д.). Валидация должна включать длину и содержание. ... Данные, используемые для распределения, также должны быть проверены на допустимые значения , предполагая, что пользовательский ввод может содержать очень мало или очень большие значения.

Даже Java InputStream API документы (из которых FileInputStream является подклассом) предупреждают, что с помощью возвращаемого значения метода available() плохая идея:

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

пример того, как исправить код, чтобы избежать этого было бы, как было предложено выше, проверить значение, возвращенное available(), прежде чем использовать его, чтобы выделить массив:

int buffSize = sigFileInputStream.available(); 
if (buffSize > 0 && buffSize < 100000000) { // 100MB 
    byte sigToVerify = new byte[buffSize]; 
    // do something with sigToVerify ... 
} else { 
    // error 
} 

Обратите внимание, что 100000000 или 100 МБ для sigToVerify все еще может быть слишком большим для ваших целей, или он может быть слишком маленьким. Вы должны определить наиболее разумное значение для использования здесь в зависимости от того, что пытается выполнить ваш код.