如果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实现中是否存在安全风险?
答案 0 :(得分:2)
对于posix_spawnp
,这种行为可能是可接受的(通过类比),即使没有得到官方认可,但我认为你是对的,它是不符合的,而且它对于普通{{是危险的不符合'posix_spawn
1}}。应该简单地删除shell调用代码。