2014-12-12 2 views
0

내 코드를 검토하기 위해 klocwok를 사용하고 있습니다. 가 지정할 수 있습니다 공격자 - 배열 크기에 사용되지 않은 사용자 입력 sigFileInputStream.available() :SV.DOS.ARRSIZE : 다음 라인의 Klocwork에서 유효하지 않은 사용자 입력 'sigFileInputStream.available()'

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

나는 다음과 같은 오류 보고서 점점 오전 :

SV.DOS.ARRSIZE을 코드의 특정 라인에 대한 많은 수의 서버에서 리소스 사용량이 많음 및 DOS 공격

이 문제를 해결하는 데 도움을주십시오.

답변

0

계속 진행할 코드 스 니펫이 없으면 Klocwork에서 유효한 문제를보고한다고 생각합니다. SV.DOS.ARRSIZE 검사기에 제공된 설명서를 검토하여 이것이 왜보고되는지 설명해야합니다. 취약점 및 위험에서 :

응용 프로그램 외부에서 데이터의 사용은 응용 프로그램에 의해 사용하기 전에 확인해야

. 이 데이터를 사용하여 응용 프로그램에 개체의 배열을 할당하는 경우 데이터의 내용은 밀접하게 이어야합니다. 공격자는이 취약점을 악용하여 응용 프로그램이 매우 많은 수의 개체를 할당하도록하여 응용 프로그램 서버에서 리소스 사용량이 높은 이되고 서비스 거부 (DoS) 조건이 발생할 수 있습니다. 완화 및 예방에서

:

사용자 입력에서 DoS 공격의 방지가 애플리케이션 외부에서 확인하는 임의의 모든 입력 에 의해 달성 될 수

(사용자 입력 파일 입력, 시스템 매개 변수 등). 유효성 검사에는 길이가 이고 내용이 포함되어야합니다. ... 사용자 입력에 매우 작은 또는 매우 큰 값을 포함 할 수 있다고 가정 할 때 할당에 사용되는 데이터도 합리적인 값인지 확인해야합니다. 의 InputStream의 일부 구현이 반환됩니다 동안 것을

참고 :

심지어 자바 InputStream API 워드 프로세서 (이 중 FileInputStream에이 서브 클래스)가 available() 메서드의 반환 값을 사용하는 것은 나쁜 생각이라고 경고 스트림의 총 바이트 수는 많지 않습니다. 이 메서드의 반환 값을 사용하여이 스트림의 모든 데이터를 유지하기위한 버퍼 을 할당하면 안됩니다.

배열을 할당하는 데 사용하기 전에 available()에 의해 반환 된 값의 유효성을 검사, 위의 제안이,하는 것 피하기 위해 코드를 수정하는 방법의 예 :

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

주 100,000,000을 그 또는 sigToVerify의 경우 100MB는 여전히 용도에 비해 너무 길 수도 있고 너무 작을 수도 있습니다. 코드에서 수행하려고하는 것을 토대로 여기에서 사용할 가장 정상적인 값을 결정해야합니다.