Я использую инструмент SA покрытия для ошибок. Я получаю несколько ошибок из-за использования fgets(). Это сниппет (ошибки SA, представленные в виде комментариев) -Возможная уязвимость безопасности при использовании fgets() и рекомендуемого решения?
FILE *fp;
char my_pubkey[1024];
fp = fopen("publickey.pub", "r");
//tainted_string_argument: fgets taints variable my_pubkey.
if (!fgets(my_pubkey, sizeof(my_pubkey), fp)) {
printf("failure to read pub key file");
goto error;
}
//tainted_string: Passing tainted string my_pubkey to a parameter that cannot accept a tainted format string.
if (fprintf(fp, my_pubkey) != strlen(my_pubkey)) {
printf ("failure to write pub key in key file");
goto error;
}
В моем исследовании, некоторые отчеты предлагают использовать GetLine() вместо этого, но что на самом деле нужно? Если это допустимая проблема, какова может быть уязвимость? И какое лучшее решение?
EDIT: Если это ложный позитив, почему так? Что может быть примером того, когда это будет актуальной проблемой?
'' strlen' и printf' в его нынешнем виде может вызвать проблемы при работе с «испорченной» строки, если они являются (если нулевое завершение не там, где оно ожидается). Но это не ваше дело. 'fgets' заботится об этом. –
Собственно, нет, извините. Это * не * ok. Что произойдет, если жало содержит некоторые спецификаторы формата? Так что нет, инструмент прав. Это настоящий позитив. –
'fgets' добавляет символ новой строки, если встречается перед чтением' sizeof (my_pubkey) -1' chars. Может ли это быть проблемой для вашего приложения? –