setuid 시스템콜 사용시 문제가 생깁니다.
글쓴이: seraph94 / 작성시간: 수, 2003/05/07 - 6:15오후
쉘 스크립트에서 root 권한을 갖지 못한 사용자가 IP를 변경할 수 있도록 다음과 같은 간단한 프로그램을 작성하였습니다.
[caller.c]
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #define BUF_SIZE 200 int main(int argc, char *argv[]) { char cmd[BUF_SIZE]; int i; int ret; int len; uid_t current_uid; #ifdef DEBUG fprintf(stderr, "argc=%d\n", argc); for (i=0; i<argc; i++) printf("argv[%d] = %s\n", i, argv[i]); #endif if (argc == 1) return 0; len = 0; memset(&cmd[0], '\0', sizeof(char) * BUF_SIZE); for (i=1; i<argc; i++) { if (len + strlen(argv[i]) > BUF_SIZE) return -1; strcat(cmd, argv[i]); if (i != argc-1) strcat(cmd, " "); } current_uid = getuid(); ret = setuid((uid_t)0); if (ret != 0) { fprintf(stderr, "cannot get root permission\n"); return -1; } ret = system(cmd); setuid(current_uid); return 0; }
PC에서는 아무 문제 없이 잘만 동작합니다만... ARM9 계열의 CPU(ARM920T)로 크로스컴파일하여 커널 버전 2.4.17에서 CGI 쉘 스크립트에서 실행시키면 다음과 같은 식으로 문제가 발생합니다.
(caller 라는 이름으로 컴파일하여 /sbin/ 밑에 두었고, chmod u+s 로 권한 설정도 하였습니다.)
/sbin/caller /sbin/ifconfig eth0 192.168.1.251
문제의 증상은 일단 IP 변경 후 변경된 IP 주소로 웹 접속을 하면 500 Internal Server 에러가 발생하고, 콘솔 로긴이 안됩니다. 콘솔 로긴을 한 상태에서는 root임에도 아무런 커맨드가 실행 안되고 permission denied 에러가 나는군요. ㅜㅜ
스크립트 뿐 아니라 root로 로긴한 상태에서 쉘에서 바로 실행시켜도 같은 문제가 발생합니다.
무슨 문제일까요? 참 어렵네요.
고수님들의 친절한 답변 기다리겠습니다.
Forums:
저의 소스를 보여드리지요. 혹시 몰라서요.
위 소스는 제가 웹상에서 메일이 왔는지 확인하기 위한 파일입니다.
물론 php로 실행을 하는 거죠.
그냥 setuid가 아닌 setreuid 함수를 사용해보세요.
처음의 인자를 root의 uid로 하시고, 두번째를 실제로 실행하는 유저의 uid을 주시면 됩니다.
힌트가 됐을려나 모르겠네요. setregid 도 있습니다. 자세한 건 man 페이지 참조하세요.
위 상황은 아실 거라 생각듭니다.
----
http://linu.sarang.net, http://wbhacker.tistory.com
죄송... 어이 없는 문제였습니다.
답변 감사합니다.
사실 setuid를 안써도 되는 것이었구요.
임베디드라 eth0로 NFS를 root 마운트했는데... eth0의 IP를 바꿔버리니 당연히 문제가 생겼던 것이지요. 좀 어이가 없죠? =.=;
댓글 달기