2009-09-30 2 views
3

학생들이 파이썬 코드 솔루션을 간단한 파이썬 문제로 제출할 수있게하고 싶습니다. 내 응용 프로그램은 GAE에서 실행됩니다. 어떻게하면 sumicios 코드에서 위험을 제한 할 수 있습니까? 나는 이것이 어려운 문제임을 깨닫고 관련된 Stackoverflow와 그 주제에 대한 다른 글들을 읽었습니다. GAE 환경에서 제한 사항을 적용하면 신뢰할 수없는 코드가 가할 수있는 손상을 제한하는 것이 더 간단 해지는지 궁금합니다. 제출 된 코드에서 몇 가지 제한된 키워드 (exec, import 등)를 검사 한 다음 코드가 고정 된 시간보다 오래 실행되는지 확인하거나 신뢰할 수없는 코드를 샌드 박스로 저장하기가 여전히 어려운지 확인하십시오. 복원 된 GAE 환경? 예를 들면 :GAE의 Python에서 신뢰할 수없는 코드를 실행할 위험을 최소화하는 가장 좋은 방법은 무엇입니까?

# Import and execute untrusted code in GAE 
untrustedCode = """#Untrusted code from students.""" 

class TestSpace(object):pass 
    testspace = TestSpace() 

try: 
    #Check the untrusted code somehow and throw and exception. 
except: 
    print "Code attempted to import or access network" 


try: 
    # exec code in a new namespace (Thanks Alex Martelli) 
    # limit runtime somehow 
    exec untrustedCode in vars(testspace) 
except: 
    print "Code took more than x seconds to run" 
+1

학생들은 [위험한 코드 제출]을하지 않을 것입니다 :-) – mjv

답변

5

@ MJV의 웃는 주석입니다 실제로-에 자리 : 제출자가 확인되고 (아마도 작업 대기열로 전송 될 것입니다) 문제의 코드와 연결되어 있는지 확인하고 로그 개인의 제출으로 인한 진단. 그 너머

, 당신은 실제로 (더 제한의 테스트 공간을 준비 할 수 덕분에 특별한을 포함하여 승인 ;-)에 대한 '내장'는 학생들이 사용할 수 있도록 할 모든이 있고 __import__ &을 재정의 기음. 그것에 더하여 exec, eval, import, __subclasses__, __bases__, __mro__, ...을 금지하는 토큰 패스가 더 가깝습니다. GAE 환경에서 완전히 안전한 샌드 박스는 그러나 학생들이 허용되는 언어의 작은 하위 목록을 허용하지 않는 한 정말 어려운 문제입니다.

그래서 계층화 된 접근 방식을 제안합니다. 학생이 업로드하고 코드를 실행하는 샌드 박스 GAE 앱은 근본적으로 걱정할 필요가없는 지속적인 레이어를 가지고 있습니다. 오히려 신뢰할 수없는 코드를 전혀 실행하지 않고 각 요청을 매우 비판적으로 확인할 수있는 다른 앱에 urlfetch 요청을 보내 "지속"합니다. 화이트리스트를 통한 기본 거부는 여전히 성배이지만 보안을위한 추가 레이어를 사용하면 블랙리스트에 기본 동의를 할 수 있습니다 ...

+0

이보기를 기반으로, Python 테스트 및 솔루션 쌍을 Linux 시스템에 다운로드하여 실행하는 것이 더 간단하고 안전하다고 생각합니까? 임시 리눅스 사용자 계정? 다시 돌아 가야 할 필요가있는 것은 실행 된 텍스트 출력뿐입니다. 실행 후 바로 임시 Linux 계정을 삭제하여 악령을 제거 할 수 있습니다. – Chris

+0

@Chris, 확실히 - 신뢰할 수없는 코드가 계정 (제한적인 할당량이있는 서비스는 거부 될 수 있으므로 특히 서비스 거부 공격을 시도 할 수없는 경우)에서 실행되도록 조치 할 수있는 경우 - 실행중인 시스템과 , 다른 어떤 것도) 당신은 훨씬 더 안전합니다. sysadms는 "영원히 이후"신뢰할 수없는 사용자 (inc. 학생)에게 학생들이이 배치에서 얻는 것보다 훨씬 더 많은 자유를 가진 계정을 제공하지만 성공적인 권한 상승 ("루트킷"; -) 공격. –

2

App Engine 내부에서 실제로 파이썬 코드를 샌드 박스로 저장할 수 없습니다 어느 정도의 확실성. Alex가 생각한대로 누가 누가 좋은 것을 실행하고 있는지 기록하는 것이지만, 사용자가 샌드 박스를 벗어나면 이벤트 로그를 지울 수 있습니다. 이 정보가 안전 할 수있는 유일한 장소는 사용자가 지울 수 없으므로 요청 별 로깅입니다.

모래 상자에 파이썬을 넣으려는 시도의 좋은 예를 보려면 this post을 참조하십시오. Guido가 Python을 안전하게 사용하려면 this post을 참조하십시오.

두 가지 옵션이 있습니다. 언어를 자유롭게 선택할 수 있으면 Java 런타임에서 Rhino (자바 스크립트 인터프리터)를 실행할 수 있습니다. Rhino는 멋지게 샌드 박스 처리되었습니다. Jython을 사용할 수도 있습니다. 샌드 박스를 사용하는 것이 실용적인지는 모르겠지만 가능성이 높습니다.

알렉스의 제안은 별도의 앱을 사용하는 것도 좋은 방법입니다. 이것은 shell.appspot.com이 취하는 접근 방식입니다. 악의적 인 일을 막을 수는 없지만 앱 자체는 아무 것도 저장하지 않으므로 아무런 해가 없습니다.

+0

감사합니다. Nick. shell.appspot.com이 익명 사용자가 이미 appspot에서 신뢰할 수없는 코드를 실행하도록 허용 한 경우이 예제 앱은 이미 신뢰할 수없는 코드 문제를 해결하지 않았습니까? 코드가 실행될 수있는 시간을 제한하고 URL 가져 오기에 대한 액세스를 제한하는 한, 내 셸 복사본에서 학생이 수행 할 위험은 무엇입니까? 다른 말로하면, 왜 내 학생이 내 앱을 악용하려고 시도했는지에 관계없이 shell.appspot.com을 익명으로 남용 할 수는 없습니까? – Chris

+0

글쎄, 그 문제를 어느 정도 무시함으로써 문제를 다루고 있습니다. 쉘 앱 자체는 샌드 박스가되어 있지만, 원하는대로 할 수는 없지만 샌드 박스에서 벗어나 해를 입을 수는 없습니다 다른 응용 프로그램에 추가하거나 다른 사용자의 쉘 ​​응용 프로그램을 수정하십시오. 학생이 사용할 수있는 시간을 직접 제한 할 수는 없지만 런타임 시스템은 30 초 후에 요청을 종료합니다. URLFetch를 사용하는 것을 막을 수는 없지만 다소 어렵게 만들 수도 있습니다. –

+0

다시 한 번 감사드립니다. Nick. 나는 GAE 셸 응용 프로그램을 수정하고 내 문제와 학생 솔루션을 문자열로 전달하는 길을 가고 있다고 생각합니다. shell.appspot.com에서 문자열을 평가하고 문제를 확인할 수있는 것 같습니다. 통찰력에 감사드립니다. – Chris

0

아이디어가 있습니다. 대신 코드를 서버 측을 실행하는, Skuplt와 그것을 클라이언트 측을 실행

http://www.skulpt.org/

이 모두 안전하고 구현하기 쉽습니다.

관련 문제