繁体   English   中英

与系统命令相比,execve如何防止漏洞

[英]How does execve prevents vulnerabilities compared to system command

我指的是这个链接,
基本上,认为输入是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刷新您的二进制映像并使用输入happy'; useradd 'attacker any_cmd happy'; useradd 'attacker作为参数传递给any_cmd 因此,我们将获得一个等于“无效参数”的返回值。 我的理解正确吗? 还是我所缺少的东西比我的理解更深刻?

实际上,主要区别在于,使用system功能可以启动Shell可以执行的任何程序,因此基本上可以通过多个命令进行Shell注入。 而用execve首先你指定一个特定的二进制文件来执行,所以你几乎肯定只有一个执行命令(除非你execve壳..)。 此外,由于你给一个完整路径execve您避免基于修改黑客HOME或当前工作目录。

是的,您的理解是正确的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM