#c #input #argv #getopt #flawfinder
#c #ввод #argv #getopt #flowfinder
Вопрос:
У меня есть следующий код:
void parseOptions(int argc, char* argv[]) {
std::string mob;
int option, index;
struct option long_options[] = {{"version", no_argument, 0, 'V'},
{"mobile-interface", required_argument, 0, 'm'},
{0, 0}};
while ((option = getopt_long(argc, argv, "Vm:", long_options, amp;index)) != -1) {
switch (option) {
case 'V':
printVersion();
break;
case 'm':
if (strlen(optarg) == HASHED_MOB_SIZE) {
mob = optarg;
}
break;
default:
std::cerr << "Getopt switch default case shouldn't be reached... aborting program.n";
exit(ERR_GETOPT_FAILURE);
}
}
}
Я запускаю Flawfinder
и получаю следующую ошибку:
main.cpp:48: [3] (buffer) getopt_long: некоторые старые реализации не защищают от переполнения внутреннего буфера (CWE-120, CWE-20). Проверьте реализацию при установке или ограничьте размер всех строковых вводов.
Как мне ограничить размер ввода строки?
Комментарии:
1. одним из вариантов было бы использовать современный анализатор аргументов c , например
boost::program_options
2. Спасибо @AlanBirtles, но, к сожалению, я не могу использовать boost lib в этом проекте.
3. Неясно, о каком переполнении буфера они говорят.
getopt_long
похоже, не нужны какие-либо доступные для записи буферы. Реализации, которые я могу найти, похоже, не используют никаких.4. Спасибо @n.’местоимения’м. , Я этого не понимаю, думаю, я пока проигнорирую эту ошибку.
5. решение, которое сработало на данный момент, состоит в том, чтобы подавить предупреждение, добавив
/* Flawfinder: ignore */
в конце строки
Ответ №1:
Так Flawfinder
было правильно.
Существует уязвимость в getopt
: CVE-1999-0966.
Переполнение буфера в Solaris getopt в libc позволяет локальным пользователям получать привилегии root через длинный argv [0] .
Мое решение состояло в том, чтобы убедиться, что argc
это больше 1, и это argv[0]
ненадолго.