Как должен вести себя posix_spawn (), когда ему дается файл с неизвестным исполняемым магическим числом? - PullRequest
3 голосов
/ 24 августа 2011

Реализация 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?

1 Ответ

2 голосов
/ 05 сентября 2011

Такое поведение может быть приемлемым (по аналогии) для posix_spawnp, даже если оно официально не санкционировано, но я думаю, что вы правы, что оно не соответствует и, более того, опасно не соответствует для простого posix_spawn. Код вызова оболочки должен быть просто удален.

...