当给定具有无法识别的可执行幻数的文件时,posix_spawn()应该如何表现?

时间:2011-08-24 02:01:52

标签: posix glibc libc

如果execve()因ENOEXEC失败,posix_spawn的glibc implementation会尝试将文件发送到/ bin / sh:

__execve (file, argv, envp); 
if (errno == ENOEXEC)
  script_execute (file, argv, envp)

如果execve()以任何方式失败,POSIX sample implementation就会失败:

execve(path, argv, envp);
exit(127);              /* exec failed */

如果发送到execve(),POSIX specification for posix_spawn()没有指定如何处理将导致ENOEXEC的文件。作为一种可能的对比,POSIX specification for the exec* family of functions明确指出execlp()和execvp()应该在无法识别的可执行类型的情况下调用sh:

  

过程映像的内容有两种不同的方式   文件可能导致执行失败,由设置区分   错误到[ENOEXEC]或[EINVAL](参见ERRORS部分)。在里面   exec系列函数的其他成员的情况   失败并将errno设置为[ENOEXEC],execlp()和execvp()函数   应执行命令解释器和环境   执行的命令应该像进程调用sh实用程序一样   使用execl()如下:

     

execl([shell path],arg0,file,arg1,...,(char *)0);

     

其中[shell path]是sh实用程序文件的未指定路径名   是进程映像文件,对于execvp(),其中arg0,arg1等   on对应于传递给argv [0],argv [1]中的execvp()的值,   等等。

那么,glibc实现不一致吗?或者POSIX规范在这里有点模糊?在glibc实现中是否存在安全风险?

1 个答案:

答案 0 :(得分:2)

对于posix_spawnp,这种行为可能是可接受的(通过类比),即使没有得到官方认可,但我认为你是对的,它是不符合的,而且它对于普通{{是危险的不符合'posix_spawn 1}}。应该简单地删除shell调用代码。