Un aviso de seguridad reciente ( http://osdir.com/ml/bugtraq.security/2015-04/msg00102.html ) indicó que esta línea de código:
fprintf(stderr, (isprint(adata->contents[i])) ? "%c " : "%02x", adata->contents[i]);estaba sujeto a un " ataque de cadena de formato " que entiendo que usa algo como:
fprintf(stderr, varWithUserSuppliedData);en vez de:
fprintf(stderr, "%s", varWithUserSuppliedData);pero no veo eso en esa primera llamada fprintf - ¿qué me estoy perdiendo?
Gracias a @cremno por proporcionar un enlace al repositorio GIT para el archivo en cuestión: kssl.c (Tenga en cuenta que este no es el encabezado del repositorio).
Está claro que este informe es falso. En primer lugar, no hay ningún problema real con la llamada fprintf , aunque se puede argumentar que el código en un producto relacionado con la seguridad como OpenSSL debe ir más allá de ser seguro hasta el punto de ser visiblemente seguro incluso a simple vista. (No estoy seguro de que haría ese argumento, pero se ha hecho).
Pero lo que es más importante, el código en cuestión está deshabilitado (tenga en cuenta las directivas del preprocesador que lo rodean):
# if 0 { int i; fprintf(stderr, "%s[at%d:%d] ", label, adata->ad_type, adata->length); for (i = 0; i < adata->length; i++) { fprintf(stderr, (isprint(adata->contents[i])) ? "%c " : "%02x", adata->contents[i]); } fprintf(stderr, "\n"); } # endifEsto parece un mensaje de error generado automáticamente. Obviamente, la herramienta no sabe qué cadena de formato se usará, por lo que no puede analizar la cadena de formato y los argumentos y declarar que el uso es seguro.
Una herramienta más inteligente podría descubrir que solo hay dos posibilidades para la cadena de formato, y que cada posibilidad es segura y no da un mensaje de error.
El código en sí es seguro. Por supuesto, se deshace del mensaje usando una instrucción if/else. Y en el código crítico para la seguridad, no solo arreglaría las cosas que están mal, sino también las cosas que se ven mal. Y nunca se sabe, después de convertir fprintf en un if/else, la herramienta podría detectar un problema real que todos pasamos por alto.
El crédito debe ir a rici, pero todo se ve bien con el código.
Incluso si hay un problema, todo se puede imprimir de forma segura como char o hexadecimal.
Probablemente el problema podría estar en el ciclo for o while que opera sobre la cadena.
¿Podrías publicar el bucle también?