Formato snprintf questão vulnerabilidade de segurança de Cordas
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?
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 .