2009-03-10 16 views
5

Abbiamo un bug Coverity per questa riga di codice:snprintf problema vulnerabilità di sicurezza Format String

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

L'errore dice:

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

ho cambiato testStrings ad un const, ma che non ha fare qualsiasi cosa:

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

Qualche idea su ciò che questo errore sta realmente dicendo?

risposta

10

Il tuo codice è a posto.

Il problema è che se si passa una stringa che è controllata dall'utente come una stringa di formato printf, possono insorgere problemi di sicurezza.

Per esempio, printf(userName);

dove username è fornito dall'utente, un utente può passare "% s", e ottenere la vostra funzione per avviare l'accesso ai dati in un indirizzo casuale nello stack, che potrebbe tradursi in un crash. printf proverà a escludere altri parametri dallo stack, causando un danneggiamento dello stack. L'attacco denial of service come questo è probabilmente il migliore, le informazioni possono essere rivelate facendo in modo che printf esca i valori nello stack e ci sono persino modi per ottenere funzioni in stile printf per modificare l'indirizzo di ritorno nello stack.

Poiché le stringhe non sono controllate dall'utente, è possibile ignorare questo messaggio. La tipica soluzione è quella di sostituire l'esempio printf che ho dato con printf("%s", userName);, che non sembra essere d'aiuto nel tuo caso perché le stringhe const sembrano contenere stringhe di formato.

Wikipedia ha più sul formato vulnerabilità delle stringhe qui: http://en.wikipedia.org/wiki/Format_string_vulnerabilities

2

L'idea è che il valore di testStrings[testID] può essere modificato in qualche modo per includere specificatori di formato extra.

Poiché non ha la possibilità di controllare se il numero di parametri corrisponde al numero di specificatori di formato, sarà sufficiente prendere il prossimo indirizzo dallo stack per utilizzarlo come valore per il prossimo specificatore di formato e potrebbero accadere cose strane.

È noto come format string attack.