2010-05-07 6 views
3

내 시스템의 사용자가 C 코드를 받게 될 것이므로 즉시 생성되는 chroot 샌드 박스에서 컴파일하고 실행하려면 내 시스템이 필요합니다. 가능한 한 상자에 들어있는 파일 수가 가장 적습니다. 컴파일러와 링커 설정 (예 : 정적 링크, 내가 찾을 수 있기를 기대할 수있는 모든 것)을하고, 코드가 사용할 것으로 예상되는 것에 대해 약간의 제한을 가하는 (예 : 임의의 libs를 사용할 수 없음) 경우에만 사용할 수 있습니다.Linux에서 프로그램을로드하는 데 필요한 파일 수는 얼마입니까?

질문은 얼마나 간단하게 샌드 박스를 얻을 수 있는가입니다. 분명히 실행 파일이 필요하지만 시스템 호출을위한 ELF 로더와 .so는 어떨까요? 나는 그들 중 하나를 덤프 할 수 있고 내가 필요로 할 다른 것이있을 수 있습니까?

답변

3

당신은 정적으로 링크 안녕하세요 세계를 실행하는 실행 파일을 제외하고 아무것도 필요하지 않습니다. 더 그것을 컴파일 당신은 물론, 많이 필요합니다.

당신은 나는 다음과 같은 사소한 C 코드로 그렇게, 아주 쉽게 테스트 할 수 있습니다 :

#include <stdio.h> 
int main() { 
    puts("Hello, world\n"); 
    return 0; 
} 

는 GCC -static으로 컴파일. 그런 다음 새 디렉토리 ("chroot-dir"이라고 함)를 만들고 출력 ("hello")을 그 디렉토리로 이동하십시오. chroot의 유일한 파일은 이제 실행 파일입니다. chroot chroot-dir ./hello을 실행하면 안녕하세요, 세계이 표시됩니다.

정적으로 컴파일 할 수없는 몇 가지 사항이 있습니다. 예를 들어, 프로그램이 PAM을 통해 인증을 수행하면 PAM 모듈은 항상 동적으로로드됩니다. 또한/etc에있는 다양한 파일들은 특정 호출에 필요합니다. getpw * 및 getgr * 함수, 도메인 이름 확인 함수 등은 nsswitch.conf (일부 조회, 설정 파일에 따라 구성 파일 및 경우에 따라 실행 파일이 더 필요함) /etc/hosts, /etc/services , /etc/protocols은 모든 네트워킹에 매우 유용 할 것입니다.

프로그램에서 사용하는 파일을 쉽게 파악할 수있는 한 가지 방법은 strace로 실행하는 것입니다. 물론 프로그램을 먼저 신뢰해야합니다.

+0

아주 좋은 대답입니다! 시스템 전반에서 사용할 수있는 것을 표준화하는 데 어떤 것이 필요할지 궁금합니다. 보편적으로 액세스 할 수있는 기능 만 액세스 할 수 있습니다. – BCS

0

ELF 로더가 필요하지 않습니다. 어떤 동적 라이브러리가 필요한지 확인하려면 ldd <executable>. 모든 것을 정적으로 컴파일하면, .so은 필요 없습니다. 그 외에도 프로그램에 필요할 수있는 데이터 및 디렉토리 구조에 관한 것입니다.

그러나이 모든 것은 사용자가 /usr/bin/chroot 명령을 사용하는 경우에만 해당됩니다. 프로그램에 int chroot(const char *path);을 호출하면 모든 동적 라이브러리가로드 된 후 디렉토리 샌드 박스에 아무 것도 필요하지 않습니다. 실행 파일 자체조차도 아닙니다.

편집 : 다른 생각 :. TCC (또는 오히려, libtcc 컴파일, 링크, 부하 주어진 C 청크를 실행하는 데 사용할에 '외부'의 chroot 감옥 내부의 전체 프로세스를 실행에 '내부'에 하락 (빈) 하나를 실행하기 직전에 실행하라. (물론 fork()를 실행하면 '내부'감옥에서 벗어나 '외부'감옥으로 탈출 할 수 없다.) libtcc 's 의 결합 검사 실행.

+1

** 신뢰할 수없는 실행 파일에서 ldd를 ** 실행해서는 안됩니다! ldd는 실제로 * 실행 파일을 실행합니다. – derobert

+0

글쎄, 그것은 실행 파일이 아니며, 컴파일 한 C 소스 코드이다. 물론, 그것은 그렇게 신뢰하지 않습니다; chroot() 호출을 삽입하고 정적으로 컴파일 할 수 있습니다. 감옥에 아무런 도움없이 행동하는 모든 원천이 있어야합니다. 아직도 다른 것이 필요하다면, 나는 그것을 잘 행동한다고 ​​부르지 않을 것입니다. – Javier

+0

나는 프로그램에 chroot를로드하도록 생각하고 있었다. – BCS

관련 문제