Pergunta

Temos um bug Coverity para esta linha de código:

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

O erro diz:

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

Eu mudei testStrings a um const, mas que não fez nada:

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

Todas as idéias quanto ao que esse erro está realmente dizendo?

Foi útil?

Solução

Seu código é muito bem.

A questão é que se você passar uma seqüência que é usuário controlada como uma seqüência de formato printf, bugs de segurança podem surgir.

Por exemplo, printf(userName);

onde username é fornecido pelo usuário, um usuário pode passar "% s", e obter o seu função para começar a acessar dados em um endereço aleatório na pilha, o que poderia resultar em um acidente. printf vai tentar pop parâmetros adicionais da pilha, resultando em uma corrupção de pilha. Ataque de negação de serviço como este é provavelmente o melhor caso, a informação pode ser divulgada por ficar printf para despejar valores na pilha e há ainda maneiras de obter funções de estilo printf para modificar o endereço de retorno na pilha.

Uma vez que as cordas não são usuário controlada, é seguro ignorar esta mensagem. A correção típico é para substituir o exemplo printf dei com printf("%s", userName);, que não parece ajudar no seu caso, porque as cordas const parecem conter seqüências de formato.

Wikipedia tem mais sobre as vulnerabilidades da corda do formato aqui: http://en.wikipedia.org/wiki/Format_string_vulnerabilities

Outras dicas

idéia é que o valor de testStrings[testID] pode ser alterada de alguma forma para incluir especificadores de formato extra.

Porque snprintf() não tem possibilidade de verificar se o número de parâmetros corresponde ao número de especificadores de formato que vai ter apenas próximo endereço da pilha para uso como valor para o próximo especificador de formato e coisas estranhas podem acontecer em seguida.

É conhecida como formato de seqüência de ataque .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top