Реализация glibc в posix_spawn пытается отправить файл в / bin / sh, если execve () завершается неудачно с ENOEXEC:
__execve (file, argv, envp);
if (errno == ENOEXEC)
script_execute (file, argv, envp)
Пример реализации POSIX просто терпит неудачу, если execve () завершается неудачей любым способом:
execve(path, argv, envp);
exit(127); /* exec failed */
Спецификация POSIX для posix_spawn () не определяет ничего о том, как обрабатывать файлы, которые привели бы к ENOEXEC, если они отправленыexecve ().В качестве возможного контраста, спецификация POSIX для семейства функций exec * специально указывает, что execlp () и execvp () должны вызывать sh в случае нераспознанного исполняемого типа:
Существует два различных способа, которыми содержимое файла образа процесса может привести к сбою выполнения, отличающееся установкой для errno значения [ENOEXEC] или [EINVAL] (см. Раздел «ОШИБКИ»).В случаях, когда другие члены семейства функций exec потерпят неудачу и установят для errno значение [ENOEXEC], функции execlp () и execvp () должны выполнить интерпретатор команд, а среда исполняемой команды должна быть такой, как если бы процессВызвал утилиту sh с помощью execl () следующим образом:
execl ([путь оболочки], arg0, файл, arg1, ..., (char *) 0);
где [shellпуть] - это неопределенное имя пути для утилиты sh, файл - это файл образа процесса, а для execvp (), где arg0, arg1 и т. д. соответствуют значениям, передаваемым в execvp () в argv [0], argv [1] и т. д.
Итак, реализация glibc не соответствует?Или спецификация POSIX здесь немного расплывчата?Нет ли угрозы безопасности в реализации glibc?