2009-03-10 19 views
5

Mamy bug coverity dla tej linii kodu:snprintf luka w zabezpieczeniach Format String problem

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

Błąd mówi:

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

zmieniłem testStrings do const, ale które nie zrób wszystko:

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

Jakieś pomysły dotyczące tego, co naprawdę mówi ten błąd?

Odpowiedz

10

Twój kod jest w porządku.

Problem polega na tym, że jeśli przekazujesz ciąg, który jest kontrolowany przez użytkownika jako ciąg formatu printf, mogą pojawić się błędy bezpieczeństwa.

Na przykład printf(userName);

gdzie nazwa_użytkownika jest dostarczane przez użytkownika, użytkownik może przechodzić „% S”, i uzyskać dostęp do funkcji, aby rozpocząć dostępu do danych w sposób losowy adres na stosie, które mogłyby spowodować wypadek. printf spróbuje usunąć dodatkowe parametry ze stosu, powodując uszkodzenie stosu. Atak typu Denial of Service jest prawdopodobnie najlepszym przypadkiem, informacje można ujawnić, pobierając printf, aby zrzucać wartości na stosie, a istnieją nawet sposoby na uzyskanie funkcji stylu printf w celu zmodyfikowania adresu zwrotnego na stosie.

Ponieważ twoje struny nie są kontrolowane przez użytkownika, możesz zignorować tę wiadomość. Typową poprawką jest zastąpienie przykładu printf podanego przy pomocy printf("%s", userName);, co nie wydaje się pomocne w twoim przypadku, ponieważ ciągi stałych wydają się zawierać ciągi formatów.

Wikipedia zawiera więcej informacji o podatności na format ciągu znaków: http://en.wikipedia.org/wiki/Format_string_vulnerabilities

2

Pomysł polega na tym, że wartość testStrings[testID] może być w jakiś sposób zmieniona tak, aby zawierała specyfikatory formatu.

Ponieważ snprintf() nie ma możliwości sprawdzenia, czy liczba parametrów jest zgodna z liczbą specyfikatorów formatu, wystarczy, że następny adres ze stosu zostanie użyty jako wartość dla następnego specyfikatora formatu i wtedy mogą się dziać dziwne rzeczy.

Znany jest pod nazwą format string attack.