문제

우리는이 코드 라인에 대한 표지 버그가 있습니다.

snprintf( tempStr, size, testStrings[testID], A2DtoV(testResults[testID].value),
A2DtoV(testResults[testID].min),A2DtoV(testResults[testID].max));

오류는 말한다 :

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

나는 테스트 스트링을 Const로 바꾸었지만 아무것도하지 않았다.

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

이 오류가 실제로 무슨 말을하는지에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

코드는 괜찮습니다.

문제는 사용자가 printf 형식 문자열로 제어되는 문자열을 전달하면 보안 버그가 발생할 수 있다는 것입니다.

예를 들어, printf(userName);

사용자가 사용자 이름을 제공하는 경우 사용자는 "%s"를 전달하고 스택의 임의 주소로 데이터에 액세스하기 시작하여 충돌이 발생할 수 있습니다. Printf는 스택에서 추가 매개 변수를 팝하려고 시도하여 스택 손상을 초래합니다. 이와 같은 서비스 거부 공격은 아마도 가장 좋은 경우 일 것입니다. Printf가 스택에 값을 버리도록하여 정보를 공개 할 수 있으며 Stack의 리턴 주소를 수정하기 위해 Printf 스타일 기능을 얻는 방법도 있습니다.

문자열이 사용자 제어되지 않으므로이 메시지를 무시하는 것이 안전합니다. 일반적인 수정은 내가 준 Printf 예제를 대체하는 것입니다. printf("%s", userName);, Const 문자열에는 형식 문자열이 포함되어 있기 때문에 귀하의 경우에 도움이되지 않는 것처럼 보입니다.

Wikipedia는 문자열 취약점에 대한 자세한 내용이 있습니다. http://en.wikipedia.org/wiki/format_string_vulnerabilities

다른 팁

아이디어는 그 가치입니다 testStrings[testID] 추가 형식 지정자를 포함하도록 어떻게 든 변경할 수 있습니다.

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

그것은 문자열 공격 형식.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top