2012-04-03 4 views
5

현재 ACM과 같은 공공 프로그래밍 콘테스트 시스템의 백엔드에서 작업 중입니다. 그러한 시스템에서 모든 사용자는 일부 계산 문제를 해결하기 위해 컴파일되고 자동으로 실행되는 코드 소스를 제출할 수 있습니다 (즉, 사람 눈 사전 검토가 수행되지 않음을 의미).GNU/리눅스 시스템 호출을 금지하는 방법

백엔드는 GNU/Linux 전용 시스템으로, 각 참가자가 사용자 그룹에 포함되는 사용자를 생성합니다. 특정 사용자가 보낸 소스는 사용자의 홈 디렉토리에 저장되고 컴파일 및 실행되어 다양한 테스트 케이스에 대해 검증됩니다.

내가 원하는 것은 소스에 대한 Linux 시스템 호출의 사용을 금지하는 것입니다. 이는 문제가 플랫폼 독립적 인 솔루션을 필요로하는 반면 안전하지 않은 소스에 대한 시스템 호출을 가능하게하는 것은 잠재적 인 보안 위반이기 때문입니다. 이러한 소스는 FS에 성공적으로 배치 될 수 있으며 심지어 컴파일 되더라도 실행되지 않을 수 있습니다. 나는 또한 시스템 호출을 포함하는 소스가 전송 될 때마다 통보 받기를 원한다. - 시스템에 이미 확인, 아직 컴파일되지 소스

  • 프런트 엔드/사전 컴파일 분석 : 지금까지

    , 나는 그런 검사가 배치 될 수있다 다음과 같은 장소를 참조하십시오. 시스템 호출 이름에 대한 간단한 텍스트 검사기. 플랫폼에 의존적이고 컴파일러에 독립적이며 언어 별 솔루션입니다.

  • 컴파일러 패치 - 시스템 호출이 발생할 때마다 GCC (또는 툴 체인에 포함 된 다른 컴파일러)를 중단합니다. 플랫폼에 의존적이고, 컴파일러에 의존하며, 언어 독립적 인 솔루션입니다 (우리가 체커를 "충분히 멀리 배치"한다면). 호환성이 손실 될 수도 있습니다. 사실, 나는이 대안을 가장 싫어한다.
  • 런타임 검사 프로그램 - 시스템 호출이 프로세스에서 호출 될 때마다이 프로세스와 보고서를 종료하십시오. 이 솔루션은 컴파일러와 언어에 독립적이지만 플랫폼에 따라 달라집니다. 비슷한 플랫폼에서 백엔드를 단기 및 중기에 배포 할 것이므로이 솔루션은 플랫폼에 달려 있습니다.

그래서 질문은 : GNU/리눅스 시스템을 금지 관리자가 사용자 그룹, 사용자 또는 특정 프로세스에 대한 사용을 호출 할 수있는 기회를 제공합니까? 보안 정책 일 수도 있고 경량의 GNU 유틸리티 일 수도 있습니다.

Google에 시도했지만 Google에서 오늘 나를 싫어했습니다.

+0

_ 프론트 엔드/사전 컴파일 분석 _ ← 프리 프로세서 트릭이이를 쉽게 피할 수 있습니다. 프로세스가 미리 열어 둔 파이프에 대해서만 읽기/쓰기를 할 수있는 모드 인'seccomp '가있다. 그것은'prctl()'호출을 통해 가능합니다. 비슷한 질문이 여기에 있으므로 http://www.google.com/search?q=seccomp+site%3Astackoverflow.com&btnG=Buscar&oe=utf-8 – ninjalj

+0

@ninjalj 시도했지만 찾지 못했습니다. 링크를 공유하고 싶습니까? – iehrlich

+0

그냥 내 이전 댓글에 대한 링크를 추가했습니다. – ninjalj

답변

7

모드 1 seccomp 프로세스가 정확히 네 콜에 자신을 제한 할 수 있습니다 : read, write, sigreturn_exit. seccomp-nurse처럼 심각하게 샌드 박스 코드에 사용할 수 있습니다.

mode 2 seccomp (작성 당시, Ubuntu 12.04에서 찾거나 자신의 커널을 패치 함) syscalls 필터링에 더 많은 유연성을 제공합니다.예를 들어, 먼저 필터를 설정 한 다음 exec 테스트중인 프로그램을 설정할 수 있습니다. chroot 또는 unshare의 적절한 사용은 "재미있는"것을 재사용하지 못하도록 막을 수 있습니다.

+1

@suddnely_me seccomp가 밖으로 나가지 않는 경우 다른 대안을 생각해 보았습니다. [Naero] (https://developers.google.com/native-client/) 기반 [ZeroVM] (http : /zerovm.org/). – ephemient

3

시스템 호출을 더 잘 정의해야한다고 생각합니다. 나는

cat <<EOF > hello.c 
#include <stdio.h> 
int main(int argc,char** argv) { 
    fprintf(stdout,"Hello world!\n"); 
    return 0; 
} 
EOF 
gcc hello.c 
strace -q ./a.out 

도 분명히 사소한 프로그램은 ~ (27) 시스템 호출을 것으로 보여, 의미한다. "표준 C 라이브러리"에 대한 호출을 허용하려고하지만 시스템 호출에 대해서는 차례대로 구현됩니다. 내가 말하고자하는 것은 런타임 검사가 당신이 생각하는 것보다 덜 실현 가능하다는 것입니다 ( strace 또는 유사 어쨌든 사용).

관련 문제