Я имею в виду эту ссылку,
В принципе, рассмотрим вклад 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
. Таким образом, мы будем иметь возвращаемое значение, эквивалентное "недопустимым параметрам". Правильно ли я понимаю? Или есть что-то более глубокое, чем мое понимание, которое мне не хватает?
Главное отличие состоит в том, что с помощью system
функции вы можете запускать все, что может выполнить ваша оболочка, поэтому вы можете иметь инъекции оболочки с несколькими командами. В то время как с execve
сначала указать конкретный бинарный файл для выполнения, так что вы в значительной степени уверен, что есть только одна команда выполняется ( за исключением, если вы execve
оболочку..). Кроме того, поскольку вы даете полный путь к execve
вы избегаете хаков, основанных на изменении HOME
или текущего рабочего каталога.
Так что да, ваше понимание довольно правильно
execve
иsystem
вы нашли неясной?