보안상에 문제가 있다고 하여, exec시리즈 함수로 대체하려고 하였다. (참조 exec 시리즈)
※ 아래는 system 함수 문제점
Quote:
Do not use system() from a program with suid or sgid privileges, because strange values for some environment variables might be used to subvert system integrity. Use the exec(3) family of functions instead, but not execlp(3) or execvp(3). system() will not, in fact, work prop- erly from programs with suid or sgid privileges on systems on which /bin/sh is bash version 2, since bash 2 drops privileges on startup. (Debian uses a modified bash which does not do this when invoked as sh.)
The check for the availability of /bin/sh is not actually performed; it is always assumed to be available. ISO C specifies the check, but POSIX.2 specifies that the return shall always be non-zero, since a system without the shell is not conforming, and it is this that is implemented.
It is possible for the shell command to return 127, so that code is not a sure indication that the execve() call failed.
SEE ALSO sh(1), signal(2), wait(2), exec(3)
한글로..
Quote:
버그 libc 버전의 system() 이 인터럽트를 무시한다는 것은 매우 불행한 일이다. 이것은 함수 후출시 루프에서 인터럽트할수 없게 되도록 프로그램을 만든다. 이것은 그런 목적의 프로그램은 system() 이 아닌 개인 버전의 함수를 사용해야 한다.(경고: 테스트된 코드가 아니다!)
int my_system (const char *command) { int pid, status;
suid 나 sgid 우선권이 있는 프로그램에서는 system() 을 사용하지 마라. 왜냐하면 몇몇 환경 변수들을 위한 이상한 값들이 시스템을 오작동시킬수 있기 때문이다. 대신에 exec(3) 계열의 함수를 사용해라. 그러나 execlp(3) 나 execvp(3)은 제외해라. 사실 system() 함수는 /bin/sh 이 bash 버전 2인 시스템에서 suid 나 sgid 우선권이 있는 프로그램에서는 잘 작동하지 않는다. 왜냐하면 bash 2는 시작시 우선권을 없애기 때문이다. (Debian은 sh처럼 구동시 이것을 하지 않는 수정된 bash를 사용한다.)
/bin/sh 의 유용성 검사는 실제적으로는 행해지지 않는다; 항상 유효하다고 가정한다. ISO C는 검사를 지정하지만, POSIX.2는 리턴 값은 항상 0 이 아닌 값이어야 한다고 지정한다. 왜냐하면 shell이 없는 시스템은 행해져서는 안되기 때문이다.
반환 값 127은 shell 명령어에서 가능하다. 그러므로 이 반환 값은 execve() 가 실패했다는것을 확실히 가리키지 않는다;