2012-06-07 2 views
2

gnuplot 웹 인터페이스를 만들 필요가 있습니다. 명령이나 파일 목록을 받아서 디스크에 저장하고 gnuplot에이를 png로 렌더링하도록 지시합니다 ("set terminal png; output ... ").gnuplot 웹 인터페이스의 보안 위험

사용자가 불쾌하거나 멍청한 작업을 수행 할 수 있습니까 (예 : CPU 또는 RAM 오버로드, 파일 시스템 액세스 ...)? 어떻게 피할 수 있습니까? gnuplot에 코드를 전달하기 전에 잠재적으로 악의적 인 라인을 제거해야합니까?

저는 django에서 subprocess.Popen을 통해 gnuplot을 실행하고 있습니다.

답변

5

부인이 -이 목록은 불완전 할 수밖에 없다

당신이 (조금도) 비활성화 할 수 있습니다 몇 가지가 있습니다.

을 gnuplot에서 보시려면 help shell을보십시오 - 대화 형 쉘을 생성 할 수 있습니다 (shelllogout 사이의 항목은 모두 삭제해야합니다). 또한 ! 또는 system (및 줄 연속)으로 시작하는 줄을 쉘 명령을 호출하는 줄로 제거하는 것이 좋습니다. 잠재적으로 위험한 일에 대한 내 목록에서 다음은 대체적인 대체를 사용하는 것입니다.

#homeless1.gp 
mysring="`rm -rf ~`" 

은 홈 디렉토리를 지 웁니다. 물론, 나는이 모든 일을한다면 스크립트가 완전히 안전하다는 주장을하지 않습니다. 사용자가 하나의 파일 만 업로드하도록 허용하는 경우 loadcall도 비활성화 할 수 있습니다. 사용자가 다른 악성 스크립트를 업로드하고 첫 번째 파일을로드하는 것에 대해 걱정할 필요가 없기 때문입니다.

또 다른 생각 - gnuplot을 사용하면 파이프를 사용하여 프로그램을 호출 할 수 있습니다.

plot "<awk -F, '{print $0}' mydata.txt" #runs system command awk 

당신은 꽤 많이 < 다음에 공백로 시작하는 문자열 또는 |을 해제해야합니다 - 그들이하지 않은 경우의 gnuplot 그냥 조용히 사람들을 멀리 던질 수 있으므로 가능한 이스케이프 시퀀스와 거기에뿐만 아니라 아무것도 피하고.

#homeless2.gp 
MYSTRING="<rm -rf ~" 
plot MYSTRING #removes $HOME -- And doesn't even give you a plot :-(

다른 ...

#homeless3.gp 
set output "| rm -rf ~" 
또한 스크립트가 아주 쉽게 reread 사용하여 무한 루프에 갇혀 얻을 수

- 해당 스크립트가 하나의 라인 길이 :

#inifite_loop.gp 
reread #Suckers!!! 

이것은 chroot jail을 구성하여 스크립트를 실행하는 경우에도 사용할 수 없도록 설정할 것입니다. (내가 아는 것이 없으며 scri을 실행하는 방법을 검색하는 동안 용어를 배웠습니다. 태평양 표준시 안전하게 유닉스에서 ...) - 내가 위의 방법을 사용하여 가정하지만, 사용자는 여전히 다른 프로그래밍 언어에서 무한 루프를 구축하여 gnuplot에서 실행하여 CPU의 한 핵심을 못 박는 수 - 같은 일이 간다 제 생각 엔 메모리는 ...

#infinite_mem.gp 
!python -c "a=[]; while True: a.append('Suckers!!! '*10000000))" #You'll probably hit swap pretty fast with this... 

은 내가 더 안전하게이 작업을 수행하기 위해, 그것에 대해 생각, 당신은 거의 처음부터의 gnuplot 파서를 다시 작성하고 모든 (또는 샌드 박스를 확인해야 할 것 모니터 - 소비 된 자원에 대한 신중한 제한 설정).

(죄송합니다. 듣고 싶지 않은 내용입니다.)

그것은 당신의 최선의 방법처럼 (나에게) 보이는 것은 ...의 gnuplot 명령의 작은 (그러나 유용) 하위 집합을 허용하고 명령의 세트에서의 gnuplot 스크립트를 구성 자신의 미니 언어를 만드는 것입니다

