2011-06-12 2 views
0

저는 Ubuntu 11.04를 실행하고 있습니다.Ubuntu에서 setuid를 사용하여 C에서 Java exec

Java 프로그램을 실행하기 위해 "C"execlp 프로그램을 사용하려고하는데 Java 프로그램이 루트로 실행될 수 있도록 "C"프로그램에서 setuid를 원합니다. 여기의 예입니다 :

http://www.coderanch.com/t/110254/Linux-UNIX/setuid

내가 대신 바람둥이 사용자가되는 것을 제외하고 문자로 예를 따라, 나는 루트를 사용했다.

루트는 Java 프로그램을 실행하는 "C"프로그램을 실행할 수 있습니다. root 권한을 부여하기 전에 User (me)는 Java 프로그램을 실행하는 "C"프로그램을 실행할 수 있습니다. 하지만 setuid를 사용하기 위해 일단 설정을하면 사용자는 프로그램을 실행하려고 시도합니다. 자바 : 나는 오류의 LD_LIBRARY_PATH 유형 것으로 보인다 것을 얻을 오류가 공유 라이브러리를로드하는 동안 : libjli.so : 공유 객체 파일을 열 수 없습니다 :

가 libjli.so 파일은 아래에있는 해당 파일이나 디렉토리를 자바 JRE. User와 Root 모두 개별적으로 실행될 때이 파일을 볼 수 있습니다. 그러나 root에게 setuid가 수행 된 후 사용자가 프로그램을 실행할 때이를 볼 수 없습니다.

setuid 프로그램을 실행할 때 root의 LD_LIBRARY_PATH가 설정되는 방식이 있습니까? 이것은 대화식 대 비 대화식 문제입니까?

아이디어가 있으십니까? 미리 감사드립니다.

답변

0

LD_* 환경 변수를 사용하여 프로세스에 코드를로드 할 수 있으므로 setuid 바이너리에 의해 무시됩니다. 아마도 setuid 바이너리를 C 프로그램을 실행하는 래퍼로 만들 필요가있을 것이다.

+0

바로 지금 Java 프로그램을 래핑하는 C 프로그램이 있습니다. Java 프로그램을 래핑하는 C 프로그램을 래핑하는 스크립트를 사용 하시겠습니까? 아니면 뭔가 다른 것을 의미 했습니까? 나는 그것이 무엇이든지 시도하려고합니다. 설명해주십시오. 감사. –

+0

넵 - 스크립트 나 다른 C 프로그램으로,'LD_LIBRARY_PATH'를 적절하게 설정하고 C 프로그램을 exec()합니다. – duskwuff

+0

나는 이것이 효과가 있다고 생각하지 않는다. 링커는 프로세스의 EUID와 RUID에서 setuid 비트를 감지하며,이 값은'exec'에서 보존됩니다. –

0

파일의 setuid 비트를 설정하면 프로세스의 유효 UID는 변경되지만 실제 UID는 변경되지 않습니다. 동적 링커는 EUID ≠ RUID인지 확인하고, 그렇다면 모든 환경 변수를 무시합니다. 래퍼는 환경 변수 자체를 필터링해야하고 (중요!) 실제 UID를 변경하면 유효 UID와 일치하게됩니다.

경고 : 상자에 모든 사람에게 완전한 루트 액세스 권한을 부여하지 않는 한 환경 변수를 잘 청소하는 것을 잊지 마십시오.

+0

나는 이전 상자를 잘못 기입했을 수도 있습니다. 환경 변수를 제거함으로써 "C"래퍼에서 Java 프로그램을 "exec"하기 전에 최소한의 환경 변수 집합 만 제시해야한다는 것을 의미합니까? –

+0

이상. 또한 환경 변수가 값을 허용하는지 점검해야합니다. 필요한 모든 것이 ICMP 핑이라면, 이것을 거꾸로 진행할 것입니다. Ping 기능을 C 프로그램에 넣고 그 프로그램을 루트로 실행 시키십시오. 이것은보다 안전하고 덜 복잡합니다. –

0

은 setuid 프로그램에 LD_* 환경의 제약 조건 해결하려면, 대부분의 POSIX 시스템에서 당신은 당신의 래퍼 코드 내에서이 작업을 수행 할 수 있어야한다 :에 실제 효과적인 UID를 모두 설정합니다

setreuid(0, 0); 

root 일 수 있지만, 프로그램 자체가 setuid 비트가 활성화 된 상태로 시작된 경우에만 작동합니다.

나는 그렇게하지 않을 것이다.

Java 프로그램을 루트 권한으로 실행해야하는 이유와 루트 권한으로 실제로 실행하지 않고 필요한 권한을 부여하는 더 좋은 방법이 있는지보십시오.

+0

내 요구 사항은 Java 프로그램이 OS 명령을 사용하지 않고 ICMP 핑을 수행하는 것입니다 (즉,/usr/bin/ping을 사용할 수 없음). Java의 InetAddress 클래스는 isReachable 메소드에서 icmp ping을 수행하지만 루트로 실행되는 경우에만 수행합니다. –

+0

이것을 추가하는 것을 잊었습니다. 나는 약간의 경고에 대해 우려하고있다 : –

+0

미안하지만, 반격을하는 것 같아서 내 의견을 조기에 보냈다. 나는 "환경 변수를 수정하는 것"에 대해 걱정하고 있습니다. 이것은 내가 다른 말로 이어질 수있는 것처럼 들린다. 왜냐하면 나는이 의미가 무엇인지 아직 이해할만큼 똑똑하지 않기 때문이다. 제가이 주제에 관해 읽을 수있는 것을 가르쳐 주시겠습니까? 그리고 제가받은 도움에 대해 대단히 감사드립니다. –