2013-09-07 4 views
3

사용자가 fakeroot와 같은 도구를 사용하고 있는지 여부를 신경 쓰지 않고 사용자가 루트인지 알고 싶습니다. 사용자가 루트인지 fakeroot인지 어떻게 알 수 있습니까?

나는 기능 getuid(), geteuid()getlogin()을 시도,하지만 난 fakeroot 명령을 실행하면 이들 각각은 root 대신 내 자신의 계정 정보를 전송한다. 이 코드에 대한

: 내가 좋아하는 뭔가를 좀하고 싶습니다 때

% fakeroot ./busybox rm 
1000 1000 julien 

하기 :

0 0 root 

(로그인이 충분하다 여기

printf("%d %d %s\n", getuid(), geteuid(), getlogin()); 

내가 무엇을 얻을)

+0

'fakeroot'의 정의에 따라 프로그래밍 방식으로 차이를 만들 수 없어야합니다. 최소한 바이너리가 동적으로 링크되어 있다면 ('fakeroot'는'LD_PRELOAD' 트릭을 사용합니다). –

+0

@BasileStarynkevitch 왜 'fakeroot whoami'라고 입력하면 '뿌리'를 얻을 수 있습니까? –

+0

약간 이상합니다.'fakeroot'는'get * uid' 호출을 가로 챕니다. 'busybox'는 정적 libc에 대해 컴파일됩니까? – nneonneo

답변

3

nneonneo가 올바른 이유를 얻었으나 해결책은 Fakeroot-ng입니다. 그것은 이 아닌 ptrace과 시스템 콜 인터셉터를 사용하며, 정적 링크와 호환이 가능하고, 훨씬 강력하며, libc 내부에서 호출 된 호출을 처리 할 수있는 라이브러리 호출 인터 셉션을 사용합니다 (그렇지 않으면 연결할 수 없음).

+0

아, 귀엽다. 나는 그것이'ptrace' 마법으로 가능하다고 생각했습니다; 누군가 실제로 그것을했는지를 아는 것은 좋은 일입니다. – nneonneo

+0

BTW 현재 리눅스의 모든 아치를 지원하는 아키텍쳐와 자원의 차이점으로 인해 상당히 제한적이지만, 새로운 "seccomp2"'ptrace' 인터페이스로 거의 아치에서 시스템 콜을 차단하고 필터링 할 수 있습니다 - 진단 방법. sececp2 방식을 사용하도록 Fakeoot-ng를 수정하면 훨씬 더 이식성 있고 실용적입니다. –

+0

@nneonneo 고마워, 너희 둘 중 누가 내 대답을 얻었는지 알 수 없다. 완벽하게 작동한다. (sudo에서도 실행되어야한다.) –

4

다음과 같이 표시됩니다. 이진 파일 (busybox)이 정적 파일 libc에 대해 컴파일 된 경우 fakeroot은 동적 라이브러리 사전로드를 사용하여 다양한 libc 함수에 대한 호출을 가로 채고 대체하지만이 방법은 동적으로 libc에 링크 된 경우에만 작동합니다. 정적으로 링크되어있는 경우 함수 호출은 이진 내부의 실제 호출에 바인딩되므로이를 가로채는 방법은 없습니다.

+0

좋아, 고맙다고 생각하지 않았다. 고맙습니다. –

관련 문제