2009-03-10 6 views
5

우리는이 코드 라인에 대한 커버 리티 버그가 나는 CONST에 testStrings을 변경현재 snprintf 형식 문자열 보안 취약점 문제

non_const_printf_format_string: "format string is not a string literal, 
potential security vulnerability if user controlled" 

을,하지만하지 않았다 do do do :

static const char *testStrings[] = {"1", ... etc}; 

이 오류의 실제적인 의미는 무엇입니까?

답변

10

코드는 문제가 없습니다.

사용자가 printf 형식 문자열로 제어하는 ​​문자열을 전달하면 보안 버그가 발생할 수 있다는 점이 문제입니다. 예를 들어

, 사용자 이름이 사용자가 제공된다 printf(userName);

는 사용자가 초래할 수있는 '% s'을 (를) 통과 및 스택에 임의의 주소 데이터에 액세스 시작하는 함수를 얻을 수 있습니다 추락. printf는 스택에서 추가 매개 변수를 제거하려고 시도하여 스택 손상을 초래합니다. 이와 같은 서비스 거부 공격은 아마도 최상의 경우 일 수 있습니다. 스택에 값을 덤프하도록 printf를 가져와 정보를 공개 할 수 있으며 printf 스타일 함수를 가져 와서 스택의 반환 주소를 수정할 수도 있습니다.

문자열이 사용자가 제어 할 수 없기 때문에이 메시지를 무시해도 안전합니다. 일반적인 픽스는 내가 printf("%s", userName);으로 주었던 printf 예제를 대체하는 것으로, const 문자열에 형식 문자열이 포함되어 있기 때문에 도움이 안되는 것 같습니다.

위키 피 디아는 형식 문자열 취약점에 대해 자세히 알고 있습니다. http://en.wikipedia.org/wiki/Format_string_vulnerabilities

2

testStrings[testID]의 값은 어떻게 든 추가 형식 지정자를 포함하도록 변경할 수 있습니다.

snprintf()은 매개 변수 개수가 형식 지정자 수와 일치하는지 확인할 수 없기 때문에 다음 형식 지정자의 값으로 사용하기 위해 다음 주소를 스택에서 가져오고 이상한 일이 발생할 수 있습니다.

format string attack으로 알려져 있습니다.