Question

Nous avons un bogue Coverity pour cette ligne de code:

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

L'erreur dit:

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

J'ai remplacé testStrings par un const, mais cela ne faisait rien:

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

Avez-vous des idées sur ce que cette erreur dit réellement?

Était-ce utile?

La solution

Votre code est correct.

Le problème est que si vous transmettez une chaîne contrôlée par l'utilisateur en tant que chaîne de format printf, des problèmes de sécurité peuvent survenir.

Par exemple, printf (nom d'utilisateur);

Lorsque userName est fourni par l'utilisateur, il peut transmettre "% s" et demander à votre fonction de commencer à accéder aux données à une adresse aléatoire de la pile, ce qui pourrait provoquer un blocage. printf essaiera de supprimer des paramètres supplémentaires de la pile, ce qui entraînera une corruption de la pile. Une telle attaque par déni de service est probablement ce qu'il y a de mieux. Les informations peuvent être divulguées en faisant en sorte que printf dumpe les valeurs de la pile, et il existe même des moyens d'utiliser des fonctions de style printf pour modifier l'adresse de retour sur la pile.

Étant donné que vos chaînes ne sont pas contrôlées par l'utilisateur, vous pouvez ignorer ce message. Le correctif typique consiste à remplacer l'exemple printf que j'ai donné par printf ("% s", userName); , ce qui ne semble pas vous aider dans votre cas car les chaînes const semblent contenir des chaînes de format.

Wikipedia en a plus sur les vulnérabilités des chaînes de format ici: http://fr.wikipedia.org/wiki/Format_string_vulnerabilities" rel="noreferrer"> http://en.wikipedia.org/wiki/Format_string_vulnerabilities

Autres conseils

L'idée est que la valeur de testStrings [testID] peut être modifiée en quelque sorte pour inclure des spécificateurs de format supplémentaires.

Etant donné que snprintf () n'a pas la possibilité de vérifier si le nombre de paramètres correspond au nombre de spécificateurs de format, il prendra simplement l'adresse suivante de la pile à utiliser comme valeur pour le spécificateur de format suivant et des événements étranges peuvent se produire. alors.

Elle est connue sous le nom de attaque par chaîne de format .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top