Как execve предотвращает уязвимости по сравнению с системной командой

0

Я имею в виду эту ссылку,
В принципе, рассмотрим вклад happy'; useradd 'attacker happy'; useradd 'attacker, рекомендации по безопасности различаются между совместимым и несоответствующим кодом -

Код без жалобы

#include <string.h>
#include <stdlib.h>

enum { BUFFERSIZE = 512 };

void func(const char *input) {
  char cmdbuf[BUFFERSIZE];
  int len_wanted = snprintf(cmdbuf, BUFFERSIZE,
                            "any_cmd '%s'", input);
  if (len_wanted >= BUFFERSIZE) {
    /* Handle error */
  } else if (len_wanted < 0) {
    /* Handle error */
  } else if (system(cmdbuf) == -1) {
    /* Handle error */
  }
}

Соответствующий код

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void func(char *input) {
  pid_t pid;
  int status;
  pid_t ret;
  char *const args[3] = {"any_exe", input, NULL};
  char **env;
  extern char **environ;

  /* ... Sanitize arguments ... */

  pid = fork();
  if (pid == -1) {
    /* Handle error */
  } else if (pid != 0) {
    while ((ret = waitpid(pid, &status, 0)) == -1) {
      if (errno != EINTR) {
        /* Handle error */
        break;
      }
    }
    if ((ret != -1) &&
      (!WIFEXITED(status) || !WEXITSTATUS(status)) ) {
      /* Report unexpected child status */
    }
  } else {
    /* ... Initialize env as a sanitized copy of environ ... */
    if (execve("/usr/bin/any_cmd", args, env) == -1) {
      /* Handle error */
      _Exit(127);
    }
  }
}

Предположим, мы передаем один и тот же ввод как для функции с равными привилегиями, т.е. Запустим root и т.д. И т.д. Как второе решение обеспечивает отталкивание атаки на команду?

Мое единственное догадаться, что, execve any_cmd ваше двоичное изображение с помощью any_cmd и будет использовать input happy'; useradd 'attacker happy'; useradd 'attacker как args для any_cmd. Таким образом, мы будем иметь возвращаемое значение, эквивалентное "недопустимым параметрам". Правильно ли я понимаю? Или есть что-то более глубокое, чем мое понимание, которое мне не хватает?

  • 0
    Какую часть соответствующих руководств execve и system вы нашли неясной?
  • 0
    Я пытаюсь понять, как тот же вход не будет вызывать проблемы в execve по сравнению с системой.
Теги:
security

1 ответ

1
Лучший ответ

Главное отличие состоит в том, что с помощью system функции вы можете запускать все, что может выполнить ваша оболочка, поэтому вы можете иметь инъекции оболочки с несколькими командами. В то время как с execve сначала указать конкретный бинарный файл для выполнения, так что вы в значительной степени уверен, что есть только одна команда выполняется ( за исключением, если вы execve оболочку..). Кроме того, поскольку вы даете полный путь к execve вы избегаете хаков, основанных на изменении HOME или текущего рабочего каталога.

Так что да, ваше понимание довольно правильно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню