Pregunta

Tenemos un error de Coverity para esta línea de código:

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

El error dice:

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

Cambié testStrings a una constante, pero eso no hizo nada:

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

¿Alguna idea de lo que realmente dice este error?

¿Fue útil?

Solución

Tu código está bien.

El problema es que si pasa una cadena que es controlada por el usuario como una cadena de formato printf, pueden surgir errores de seguridad.

Por ejemplo, printf(userName);

Cuando userName es proporcionado por el usuario, un usuario puede pasar "% s " ;, y obtener su función para comenzar a acceder a los datos en una dirección aleatoria en la pila, lo que podría provocar un bloqueo. printf intentará extraer parámetros adicionales de la pila, lo que da como resultado una corrupción de la pila. El ataque de denegación de servicio como este es probablemente el mejor caso, la información se puede revelar haciendo que printf descargue los valores en la pila e incluso hay formas de obtener funciones de estilo printf para modificar la dirección de retorno en la pila.

Dado que sus cadenas no están controladas por el usuario, es seguro ignorar este mensaje. La solución típica es reemplazar el ejemplo printf que di con printf ("% s " ;, userName); , que no parece ayudar en su caso porque las cadenas constantes parecen contener cadenas de formato.

Wikipedia tiene más información sobre vulnerabilidades de cadenas de formato aquí: http://en.wikipedia.org/wiki/Format_string_vulnerabilities

Otros consejos

La idea es que el valor de testStrings [testID] se puede cambiar de alguna manera para incluir especificadores de formato adicionales.

Debido a que snprintf () no tiene posibilidad de verificar si el número de parámetros coincide con el número de especificadores de formato, solo tomará la siguiente dirección de la pila para usar como valor para el siguiente especificador de formato y pueden suceder cosas extrañas entonces.

Se conoce como ataque de cadena de formato .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top