.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992 .\" and Copyright (c) 2006 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified by Michael Haardt .\" Modified 1993-07-21 by Rik Faith .\" Modified 1994-08-21 by Michael Chastain : .\" Modified 1997-01-31 by Eric S. Raymond .\" Modified 1999-11-12 by Urs Thuermann .\" Modified 2004-06-23 by Michael Kerrisk .\" 2006-09-04 Michael Kerrisk .\" Added list of process attributes that are not preserved on exec(). .\" 2007-09-14 Ollie Wild , mtk .\" Add text describing limits on command-line arguments + environment .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH EXECVE 2 "13 августа 2020 г." Linux "Руководство программиста Linux" .SH ИМЯ execve \- выполнить программу .SH СИНТАКСИС \fB#include \fP .PP \fBint execve(const char *\fP\fIpathname\fP\fB, char *const \fP\fIargv\fP\fB[],\fP .br \fB char *const \fP\fIenvp\fP\fB[]);\fP .SH ОПИСАНИЕ Вызов \fBexecve\fP выполняет программу, задаваемую \fIpathname\fP. При этом программа, выполняющаяся вызвавшим процессом, замещается новой программой, заново инициализируется стек, куча и сегменты данных (инициализированные и не инициализированные). .PP В \fIpathname\fP должно быть указано имя двоичного исполняемого файла или сценарий, начинающийся со строки вида: .PP .in +4n .EX \fB#!\fP\fIинтерпретатор \fP[необязательный параметр] .EE .in .PP Подробней о сценариях написано далее в «Интерпретируемые сценарии». .PP \fIargv\fP is an array of pointers to strings passed to the new program as its command\-line arguments. By convention, the first of these strings (i.e., \fIargv[0]\fP) should contain the filename associated with the file being executed. The \fIargv\fP array must be terminated by a NULL pointer. (Thus, in the new program, \fIargv[argc]\fP will be NULL.) .PP \fIenvp\fP is an array of pointers to strings, conventionally of the form \fBkey=value\fP, which are passed as the environment of the new program. The \fIenvp\fP array must be terminated by a NULL pointer. .PP The argument vector and environment can be accessed by the new program's main function, when it is defined as: .PP .in +4n .EX int main(int argc, char *argv[], char *envp[]) .EE .in .PP Однако заметим, что использование третьего аргумента главной функции не определено в POSIX.1; согласно POSIX.1, окружение должно быть доступно через внешнюю переменную \fBenviron\fP(7). .PP При успешном выполнении \fBexecve\fP() управление не возвращается, а код, инициализированные данные, неинициализированные данные (bss) и стек вызвавшего процесса перезаписываются содержимым загруженной программы. .PP Если текущая программа выполнялась под управлением ptrace, то после успешного вызова \fBexecve\fP() ей посылается сигнал \fBSIGTRAP\fP. .PP If the set\-user\-ID bit is set on the program file referred to by \fIpathname\fP, then the effective user ID of the calling process is changed to that of the owner of the program file. Similarly, if the set\-group\-ID bit is set on the program file, then the effective group ID of the calling process is set to the group of the program file. .PP Вышеупомянутые преобразования эффективных IDs \fIне\fP выполняются (т. е., биты set\-user\-ID и set\-group\-ID игнорируются), если что\-либо из следующего истинно: .IP * 3 установлен атрибут \fIno_new_privs\fP для вызывающей нити (смотрите \fBprctl\fP(2)); .IP * подлежащая файловая система смонтирована с \fInosuid\fP (флаг \fBMS_NOSUID\fP для \fBmount\fP(2)); или .IP * вызывающий процесс выполняется под контролем ptrace. .PP Также игнорируются мандаты файла программы (смотрите \fBcapabilities\fP(7)), если что\-то из вышеперечисленного истинно. .PP Фактический идентификатор пользователя процесса копируется в сохранённый идентификатор пользователя (set\-user\-ID), также фактический идентификатор группы копируется в сохранённый идентификатор группы (set\-group\-ID). Это копирование выполняется после изменения любого фактического идентификатора, которое происходит из\-за выставленных бит режима set\-user\-ID и set\-group\-ID. .PP Реальные UID и GID процесса, а также его дополнительные ID групп не изменяются при вызове \fBexecve\fP(). .PP Если исполняемый файл является динамически\-скомпонованным файлом в формате a.out, содержащим заглушки для динамических библиотек, то в начале выполнения этого файла вызывается динамический компоновщик Linux \fBld.so\fP(8), который начинает выполнение с загрузки общих объектов в память и компонует их с исполняемым файлом. .PP .\" Если исполняемый файл является динамически компонуемым файлом в формате ELF, то для загрузки необходимых общих объектов используется интерпретатор, указанный в сегменте PT_INTERP. Для программ, скомпонованных с glibc, обычно это \fI/lib/ld\-linux.so.2\fP (смотрите \fBld\-linux.so\fP(8)). .SS "Effect on process attributes" При вызове \fBexecve\fP() сохраняются все свойства процесса, за исключением: .IP * 3 Значения обработчиков всех захватываемых сигналов сбрасываются в значения по умолчанию (\fBsignal\fP(7)). .IP * Любой альтернативный стек сигнала не сохраняется (\fBsigaltstack\fP(2)). .IP * Проецирование памяти не сохраняется (\fBmmap\fP(2)). .IP * Подключённые общие сегменты памяти System\ V отключаются (\fBshmat\fP(2)). .IP * Области общей памяти POSIX становятся неспроецированными (\fBshm_open\fP(3)). .IP * Открытые дескрипторы в очереди сообщений POSIX закрываются (\fBmq_overview\fP(7)). .IP * Все открытые именные семафоры POSIX закрываются (\fBsem_overview\fP(7)). .IP * Таймеры POSIX не сохраняются (\fBtimer_create\fP(2)). .IP * Все открытые потоки каталогов (directory streams) закрываются (\fBopendir\fP(3)). .IP * Блокировки памяти не сохраняются (\fBmlock\fP(2), \fBmlockall\fP(2)). .IP * Обработчики завершения работы (exit handlers) не сохраняются (\fBatexit\fP(3), \fBon_exit\fP(3)). .IP * Окружения плавающей точки сбрасываются в настройки по умолчанию (\fBfenv\fP(3)). .PP В POSIX.1 определён список сохраняемых свойств процесса. Следующие свойства процесса, имеющиеся только в Linux, также не сохраняются при \fBexecve\fP(): .IP * 3 The process's "dumpable" attribute is set to the value 1, unless a set\-user\-ID program, a set\-group\-ID program, or a program with capabilities is being executed, in which case the dumpable flag may instead be reset to the value in \fI/proc/sys/fs/suid_dumpable\fP, in the circumstances described under \fBPR_SET_DUMPABLE\fP in \fBprctl\fP(2). Note that changes to the "dumpable" attribute may cause ownership of files in the process's \fI/proc/[pid]\fP directory to change to \fIroot:root\fP, as described in \fBproc\fP(5). .IP * Флаг \fBPR_SET_KEEPCAPS\fP (\fBprctl\fP(2)) очищается. .IP * (Начиная с Linux 2.4.36 / 2.6.23) Если выполняется программа с установленным битом set\-user\-ID или set\-group\-ID, то сигнал о смерти родителя, установленный \fBprctl\fP(2) с флагом \fBPR_SET_PDEATHSIG\fP, очищается. .IP * Имя процесса, установленное через \fBprctl\fP(2) \fBPR_SET_NAME\fP (и отображаемое \fIps\ \-o comm\fP), изменяется на имя нового исполняемого файла. .IP * Флаг \fBSECBIT_KEEP_CAPS\fP \fIsecurebits\fP очищается. Смотрите \fBcapabilities\fP(7). .IP * Сигнал завершения (termination signal) устанавливается в \fBSIGCHLD\fP (\fBclone\fP(2)). .IP * Таблица файловых дескрипторов не является общей, отменяется действие флага \fBCLONE_FILES\fP у \fBclone\fP(2). .PP Также стоит учитывать следующее: .IP * 3 Все нити (threads), отличные от вызывающей, уничтожаются \fBexecve\fP(). Мьютексы, условные переменные и другие объекты pthreads не сохраняются. .IP * При запуске программы выполняется эквивалент \fIsetlocale(LC_ALL, "C")\fP. .IP * В POSIX.1 указано, что действия по отношению к любым игнорируемым или имеющим настройку по умолчанию сигналам, остаются неизменными. В POSIX.1 есть одно исключение: если \fBSIGCHLD\fP игнорируется, то реализация может оставить обработку сигнала (disposition) неизменной или вернуть настройку по умолчанию; в Linux используется первое. .IP * Все ожидающие выполнения асинхронные операции ввода\-вывод отменяются (\fBaio_read\fP(3), \fBaio_write\fP(3)). .IP * Как происходит обработка мандатов (capabilities) при вызове \fBexecve\fP(), см. \fBcapabilities\fP(7). .IP * .\" On Linux it appears that these file descriptors are .\" always open after an execve(), and it looks like .\" Solaris 8 and FreeBSD 6.1 are the same. -- mtk, 30 Apr 2007 По умолчанию, после \fBexecve\fP() файловые дескрипторы остаются открытыми. Файловые дескрипторы, помеченные как close\-on\-exec (закрывать при запуске), закрываются; смотрите описание \fBFD_CLOEXEC\fP в \fBfcntl\fP(2) (если файловый дескриптор закрыт, это приводит к освобождению всех имеющихся блокировок, полученных на соответствующий файл данным процессом. Подробней смотрите \fBfcntl\fP(2)). В POSIX.1 сказано, что если бы файловые дескрипторы 0, 1 и 2 были закрыты после успешного вызова \fBexecve\fP(), и процесс получил бы привилегии из\-за установленных битов режима set\-user\-ID или set\-group\-ID на исполняемом файле, то система смогла бы открыть произвольный файл для каждого из этих дескрипторов. Считается, что переносимая программа, с привилегиями или без, не может рассчитывать, что эти три файловых дескриптора будут оставаться закрытыми после \fBexecve\fP(). .SS "Интерпретируемые сценарии" Интерпретируемый сценарий \(em это текстовый файл, у которого установлен бит выполнения и первая строка имеет вид: .PP .in +4n .EX \fB#!\fP\fIинтерпретатор \fP[необязательный параметр] .EE .in .PP В поле \fIинтерпретатор\fP должно быть указано имя файла запуска. .PP Если в аргументе \fIpathname\fP для \fBexecve\fP() указан интерпретируемый сценарий, то \fIинтерпретатор\fP будет вызван со следующими параметрами: .PP .in +4n .EX \fIинтерпретатор\fP [необязательный параметр] \fIpathname\fP параметр… .EE .in .PP .\" See the P - preserve-argv[0] option. .\" Documentation/admin-guide/binfmt-misc.rst .\" https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html где \fIpathname\fP — абсолютный путь к файлу, указанному в первом аргументе \fBexecve\fP() и \fIпараметр...\fP — последовательность слов, указываемых аргументом \fIargv\fP в \fBexecve\fP() начиная с \fIargv[1]\fP. Заметим, что нельзя получить \fIargv[0]\fP, переданный в вызов \fBexecve\fP(). .PP В целях переносимости, \fIнеобязательный параметр\fP должен быть или пустым, или задаваться одним словом (т.е., не должен содержать пробельных символов); см. ЗАМЕЧАНИЯ далее. .PP .\" commit bf2a9a39639b8b51377905397a5005f444e9a892 Начиная с Linux 2.6.28 ядро позволяет интерпретатору сценария самому быть сценарием. Это разрешение рекурсивно (до четырёх раз), поэтому сценарий может быть сценарием, который интерпретируется сценарием и т. д. .SS "Ограничения на размер параметров и окружения" Большинство реализаций UNIX накладывает некоторые ограничения на полный размер параметра командной строки (\fIargv\fP) и окружения (\fIenvp\fP), которые можно передать новой программе. POSIX.1 позволяет реализации объявить это ограничение через константу \fBARG_MAX\fP (определённую в \fI\fP или сделать её доступной во время выполнения через вызов \fIsysconf(_SC_ARG_MAX)\fP). .PP В ядре Linux до версии 2.6.23 размер памяти, используемый для хранения окружения и строк параметров, был ограничен 32 страницами (определялся ядерной константой \fBMAX_ARG_PAGES\fP). На архитектурах с 4\-КиБ размером страницы это давало максимальный размер в 128\ КиБ. .PP .\" For some background on the changes to ARG_MAX in kernels 2.6.23 and .\" 2.6.25, see: .\" http://sourceware.org/bugzilla/show_bug.cgi?id=5786 .\" http://bugzilla.kernel.org/show_bug.cgi?id=10095 .\" http://thread.gmane.org/gmane.linux.kernel/646709/focus=648101, .\" checked into 2.6.25 as commit a64e715fc74b1a7dcc5944f848acc38b2c4d4ee2. .\" Ollie: That doesn't include the lists of pointers, though, .\" so the actual usage is a bit higher (1 pointer per argument). Начиная с ядра версии 2.6.23, большинство архитектур поддерживают предельный размер, высчитываемый от мягкого ограничения ресурса \fBRLIMIT_STACK\fP (см. \fBgetrlimit\fP(2)), который действует во время вызова \fBexecve\fP(). (Исключение составляют архитектуры без механизма управления памятью: в них ограничение рассчитывается как и до версии 2.6.23.) Это изменение позволяет программам иметь больший список параметров и/или окружения. Для этих архитектур полный размер ограничен до 1/4 разрешённого размера стека. (Накладываемое ограничение в 1/4 позволяет новой программе всегда иметь некоторое пространство под стек.) Кроме того, полный размер ограничен 3/4 значения ядерной константы \fB_STK_LIM\fP (8 мибибайт). Начиная с Linux версии 2.6.25, ядро также отводит нижние 32 страницы для этого предельного размера, поэтому, даже когда \fBRLIMIT_STACK\fP задан слишком низко, приложения гарантированно получат, по крайней мере, столько же пространства под параметры и окружение, сколько бы они получили при работе с Linux 2.6.23 и ранее. (Это гарантия не обеспечивалась в Linux 2.6.23 и 2.6.24.) Также, размер строки ограничен 32 страницами (ядерная константа \fBMAX_ARG_STRLEN\fP), а максимальное число строк может быть 0x7FFFFFFF. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBexecve\fP() не возвращает управление. В случае ошибки возвращается \-1, а \fIerrno\fP устанавливается в соответствующее значение. .SH ОШИБКИ .TP \fBE2BIG\fP Слишком большое общее количество байт для окружения (\fIenvp\fP) и списка параметров (\fIargv\fP). .TP \fBEACCES\fP В одном из каталогов префикса \fIpathname\fP или интерпретатора не разрешён поиск (смотрите также \fBpath_resolution\fP(7)). .TP \fBEACCES\fP Файл или интерпретатор не являются обычным файлом. .TP \fBEACCES\fP Не установлен бит выполнения на файле или сценарии или интерпретаторе ELF. .TP \fBEACCES\fP Файловая система смонтирована с \fInoexec\fP. .TP \fBEAGAIN\fP (начиная с Linux 3.1) .\" commit 72fa59970f8698023045ab0713d66f3f4f96945c Из\-за изменения реального UID одним из вызовов \fBset*uid\fP() ранее, вызывающий всё ещё превышает ограничитель ресурса \fBRLIMIT_NPROC\fP (смотрите \fBsetrlimit\fP(2)). Подробное объяснение этой ошибки смотрите в ЗАМЕЧАНИЯХ. .TP \fBEFAULT\fP Значение \fIpathname\fP или один из указателей в векторах \fIargv\fP или \fIenvp\fP указывает за пределы доступного адресного пространства. .TP \fBEINVAL\fP Исполняемый ELF\-файл содержит более одного сегмента PT_INTERP (т.е., в нём указано более одного интерпретатора). .TP \fBEIO\fP Произошла ошибка ввода\-вывода. .TP \fBEISDIR\fP Интерпретатор ELF является каталогом. .TP \fBELIBBAD\fP Не распознан формат интерпретатора ELF. .TP \fBELOOP\fP Во время определения \fIpathname\fP, имени сценария или интерпретатора ELF встретилось слишком много символьных ссылок. .TP \fBELOOP\fP .\" commit d740269867021faf4ce38a449353d2b986c34a67 Достигнут предел количества рекурсий при интерпретации сценария (смотрите «Интерпретируемые сценарии» выше). До Linux 3.8 для этого случая возвращалась ошибка \fBENOEXEC\fP. .TP \fBEMFILE\fP Было достигнуто ограничение по количеству открытых файловых дескрипторов на процесс. .TP \fBENAMETOOLONG\fP Слишком длинное значение аргумента \fIpathname\fP. .TP \fBENFILE\fP Достигнуто максимальное количество открытых файлов в системе. .TP \fBENOENT\fP The file \fIpathname\fP or a script or ELF interpreter does not exist. .TP \fBENOEXEC\fP Не распознан формат исполняемого файла, он не подходит для архитектуры, или имеет ошибки в формате, из\-за чего не может быть выполнен. .TP \fBENOMEM\fP Недостаточное количество памяти ядра. .TP \fBENOTDIR\fP Компонент пути в \fIpathname\fP, сценарии или интерпретаторе ELF в действительности не является каталогом. .TP \fBEPERM\fP Файловая система смонтирована с \fInosuid\fP, пользователь не является суперпользователем, а на файле установлен бит set\-user\-ID или set\-group\-ID. .TP \fBEPERM\fP Над процессом выполняется трассировка, пользователь не имеет прав суперпользователя, а у файла установлен бит set\-user\-ID или set\-group\-ID. .TP \fBEPERM\fP Приложение «с недоработанными мандатами» (capability\-dumb) не получило бы полный набор ограничивающих мандатов, разрешаемых исполняемым файлом. Смотрите \fBcapabilities\fP(7). .TP \fBETXTBSY\fP Заданный исполняемый файл был открыт на запись одним или более процессов. .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" .\" SVr4 documents additional error .\" conditions EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP; POSIX does not .\" document ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, .\" EISDIR or ELIBBAD error conditions. POSIX.1\-2001, POSIX.1\-2008, SVr4, 4.3BSD. В POSIX не описано поведение #!, но это существует (в нескольких вариантах) в других системах UNIX. .SH ЗАМЕЧАНИЯ Иногда, про \fBexecve\fP() (и подобные функции, описанные в \fBexec\fP(3)) говорят, что он «выполняет \fIновый\fP процесс». Это крайне некорректная фраза — не появляется нового процесса; много атрибутов вызывающего процесса остаются неизменными (в частности, его PID). Всё, что делает \fBexecve\fP(2), это перестраивает существующий процесс (вызывавший процесс) под выполнение новой программы. .PP Над процессами с установленными set\-user\-ID и set\-group\-ID не может выполняться \fBptrace\fP(2). .PP Результат работы при монтировании файловой системы с параметром \fInosuid\fP различается в разных версиях ядра Linux: некоторые будут отказывать в запуске исполняемых файлов с установленными битами set\-user\-ID и set\-group\-ID, если это дало бы пользователю больше прав чем уже есть (и возвращать \fBEPERM\fP), другие просто проигнорируют биты set\-user\-ID и set\-group\-ID и успешно выполнят \fBexec\fP(). .PP .\" e.g., EFAULT on Solaris 8 and FreeBSD 6.1; but .\" HP-UX 11 is like Linux -- mtk, Apr 2007 .\" Bug filed 30 Apr 2007: http://bugzilla.kernel.org/show_bug.cgi?id=8408 .\" Bug rejected (because fix would constitute an ABI change). .\" В Linux значения \fIargv\fP и \fIenvp\fP могут быть равны NULL. В обоих случаях, это работает также, как если аргумент бы содержал указатель на список с единственным указателем null. \fBНе пользуйтесь преимуществом данной нестандартной и непереносимой возможностью!\fP В многих других системах UNIX указание \fIargv\fP равным NULL приводит к ошибке (\fBEFAULT\fP). \fIНекоторые\fP другие системы UNIX при \fIenvp==NULL\fP работают также как Linux. .PP В POSIX.1 указано, что значения, возвращаемые \fBsysconf\fP(3), должны быть неизменны в течении существования процесса. Однако, начиная с версии Linux 2.6.23, если изменяется ограничение ресурса \fBRLIMIT_STACK\fP, то значение, возвращаемое для \fB_SC_ARG_MAX\fP, также будет изменено, чтобы отразить, что ограничение на пространство для хранения параметров командной строки и окружения было изменено. .PP .\" commit 19d860a140beac48a1377f179e693abe86a9dac9 .\" In most cases where \fBexecve\fP() fails, control returns to the original executable image, and the caller of \fBexecve\fP() can then handle the error. However, in (rare) cases (typically caused by resource exhaustion), failure may occur past the point of no return: the original executable image has been torn down, but the new image could not be completely built. In such cases, the kernel kills the process with a \fBSIGSEGV\fP (\fBSIGKILL\fP until Linux 3.17) signal. .SS "Интерпретируемые сценарии" .\" commit 6eb3c3d0a52dca337e327ae8868ca1f44a712e02 Ядро накладывает ограничение на максимальную длину текста после символов «#!» в начале сценария; символы за пределами границ игнорируются. До Linux 5.1 было ограничение в 127 символов. Начиная с Linux 5.1 ограничение установлено в 255 символов. .PP .\" e.g., Solaris 8 .\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward Семантика \fIнеобязательного параметра\fP интерпретатора сценариев различна в разных реализациях. В Linux, вся строка после имени \fIинтерпретатора\fP передаётся интерпретатору как единый параметр, и эта строка может содержать пробельные символы. Однако, такое поведение отличается от других систем. Некоторые системы используют первый пробел в качестве признака окончания \fIнеобязательного параметра\fP. В других системах, интерпретатор сценариев может иметь несколько параметров, и пробелы в \fIнеобязательном параметре\fP используются для их разграничения. .PP .\" .\" .SH BUGS .\" Some Linux versions have failed to check permissions on ELF .\" interpreters. This is a security hole, because it allows users to .\" open any file, such as a rewinding tape device, for reading. Some .\" Linux versions have also had other security holes in .\" .BR execve () .\" that could be exploited for denial of service by a suitably crafted .\" ELF binary. There are no known problems with 2.0.34 or 2.2.15. На файлах со сценариями в Linux (как и большинстве других современных системах UNIX) игнорируются биты set\-user\-ID и set\-group\-ID. .SS "execve() и EAGAIN" Это более подробное объяснение ошибки \fBEAGAIN\fP, которая возвращается (начиная с Linux 3.1) при вызове \fBexecve\fP(). .PP .\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4 Ошибка \fBEAGAIN\fP может возникать, когда \fIпредшествующий\fP вызов \fBsetuid\fP(2), \fBsetreuid\fP(2) или \fBsetresuid\fP(2) приводит к изменению у процесса реального идентификатора пользователя и это изменение приводит к тому, что процесс превышает свой ограничитель ресурса \fBRLIMIT_NPROC\fP (т. е., количество процессов, принадлежащих новому реальному UID, превышает ограничитель ресурса). В версиях Linux с 2.6.0 по 3.0, это приводит к ошибке вызова \fBset*uid\fP() (до версии 2.6 ограничитель ресурса не учитывался для процессов, которые изменили идентификатор пользователя). .PP Начиная с Linux 3.1, описанный сценарий больше не приводит к ошибке в вызове \fBset*uid\fP(), так как это слишком часто приводило к дырам в безопасности, когда некорректное приложение не проверяет возвращаемое состояние и предполагает, что если вызывающий имеет права root, то вызов всегда выполняется успешно. Вместо этого вызов \fBset*uid\fP() теперь успешно изменяет реальный UID, но ядро устанавливает внутренний флаг с именем \fBPF_NPROC_EXCEEDED\fP, который означает, что был превышен ограничитель ресурса \fBRLIMIT_NPROC\fP. Если флаг \fBPF_NPROC_EXCEEDED\fP установлен и ограничитель ресурса всё ещё превышен на момент последующего вызова \fBexecve\fP(), то вызов завершается с ошибкой \fBEAGAIN\fP. Такая логика ядра гарантирует, что ограничитель ресурса \fBRLIMIT_NPROC\fP будет учтён при обычной последовательности действий для привилегированных служб, а именно — \fBfork\fP(2) + \fBset*uid\fP() + \fBexecve\fP(). .PP Если ограничитель ресурса был не превышен на момент вызова \fBexecve\fP() (так как другие процессы, принадлежащие этому реальному UID завершили работу между вызовом \fBset*uid\fP() и \fBexecve\fP()), то вызов \fBexecve\fP() выполнится успешно и ядро очистит флаг \fBPF_NPROC_EXCEEDED\fP у процесса. Флаг также очищается, если при успешном выполнении процессом последующего вызова \fBfork\fP(2). .SS "Историческая справка" .\" .\" .SH BUGS .\" Some Linux versions have failed to check permissions on ELF .\" interpreters. This is a security hole, because it allows users to .\" open any file, such as a rewinding tape device, for reading. Some .\" Linux versions have also had other security holes in .\" .BR execve () .\" that could be exploited for denial of service by a suitably crafted .\" ELF binary. There are no known problems with 2.0.34 or 2.2.15. В UNIX\ V6 список аргументов вызова \fBexec\fP() заканчивался 0, а список аргументов \fImain\fP заканчивался \-1. Поэтому, этот список аргументов не мог быть использован напрямую в последующем вызове \fBexec\fP(). Начиная с UNIX\ V7 оба списка стали оканчиваться NULL. .SH ПРИМЕРЫ Данная программа запускается второй программой, представленной ниже. Она просто выводит свои параметры командной строки по одному на строку. .PP .in +4n .EX /* myecho.c */ #include #include int main(int argc, char *argv[]) { for (int j = 0; j < argc; j++) printf("argv[%d]: %s\en", j, argv[j]); exit(EXIT_SUCCESS); } .EE .in .PP Эта программа может использоваться для запуска программы, чьё имя указано в параметре командной строки. .PP .in +4n .EX /* execve.c */ #include #include #include int main(int argc, char *argv[]) { char *newargv[] = { NULL, "hello", "world", NULL }; char *newenviron[] = { NULL }; if (argc != 2) { fprintf(stderr, "Использование: %s \en", argv[0]); exit(EXIT_FAILURE); } newargv[0] = argv[1]; execve(argv[1], newargv, newenviron); perror("execve"); /* execve() возвращается только при ошибке */ exit(EXIT_FAILURE); } .EE .in .PP Мы можем использовать вторую программу для запуска первой: .PP .in +4n .EX $\fB cc myecho.c \-o myecho\fP $\fB cc execve.c \-o execve\fP $\fB ./execve ./myecho\fP argv[0]: ./myecho argv[1]: hello argv[2]: world .EE .in .PP Также мы можем использовать эти программы для демонстрации использования интерпретатора сценариев. Для этого создадим сценарий, чей "интерпретатор" указывает на нашу программу \fImyecho\fP: .PP .in +4n .EX $\fB cat > script\fP \fB#!./myecho script\-arg\fP \fB\(haD\fP $\fB chmod +x script\fP .EE .in .PP Теперь мы можем использовать нашу программу для запуска сценария: .PP .in +4n .EX $\fB ./execve ./script\fP argv[0]: ./myecho argv[1]: script\-arg argv[2]: ./script argv[3]: hello argv[4]: world .EE .in .SH "СМ. ТАКЖЕ" \fBchmod\fP(2), \fBexecveat\fP(2), \fBfork\fP(2), \fBget_robust_list\fP(2), \fBptrace\fP(2), \fBexec\fP(3), \fBfexecve\fP(3), \fBgetopt\fP(3), \fBsystem\fP(3), \fBcapabilities\fP(7), \fBcredentials\fP(7), \fBenviron\fP(7), \fBpath_resolution\fP(7), \fBld.so\fP(8) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Azamat Hackimov , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .