system()함수 사용에 관하여...

불량청년의 이미지

개인적으로 쉘에서 어떠한 작업을 많이 하게 하는 프로그램을 C로 만들
었습니다. 그런데 파이프나 exec함수군을 사용하지 않고 system()함수를
사용했습니다. 어디선가 보안에 문제가 된다고 하는데...
컴파일한 바이너리 코드를 보니 코드섹션에 쉘에서 수행되는 명령어가
그대로 있는거 같은데... 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;

if (command == 0)
return 1;
pid = fork();
if (pid == -1)
return -1;
if (pid == 0) {
char *argv[4];
argv[0] = "sh";
argv[1] = "-c";
argv[2] = command;
argv[3] = 0;
execve("/bin/sh", argv, environ);
exit(127);
}
do {
if (waitpid(pid, &status, 0) == -1) {
if (errno != EINTR)
return -1;
} else
return status;
} while(1);
}


Quote:

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() 가 실패했다는것을 확실히 가리키지 않는다;
확신을 위해 errno 를 검사해라.

dotri의 이미지

system() 함수의 가장 큰 문제점은
내부적으로 exec( "/bin/sh", args ); 를 실행한다는 점입니다.
다시 말하면 system( "/bin/ls" ); 했을때 이것은 내부적으로
exec( "/bin/sh", "/bin/sh", "/bin/ls" ); 한것과 똑같은 거라는건데요
주어진 명령을 쉘을 사용해 실행한다는것은 사용자가 메타문자를 사용할 수 있음을 의미합니다.
가령 예를 들어서

system( "/usr/sbni/sendmail user@somehost.com < hello.txt" );
이 문장을 실행한다고 했을때 user@somehost.com 을 사용자로부터 입력받는 상황을 볼 수 있겠습니다. 만약 사용자가 "user@somehost.com" 같은 올바른 Email 주소 대신, "user@somehost.com;rm -rf /" 와 같은 메타문자가 포함된 쉘 명령을 사용한다면 system() 함수는 이를 여과없이 실행시키게 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.