Ошибка Flowfinder — переполнение внутреннего буфера. Как ограничить размер ввода строки и защитить его от переполнения?

#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] ненадолго.