진행 EDIT

조금 주위를 연주 후, 당신은의 gnuplot에 배관을 사용하지 않도록 설정할 수 있습니다 -

./configure --program-suffix=safer 

을 지금, 당신은 눌러 확인에 의해 생성 된 것을 config.h을 편집해야합니다 gure ... 라인 밖으로 코멘트 :

#define HAVE_PCLOSE 1 

#define HAVE_POPEN 1 

#define PIPES 1 

(예를 들어, /*#define HAVE_PCLOSE 1*/).

다음 make; [sudo] make install - 내가 설정 한 방식으로 gnuplot의 "안전한"버전을 gnuplotsafer으로 호출 할 수 있습니다.

파이프로 인해 발생하는 불안정성을 없애기 때문에 (|, < 문자열을 가진 문제가 해결되었습니다. 이제 백킹 틱스도 안전합니다). , 시스템!이 여전히 안전하지 않은 경우 스크립트를 구문 분석하여 비활성화해야합니다.하지만 사용자가 악의적 인 파이프를 설정하지 않도록하는 것보다 쉽습니다.

시스템을 온라인 상태로 만들기 전에 파이프/backtics 등을 사용하여 작업을 수행 할 수 없는지 확인하는 것이 좋습니다. 가능한 한 전체 작업을 샌드 박스로 시도합니다.

3

위의 모든 내용은 이해하는 것이 중요하며 매우 위험 할 수 있습니다. 하지만 신중하게 샌드 박스를 지정하고 리소스 사용을 모니터링하여 안전하게 수행하려면 이어야합니다.

http://www.plotshare.com/을 살펴보십시오. 그들은 잠시 동안 주변에 있었으므로 안전하게이 작업을 수행 할 수있는 방법을 발견했을 것입니다. 어쩌면 당신은 그들과 이야기 할 수 있습니다.

+0

놀랍게도, 나는 음모에 대해 몰랐습니다. 위의 불안정성의 많은 것 (전부는 아님)은 gnuplot의'popen' 기능을 가진 시스템에서 파이프를 사용할 수있는 능력에 기인합니다. 만약'popen'을 사용할 수 없다고 생각하면 gnuplot 실행 파일을 빌드 할 수 있을지 궁금합니다. (아마도'config.h'에있는 라인을 수정해서) - 저는 gnuplot dev가 아닙니다. ,하지만이게 가능한 것 같아 * 가능할 것 같은데 ... gnuplot 4.6을 만들려고 시도했을 때 재미있게 찍을거야 ... (링크 +1) – mgilson

+0

글쎄, ** 파이프를 비활성화 할 수 있다는 것이 밝혀졌고, 너무 어렵지도 않습니다. (단지'config.h'에서 3 행을 주석으로 처리하십시오 - 위 참조). 나는 당신이 당신의 책의 다음 개정판에 그것을 넣을 수 있다고 생각합니다;). – mgilson

+0

알아두면 유용합니다. 다음 개정판이 있다면, 나는 이것을 지적 할 것이다. (내 책에는 실제로 음영을 설명하는 절이있다.) –

0

나는 www.plotshare.com의 작성자이며 방금이 항목을 발견했습니다.

페이지를 더 안전하게 만들기 위해 감사 인사를 보내고 싶습니다. 솔직히 말하면 파이프 보안 문제는 내 레이더에 있지 않았습니다. 왜냐하면 플로팅 전에 데이터를 사전 처리하여 파이프를 거의 사용하지 않기 때문입니다.

페이지를 자유 시간 프로젝트로 실행하고 지속적으로 개선하려고합니다. 현재로서는 대부분의 보안 구멍이 채워지기를 바랍니다.

@ 필립 필립 : 책에 플롯 공유를 포함 해 주셔서 감사합니다.현재 필자는 셸에서 gnuplot을 사용하는 것보다 온라인 플로팅 경험을 훨씬 뛰어나게하는 멋진 기능 (개선 된 도움말 시스템, html 캔버스 등)을 추가하는 과정에 있습니다.

페이지의 품질에 대한 확신이있는 경우 Google에서 더 많은 노력을 기울일 것입니다. 페이지에 대해 뭔가가 마음에 들지 않거나 특정 기능을 놓치지 않으면 알려주세요.

관련 문제