setuid 시스템콜 사용시 문제가 생깁니다.

seraph94의 이미지

쉘 스크립트에서 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로 로긴한 상태에서 쉘에서 바로 실행시켜도 같은 문제가 발생합니다.

무슨 문제일까요? 참 어렵네요.
고수님들의 친절한 답변 기다리겠습니다.

조성현의 이미지

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
        char *com;

        if (argc != 2) return 1;
        if (strpbrk(argv[1], "..") != NULL) printf("error\n");

        setreuid(1038, 99);
        sprintf(com, "/bin/cat /home/member/ntames8/Maildir/new/%s", argv[1]);
        system(com);
        return 0;
}

위 소스는 제가 웹상에서 메일이 왔는지 확인하기 위한 파일입니다.
물론 php로 실행을 하는 거죠.

그냥 setuid가 아닌 setreuid 함수를 사용해보세요.
처음의 인자를 root의 uid로 하시고, 두번째를 실제로 실행하는 유저의 uid을 주시면 됩니다.

힌트가 됐을려나 모르겠네요. setregid 도 있습니다. 자세한 건 man 페이지 참조하세요.

Quote:
$ ll public_html/readMail
-rwsr--r-x 1 ntames8 member 14123 Mar 26 22:16 public_html/readMail
$

위 상황은 아실 거라 생각듭니다.

seraph94의 이미지

답변 감사합니다.

사실 setuid를 안써도 되는 것이었구요.
임베디드라 eth0로 NFS를 root 마운트했는데... eth0의 IP를 바꿔버리니 당연히 문제가 생겼던 것이지요. 좀 어이가 없죠? =.=;

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.