Domanda

Abbiamo un bug di Coverity per questa riga di codice:

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 in una const, ma questo non ha fatto nulla:

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

Qualche idea su cosa stia realmente dicendo questo errore?

È stato utile?

Soluzione

Il tuo codice va bene.

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

Ad esempio, printf(userName);

Laddove userName sia fornito dall'utente, un utente può passare "% s" e ottenere la funzione per iniziare ad accedere ai dati da un indirizzo casuale nello stack, che potrebbe causare un arresto anomalo. printf proverà a rimuovere parametri aggiuntivi dallo stack, causando un danneggiamento dello stack. L'attacco denial of service come questo è probabilmente il caso migliore, le informazioni possono essere divulgate facendo in modo che printf scarichi valori nello stack e ci sono anche modi per ottenere funzioni di stile printf per modificare l'indirizzo di ritorno nello stack.

Dato che le tue stringhe non sono controllate dall'utente, è sicuro ignorare questo messaggio. La correzione tipica è quella di sostituire l'esempio printf che ho dato con printf ("% s " ;, nomeutente); , che non sembrerebbe utile nel tuo caso perché le stringhe const sembrano contenere stringhe di formato.

Wikipedia ha maggiori informazioni sulle vulnerabilità delle stringhe di formato qui: http://en.wikipedia.org/wiki/Format_string_vulnerabilities

Altri suggerimenti

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

Poiché snprintf () non ha alcuna possibilità di verificare se il numero di parametri corrisponde al numero di identificatori di formato, sarà sufficiente prendere il prossimo indirizzo dallo stack da utilizzare come valore per l'identificatore di formato successivo e possono accadere cose strane poi.

È noto come attacco stringa in formato .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top