0
我指的是this鏈接,
基本上,考慮輸入happy'; useradd 'attacker
,安全諮詢兼容和不兼容的代碼之間的區別 -的execve如何防止漏洞比系統命令
非訴代碼
#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
並使用輸入happy'; useradd 'attacker
作爲參數any_cmd
。所以我們將有一個相當於「無效參數」的返回值。我的理解是正確的嗎?或者,有沒有比我的理解更深入的東西?
'execve'和'system'各自手冊的哪一部分你發現不清楚? – 2014-10-27 09:07:55
我想知道如何相同的輸入不會導致與系統相比execve問題。 – 2014-10-27 09:09:59