2014-10-27 27 views
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。所以我們將有一個相當於「無效參數」的返回值。我的理解是正確的嗎?或者,有沒有比我的理解更深入的東西?

+0

'execve'和'system'各自手冊的哪一部分你發現不清楚? – 2014-10-27 09:07:55

+0

我想知道如何相同的輸入不會導致與系統相比execve問題。 – 2014-10-27 09:09:59

回答

1

主要區別在於,使用system函數可以啓動任何shell可以執行的操作,因此基本上可以使用多個命令進行shell注入。而execve首先指定要執行的特定二進制文件,因此您幾乎可以確定只執行了一條命令(除非您的execve是shell。)。另外,由於您給出了execve的完整路徑,因此您可以避免基於修改HOME或當前工作目錄的竅門。

所以是的,你的理解是正確的