2012-06-23 6 views
4
이것은 내가 아래에 설명하겠습니다 세 부분으로 질문, 실제로

으로 "사용 권한이 거부되었습니다"하지만 질문은 다음과 같습니다 GDB를 사용는이 setuid 프로그램을 디버깅/setuid를

  • , 어떻게 내가의 일부를 실행할 수 있습니다 루트 권한이있는 프로그램, 나머지는 정상입니까?
  • mkstemp를 사용하여 setuid (루트로) 프로그램의/tmp 에 파일을 만드는 "권한이 거부되었습니다"라는 메시지가 나타나는 이유는 무엇입니까?
  • "sudo program_name"은 setuid를 사용하여 ./program_name과 달리 root로 실행하는 이유는 무엇입니까?

정상적인 권한을 가진 사용자가 일반적으로 실행하는 Linux (여러 배포판)에서 실행되는 C 프로그램이 있지만 프로그램의 일부는 루트 권한으로 실행되어야합니다. 이를 위해, 나는 set-UID 플래그를 사용했다. 그리고 그것이 가능한 한 잘 동작한다.

그러나 지금은 일반적인 사용자 권한으로 프로그램을 디버그하고 싶습니다. catch-22가 있습니다. 방금 임시 파일 (/ tmp/my_name-XXXXXX)을 작성하는 함수를 추가했으며이 함수는 프로그램 내의 많은 지점에서 호출되었습니다. (. 물론, 실제 이름이 다름)

sh: /tmp/my_name-hhnNuM: Permission denied 

그럼에도 불구하고,이 프로그램은 내가 절대적으로 수행 할 수 없다는 것을 알아 원시 소켓 기능을 수행 할 수 있습니다 : 어떤 이유로 실행하는 경우,이 함수는 다음과 같은 메시지가 발행 root가 아닌 사용자. (setuid 플래그를 제거하면 프로그램이 비참하게 실패합니다.)

이 프로그램을 gdb를 통해 sudo없이 실행하면 원시 소켓에서 죽게됩니다 (gdb는 분명히 ~ 또는 아마 ~ 할 수 없기 때문에). 프로그램의 setuid 플래그). "sudo gdb"에서 실행하면 모든 것이 정상적으로 작동합니다. 내가 sudo는 ./my_name "로 실행하면 모든 것이 잘 작동 여기

그 프로그램은 ls -l 출력이다. 그래서

-rwsr-xr-x 1 root root 48222 Jun 23 08:14 my_name 

내 질문에, 특별한 순서 :

  • gdb에서 다른 유효한 UID를 사용하여 프로그램의 다른 부분을 실행할 수 있습니까?
  • ./program이 루트로 set-uid를 사용하는 경우 "sudo ./program"과 "./program"이 다른 이유는 무엇입니까?
  • setuid (root로) 프로그램에서 일반 사용자가 호출 할 때 mkstemp가 실패하는 이유는 무엇입니까?

답변

2

1 GDB에서 제대로 setuid를 응용 프로그램을 디버깅 할 수있는 유일한 방법은 루트로 GDB를 실행하는 것입니다. setuid 응용 프로그램에 대해이 작업을 수행하는 가장 현명한 방법은 응용 프로그램이 시작된 후에 응용 프로그램에 연결하는 것입니다.

다음
sudo gdb <application> <pid> 

당신이 첨부되어 다음 사용 GDB를 첨부

kill(getpid(), SIGSTOP); 

이이 시점에서 중지를 원인 :이 일에 대한 빠른 트릭은 setuid를 응용 프로그램에 한 줄을 추가하는 것입니다 응용 프로그램을 정상적으로 디버깅 할 수 있습니다.

sudo는 현재 사용자의 환경에서 다양한 항목을 루트 사용자의 환경으로 내보낼 수 있으므로 규칙을 변경합니다. 이것은 전적으로 현재의 sudo 구성에 의존하며 setuid 응용 프로그램과는 다른 환경을 남겨 둘 수 있습니다. 따라서 응용 프로그램을 중지 한 다음 런타임에 첨부하는 등의 트릭에 의존해야합니다.

또한 sudo에서 실행할 때 실제로 그렇지 않은 setuid 환경에서 실행 중인지 감지하는 논리가있을 수 있습니다. sudo는 모든 프로세스의 id 필드 (실제 uid, 유효 uid 및 저장된 uid)를 setuid와 같은 값으로 설정합니다 (실제 uid는 여전히 원래 호출자의 값입니다). getresuid() 호출을 사용하여 세 변수의 상태를 확인할 수 있습니다.

Permission Denied 메시지의 접두사는 sh:입니다. 이것은 파일에 액세스하려고하는 다른 하위 프로세스가 실행 중임을 의미합니다. mkstemp를 호출 한 후에 하위 프로세스가 파일을 읽을 수 있도록 파일을 읽을 수있는 권한을 풀고 싶을 수 있습니다.

+0

원더풀! mkstemp()를 사용하여 전자 메일 메시지를 만든 다음 sendmail이 파일을 읽고 보낸 것입니다. 물론, 센드 메일 프로세스가 그 부모의 권한을 채택하지 않았다는 사실이 나에게는 발생하지 않았습니다. AS/400/iSeries/System i 플랫폼은 일반적으로 다음과 같은 프로그램을 지원합니다. 이러한 채택은 당연한 일이며, 제 변명입니다. 고맙습니다. 그리고 "실행중인 프로세스를 디버깅하는 방법"알림을 보내 주셔서 감사합니다! – Dennis