.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992 .\" and Copyright (c) 2006 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" 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 "5 lutego 2023 r." "Linux man\-pages 6.03" .SH NAZWA execve \- uruchomienie programu .SH BIBLIOTEKA Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP) .SH SKŁADNIA .nf \fB#include \fP .PP \fBint execve(const char *\fP\fIpathname\fP\fB, char *const _Nullable \fP\fIargv\fP\fB[],\fP \fB char *const _Nullable \fP\fIenvp\fP\fB[]);\fP .fi .SH OPIS \fBexecve\fP() executes the program referred to by \fIpathname\fP. This causes the program that is currently being run by the calling process to be replaced with a new program, with newly initialized stack, heap, and (initialized and uninitialized) data segments. .PP \fIpathname\fP musi być albo wykonywalnym plikiem binarnym, albo skryptem zaczynającym się od linii w postaci: .PP .in +4n .EX \fB#!\fP\fIinterpreter \fP[opcjonalny\-parametr] .EE .in .PP Szczegóły tego ostatniego przypadku można znaleźć poniżej w rozdziale "Skrypty interpretowane". .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 This manual page describes the Linux system call in detail; for an overview of the nomenclature and the many, often preferable, standardised variants of this function provided by libc, including ones that search the \fBPATH\fP environment variable, see \fBexec\fP(3). .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 Note, however, that the use of a third argument to the main function is not specified in POSIX.1; according to POSIX.1, the environment should be accessed via the external variable \fBenviron\fP(7). .PP \fBexecve\fP() does not return on success, and the text, initialized data, uninitialized data (bss), and stack of the calling process are overwritten according to the contents of the newly loaded program. .PP Jeśli obecny program jest śledzony za pomocą ptrace, wysyła się mu \fBSIGTRAP\fP po pomyślnym \fBexecve\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 The aforementioned transformations of the effective IDs are \fInot\fP performed (i.e., the set\-user\-ID and set\-group\-ID bits are ignored) if any of the following is true: .IP \[bu] 3 the \fIno_new_privs\fP attribute is set for the calling thread (see \fBprctl\fP(2)); .IP \[bu] the underlying filesystem is mounted \fInosuid\fP (the \fBMS_NOSUID\fP flag for \fBmount\fP(2)); or .IP \[bu] the calling process is being ptraced. .PP The capabilities of the program file (see \fBcapabilities\fP(7)) are also ignored if any of the above are true. .PP Efektywny identyfikator użytkownika jest kopiowany do saved\-set\-user\-ID; podobnie efektywny identyfikator grupy jest kopiowany do saved\-set\-group\-ID. Kopiowanie odbywa się po zmianie któregokolwiek z efektywnych identyfikatorów związanej z bitami trybu set\-user\-ID i set\-group\-ID. .PP The process's real UID and real GID, as well as its supplementary group IDs, are unchanged by a call to \fBexecve\fP(). .PP Jeśli program wykonywalny jest skonsolidowany dynamicznie w formacie a.out z bibliotekami dzielonymi, to na początku uruchamiania wywoływany jest konsolidator dynamiczny \fBld.so\fP(8), który ładuje wszystkie obiekty do pamięci i konsoliduje z nimi program wykonywalny. .PP .\" Jeżeli program jest skonsolidowany dynamicznie jako ELF, to do załadowania potrzebnych obiektów współdzielonych używany jest interpreter określony w segmencie PT_INTERP. Tym interpreterem jest zazwyczaj \fI/lib/ld\-linux.so.2\fP, w wypadku programów skonsolidowanych z glibc2 (zob. \fBld\-linux.so\fP(8)). .SS "Effect on process attributes" Wszystkie atrybuty procesu są zachowywane podczas \fBexecve\fP(), z wyjątkiem poniższych: .IP \[bu] 3 Ustawienia obsługi sygnałów, które są przechwytywane, są zmieniane na wartości domyślne (\fBsignal\fP(7)). .IP \[bu] Alternatywny stos sygnałów nie jest zachowywany (\fBsigaltstack\fP(2)). .IP \[bu] Mapowania pamięci nie są zachowywane (\fBmmap\fP(2)) .IP \[bu] Dołączone segmenty pamięci dzielonej Systemu\ V są odłączane (\fBshmat\fP(2)). .IP \[bu] Regiony pamięci dzielonej POSIX są odmapowane (\fBshm_open\fP(3)). .IP \[bu] Otwarte kolejki komunikatów POSIX są zamykane (\fBmq_overview\fP(7)). .IP \[bu] Otwarte semafory nazwane POSIX są zamykane (\fBmq_overview\fP(7)). .IP \[bu] Timery POSIX nie są zachowywane (\fBtimer_create\fP(2)). .IP \[bu] Otwarte strumienie katalogów są zamykane (\fBopendir\fP(3)). .IP \[bu] Blokady pamięci nie są zachowywane (\fBmlock\fP(2), \fBmlockall\fP(2)). .IP \[bu] Zarejestrowanie funkcje wykonywanych po zakończeniu procesu nie są zachowywane (\fBatexit\fP(3), \fBon_exit\fP(3)). .IP \[bu] Środowisko zmiennoprzecinkowe jest ustawiane na domyślne (patrz \fBfenv\fP(3)). .PP Atrybuty procesu w liście przedstawionej powyżej są określone w POSIX.1. Następujące specyficzne dla Linuksa atrybuty procesu również nie są zachowywane podczas \fBexecve\fP(): .IP \[bu] 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/\fPpid directory to change to \fIroot:root\fP, as described in \fBproc\fP(5). .IP \[bu] Znacznik \fBPR_SET_KEEPCAPS\fP \fBprctl\fP(2) jest czyszczony. .IP \[bu] (Od Linuksa 2.4.36 / 2.6.23) Jeśli wykonywany program ma ustawiony bit set\-user\-ID lub set\-group\-ID, to jest czyszczony znacznik \fBPR_SET_PDEATHSIG\fP sygnału śmierci rodzica ustawiony przez \fBprctl\fP(2). .IP \[bu] Nazwa procesu ustawiona przez \fBPR_SET_NAME\fP z \fBprctl\fP(2) (i wyświetlana przez \fIps\ \-o comm\fP) jest ustawiana na nazwę nowego pliku wykonywalnego. .IP \[bu] Znacznik \fBSECBIT_KEEP_CAPS\fP w \fIsecurebits\fP jest czyszczony. Patrz \fBcapabilities\fP(7). .IP \[bu] Sygnał zakończenia jest ustawiany na \fBSIGCHLD\fP (patrz \fBclone\fP(2)). .IP \[bu] Tablica deskryptora plików nie jest dzielona, co anuluje działanie flagi \fBCLONE_FILES\fP \fBclone\fP(2). .PP Dalsze uwagi: .IP \[bu] 3 Wszystkie wątki oprócz wątku wywołującego są niszczone podczas \fBexecve\fP(). Muteksy, zmienne warunkowe i inne obiekty pthreads nie są zachowywane. .IP \[bu] Odpowiednik \fIsetlocale(LC_ALL, "C")\fP jest wykonywany po uruchomieniu programu. .IP \[bu] POSIX.1 określa, że ustawienie procedur obsługi sygnału na ignorowanie lub na wartość domyślną jest pozostawiane bez zmian. POSIX.1 przewiduje jeden wyjątek od tej reguły: jeśli \fBSIGCHLD\fP jest ignorowany, to implementacja może albo nie zmienić tego ustawienia, albo przestawić je na wartość domyślną; Linux robi to pierwsze. .IP \[bu] Wszystkie asynchroniczne operacje wejścia/wyjście są anulowane (\fBaio_read\fP(3), \fBaio_write\fP(3)). .IP \[bu] Sposób obsługi atrybutów (zdolności) procesu podczas \fBexecve\fP() opisano w \fBcapabilities\fP(7). .IP \[bu] .\" 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 Domyślnie deskryptory plików pozostają otwarte po \fBexecve\fP(). Deskryptory plików oznaczone jako "close\-on\-exec" są zamykane, patrz opis \fBFD_CLOEXEC\fP w \fBfcntl\fP(2). (Jeśli deskryptor pliku zostanie zamknięty, to zwolnione zostaną wszystkie blokady rekordów dotyczące pliku związanego z tym deskryptorem. Szczegóły można znaleźć w \fBfcntl\fP(2)). POSIX.1 mówi, że jeżeli deskryptory plików 0, 1 i 2 zostałyby zamknięte po pomyślnym wykonaniu \fBexecve\fP(), a proces uzyskałby przywileje z powodu ustawionego na wykonywanym pliku bitu trybu set\-user\-ID lub set\-group\-ID, to system może otworzyć bliżej nieokreślony plik dla każdego z tych deskryptorów plików. Jako zasadę należy przyjąć, że żaden przenośny program, uprzywilejowany czy nie, nie może zakładać, że te trzy deskryptory plików będą zamknięte po \fBexecve\fP(). .SS "Skrypty interpretowane" Skrypt interpretowany jest plikiem tekstowym mającym ustawione prawo do wykonywania. Pierwsza linia tego pliku jest w postaci: .PP .in +4n .EX \fB#!\fP\fIinterpreter \fP[opcjonalny\-parametr] .EE .in .PP \fIinterpreter\fP mus być poprawną nazwą ścieżki do pliku wykonywalnego. .PP Jeśli argument \fIpathname\fP wywołania \fBexecve\fP() określa interpreter, to zostanie uruchomiony \fIinterpreter\fP z następującymi argumentami: .PP .in +4n .EX \fIinterpreter\fP [opcjonalny\-arg] \fIpathname\fP arg... .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 where \fIpathname\fP is the pathname of the file specified as the first argument of \fBexecve\fP(), and \fIarg...\fP is the series of words pointed to by the \fIargv\fP argument of \fBexecve\fP(), starting at \fIargv[1]\fP. Note that there is no way to get the \fIargv[0]\fP that was passed to the \fBexecve\fP() call. .PP Dla zachowania przenośności na inne systemu \fIoptional\-arg\fP albo w ogóle nie powinien być podawany, albo powinien być podany jako pojedyncze słowo (nie powinien zawierać spacji); patrz UWAGI poniżej. .PP .\" commit bf2a9a39639b8b51377905397a5005f444e9a892 Od Linuksa 2.6.28 jądro pozwala, aby interpreterem skryptu również był skrypt. To uprawnienie jest rekurencyjne, aż po czterykroć, tak więc interpreter może być\ skryptem interpretowanym przez skrypt itd. .SS "Ograniczenia rozmiaru argumentów i środowiska" Większość implementacji Uniksa narzuca ograniczenia na całkowity rozmiar argumentów linii poleceń (\fIargv\fP) i środowiska (\fIenvp\fP) przekazywanych do nowego programu. POSIX.1 pozwala implementacji ogłosić te ograniczenia za pomocą stałej \fBARG_MAX\fP (albo zdefiniowanej w \fI\fP, albo dostępnej podczas wykonywania programu za pomocą wywołania \fIsysconf(_SC_ARG_MAX)\fP). .PP Before Linux 2.6.23, the memory used to store the environment and argument strings was limited to 32 pages (defined by the kernel constant \fBMAX_ARG_PAGES\fP). On architectures with a 4\-kB page size, this yields a maximum size of 128\ kB. .PP .\" For some background on the changes to ARG_MAX in Linux 2.6.23 and .\" Linux 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 Linux 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). On Linux 2.6.23 and later, most architectures support a size limit derived from the soft \fBRLIMIT_STACK\fP resource limit (see \fBgetrlimit\fP(2)) that is in force at the time of the \fBexecve\fP() call. (Architectures with no memory management unit are excepted: they maintain the limit that was in effect before Linux 2.6.23.) This change allows programs to have a much larger argument and/or environment list. For these architectures, the total size is limited to 1/4 of the allowed stack size. (Imposing the 1/4\-limit ensures that the new program always has some stack space.) Additionally, the total size is limited to 3/4 of the value of the kernel constant \fB_STK_LIM\fP (8 MiB). Since Linux 2.6.25, the kernel also places a floor of 32 pages on this size limit, so that, even when \fBRLIMIT_STACK\fP is set very low, applications are guaranteed to have at least as much argument and environment space as was provided by Linux 2.6.22 and earlier. (This guarantee was not provided in Linux 2.6.23 and 2.6.24.) Additionally, the limit per string is 32 pages (the kernel constant \fBMAX_ARG_STRLEN\fP), and the maximum number of strings is 0x7FFFFFFF. .SH "WARTOŚĆ ZWRACANA" On success, \fBexecve\fP() does not return, on error \-1 is returned, and \fIerrno\fP is set to indicate the error. .SH BŁĘDY .TP \fBE2BIG\fP Całkowita liczba bajtów środowiska (\fIenvp\fP) i listy argumentów (\fIargv\fP) jest za duża. .TP \fBEACCES\fP Brak praw do przeszukiwania dla składnika ścieżki \fIpathname\fP lub ścieżki interpretera skryptu (patrz także \fBpath_resolution\fP(7)). .TP \fBEACCES\fP Plik lub interpreter skryptu nie jest zwykłym plikiem. .TP \fBEACCES\fP Brak praw wykonywania dla pliku, skryptu lub intepretera ELF. .TP \fBEACCES\fP System plików jest zamontowany jako \fInoexec\fP. .TP \fBEAGAIN\fP (od Linuksa 3.1) .\" commit 72fa59970f8698023045ab0713d66f3f4f96945c Having changed its real UID using one of the \fBset*uid\fP() calls, the caller was\[em]and is now still\[em]above its \fBRLIMIT_NPROC\fP resource limit (see \fBsetrlimit\fP(2)). For a more detailed explanation of this error, see NOTES. .TP \fBEFAULT\fP \fIpathname\fP lub jeden ze wskaźników w wektorach \fIargv\fP lub \fIenvp\fP wskazuje poza dostępną dla użytkownika przestrzeń adresową. .TP \fBEINVAL\fP Plik wykonywalny w formacie ELF ma więcej niż jeden segment PT_INTERP (tzn. ma więcej niż jeden interpreter). .TP \fBEIO\fP Wystąpił błąd wejścia/wyjścia. .TP \fBEISDIR\fP Intepreter ELF jest katalogiem. .TP \fBELIBBAD\fP Nie został rozpoznany format interpretera ELF. .TP \fBELOOP\fP Podczas rozwiązywania \fIpathname\fP, nazwy skryptu lub interpretera ELF napotkano zbyt wiele dowiązań symbolicznych. .TP \fBELOOP\fP .\" commit d740269867021faf4ce38a449353d2b986c34a67 Osiągnięto maksymalny limit rekurencji podczas intepretacji rekurencyjnego skryptu (zob. pow. "Skrypty interpretowane"). Przed Linuksem 3.8 w takim wypadku występował błąd \fBENOEXEC\fP. .TP \fBEMFILE\fP Zostało osiągnięte ograniczenie na liczbę otwartych deskryptorów plików dla procesu. .TP \fBENAMETOOLONG\fP Ścieżka \fIpathname\fP jest zbyt długa. .TP \fBENFILE\fP Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych plików. .TP \fBENOENT\fP The file \fIpathname\fP or a script or ELF interpreter does not exist. .TP \fBENOEXEC\fP Nie rozpoznano formatu pliku binarnego, plik ten jest skompilowany dla innej architektury albo wystąpił jakiś inny błąd formatu pliku, który powoduje, że program nie może być uruchomiony. .TP \fBENOMEM\fP Brak pamięci jądra. .TP \fBENOTDIR\fP Składnik ścieżki \fIpathname\fP, ścieżki skryptu lub ścieżki interpretera ELF nie jest katalogiem. .TP \fBEPERM\fP System plików jest zamontowany jako \fInosuid\fP, użytkownik nie jest administratorem, a plik ma ustawiony bit set\-user\-ID lub set\-group\-ID. .TP \fBEPERM\fP Proces jest śledzony (trace), użytkownik nie jest superużytkownikiem, a plik ma ustawiony bit set\-user\-ID lub set\-group\-ID. .TP \fBEPERM\fP Aplikację ślepe na przywileje nie pozyskają\ pełnego zestawu dozwolonych przywilejów przyznanego przez plik wykonywalny. Zob. \fBcapabilities\fP(7). .TP \fBETXTBSY\fP Podany plik wykonywalny był otwarty do zapisu przez jeden lub więcej procesów. .SH STANDARDY .\" 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 nie opisuje zachowania #!, lecz istnieje ono (z pewnymi odmianami) na innych systemach Uniksowych. .SH UWAGI One sometimes sees \fBexecve\fP() (and the related functions described in \fBexec\fP(3)) described as "executing a \fInew\fP process" (or similar). This is a highly misleading description: there is no new process; many attributes of the calling process remain unchanged (in particular, its PID). All that \fBexecve\fP() does is arrange for an existing process (the calling process) to execute a new program. .PP Procesy z ustawionymi znacznikami set\-user\-ID oraz set\-group\-ID nie mogą być śledzone za pomocą \fBptrace\fP(2). .PP Efekt zamontowania systemu plików \fInosuid\fP jest różny dla różnych wersji jądra Linuksa: niektóre odmówią uruchomienia programów set\-user\-ID i set\-group\-ID, gdy spowodowałoby to udostępnienie użytkownikowi możliwości, którymi w danym momencie nie dysponuje (i zwrócą \fBEPERM\fP), inne po prostu zignorują bity set\-user\-ID i set\-group\-ID i pomyślnie wykonają \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). .\" Pod Linuksem \fIargv\fP i \fIenvp\fP może być podany jako NULL. W obu przypadkach, ma to ten sam skutek co podanie danego argumentu jako wskaźnika do listy zawierającej pojedynczy wskaźnik null. \fBProsimy nie wykorzystywać tej niestandardowej i nieprzenośnej pseudofunkcji!\fP Na większości innych systemów Uniksowych podanie jako \fIargv\fP wartości NULL spowoduje wystąpienie błędu (\fBEFAULT\fP). \fICzęść\fP innych systemów Uniksowych traktuje przypadek \fIenvp==NULL\fP tak samo jak Linux. .PP POSIX.1 określa, że wartości zwracane przez \fBsysconf\fP(3) nie powinny się zmieniać przez cały czas życia procesu. Jednakże od wersji 2.6.23 Linuksa zmiana limitu zasobów \fBRLIMIT_STACK\fP powoduje również zmianę wartości zwracanej przez \fB_SC_ARG_MAX\fP, żeby odzwierciedlić fakt, że zmieniły się ograniczenia przestrzeni służącej do przechowywania argumentów linii poleceń i zmiennych środowiska. .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 "Skrypty interpretowane" .\" commit 6eb3c3d0a52dca337e327ae8868ca1f44a712e02 The kernel imposes a maximum length on the text that follows the "#!" characters at the start of a script; characters beyond the limit are ignored. Before Linux 5.1, the limit is 127 characters. Since Linux 5.1, the limit is 255 characters. .PP .\" e.g., Solaris 8 .\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward Semantyka argumentu \fIoptional\-arg\fP skryptu interpretera różni się pomiędzy implementacjami. Pod Linuksem cały łańcuch znaków występujący po nazwie \fIinterpreter\fPa jest przekazywany jako pojedynczy argument. Jednakże inne systemy zachowują się inaczej. Niektóre systemy traktują pierwszy znaku białej spacji jako znak kończący \fIoptional\-arg\fP. Na innych systemach skrypt interpretera może przyjmować wiele argumentów i białe znaki \fIoptional\-arg\fP służą do ich rozdzielania. .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 Linux 2.0.34 or Linux 2.2.15. Linux (like most other modern UNIX systems) ignores the set\-user\-ID and set\-group\-ID bits on scripts. .SS "execve() i EAGAIN" Poniżej znajduje się bardziej szczegółowy opis błędu \fBEAGAIN\fP, który może wystąpić (od Linuksa 3.1) przy wywoływaniu \fBexecve\fP(). .PP .\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4 The \fBEAGAIN\fP error can occur when a \fIpreceding\fP call to \fBsetuid\fP(2), \fBsetreuid\fP(2), or \fBsetresuid\fP(2) caused the real user ID of the process to change, and that change caused the process to exceed its \fBRLIMIT_NPROC\fP resource limit (i.e., the number of processes belonging to the new real UID exceeds the resource limit). From Linux 2.6.0 to Linux 3.0, this caused the \fBset*uid\fP() call to fail. (Before Linux 2.6, the resource limit was not imposed on processes that changed their user IDs.) .PP Since Linux 3.1, the scenario just described no longer causes the \fBset*uid\fP() call to fail, because it too often led to security holes where buggy applications didn't check the return status and assumed that\[em]if the caller had root privileges\[em]the call would always succeed. Instead, the \fBset*uid\fP() calls now successfully change the real UID, but the kernel sets an internal flag, named \fBPF_NPROC_EXCEEDED\fP, to note that the \fBRLIMIT_NPROC\fP resource limit has been exceeded. If the \fBPF_NPROC_EXCEEDED\fP flag is set and the resource limit is still exceeded at the time of a subsequent \fBexecve\fP() call, that call fails with the error \fBEAGAIN\fP. This kernel logic ensures that the \fBRLIMIT_NPROC\fP resource limit is still enforced for the common privileged daemon workflow\[em]namely, \fBfork\fP(2) + \fBset*uid\fP() + \fBexecve\fP(). .PP Jeśli jednak limit zasobów nie był już przekroczony w trakcie wywołania \fBexecve\fP() (ponieważ zakończyły się inne procesy należące do tego rzeczywistego UID pomiędzy wywołaniami \fBset*uid\fP() i \fBexecve\fP()), to wywołanie \fBexecve\fP() powiedzie się, a jądro usunie flagę procesu \fBPF_NPROC_EXCEEDED\fP. Flaga jest usuwana również wówczas, gdy kolejne wywołanie do \fBfork\fP(2) przez ten proces powiedzie się. .SS Historia .\" .\" .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 Linux 2.0.34 or Linux 2.2.15. W Uniksie\ V6 lista argumentów wywołania \fBexec\fP() była kończona 0, podczas gdy lista argumentów funkcji \fImain\fP była kończona \-1. Dlatego lista argumentów przekazana do \fImain\fP nie mogła być bezpośrednio użyta w wywołaniu \fBexec\fP(). Od Uniksa\ V7 obie te wartości są NULL. .SH PRZYKŁADY Następujący program jest zaprojektowany do wykonania przez drugi program przedstawiony poniżej. Wyświetla swoje argumenty uruchomienia po jednym w wierszu. .PP .in +4n .\" SRC BEGIN (myecho.c) .EX /* myecho.c */ #include #include int main(int argc, char *argv[]) { for (size_t j = 0; j < argc; j++) printf("argv[%zu]: %s\en", j, argv[j]); exit(EXIT_SUCCESS); } .EE .\" SRC END .in .PP Tego programu można użyć do uruchomienia programu podanego w argumencie linii poleceń: .PP .in +4n .\" SRC BEGIN (execve.c) .EX /* execve.c */ #include #include #include int main(int argc, char *argv[]) { static char *newargv[] = { NULL, "hello", "world", NULL }; static char *newenviron[] = { NULL }; if (argc != 2) { fprintf(stderr, "Użycie: %s \en", argv[0]); exit(EXIT_FAILURE); } newargv[0] = argv[1]; execve(argv[1], newargv, newenviron); perror("execve"); /* execve() wraca tylko w przypadku błędu */ exit(EXIT_FAILURE); } .EE .\" SRC END .in .PP Możemy użyć drugiego programu do uruchomienia pierwszego: .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]: witaj argv[2]: świecie .EE .in .PP Możemy także użyć tych programów do pokazania używania interpretera skryptu. Aby to zrobić, tworzymy skrypt, którego "interpreterem" jest nasz program \fImyecho\fP: .PP .in +4n .EX $\fB cat > script\fP \fB#!./myecho script\-arg\fP \fB\[ha]D\fP $\fB chmod +x script\fP .EE .in .PP Następnie używamy naszego programu do wykonania skryptu: .PP .in +4n .EX $\fB ./execve ./script\fP argv[0]: ./myecho argv[1]: script\-arg argv[2]: ./script argv[3]: witaj argv[4]: świecie .EE .in .SH "ZOBACZ TAKŻE" \fBchmod\fP(2), \fBexecveat\fP(2), \fBfork\fP(2), \fBget_robust_list\fP(2), \fBptrace\fP(2), \fBexec\fP(3), \fBfexecve\fP(3), \fBgetauxval\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) .PP .SH TŁUMACZENIE Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys , Andrzej Krzysztofowicz , Robert Luberda i Michał Kułach . .PP Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3 .UE lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. .PP Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej .MT manpages-pl-list@lists.sourceforge.net .ME .