2012-06-29 2 views
2

Runtime.exec()을 사용하여 실행 파일을 실행하고 있습니다. 나는 응용 프로그램에서 이것을 사용할 때 보안 문제가있을 수 있다는 것을 연구하고 발견했습니다. Runtime.exec()를 사용하여 실행 파일을 실행할 때 보안 문제가 있습니까?Runtime.exec()의 보안 문제

+0

이 영역은 까다 롭습니다. 신뢰할 수없는 데이터를 명령 행에 넣지 말 것을 강력히 권합니다. –

+0

보안 인식을위한 upvote. 잘 했어. – qre0ct

답변

1

제가 생각할 수있는 가장 큰 것은 Command Injection입니다. Runtime.exec을 통해 "rm /"을 실행할 수 없도록 실행할 항목을 허용하고 싶습니다. 생각보다 많은 일들이 일어날 수 있습니다. 예를 들어, "디렉토리"이름이 "foo; rm -r; ls"로 전달되면 어떻게 될까요?

또 다른 하나는 웹 응용 프로그램 인 경우 응용 프로그램에 대한 사용 권한 (따라서 Runtime.exec() 명령 줄이 웹 페이지에있는 사람의 권한과 동일하지 않음)입니다. 사람이 Tomcat을 삭제하거나 데이터베이스에 데이터를 삽입 할 수 있습니다. 또는

+0

흠, 나는 웹 응용 프로그램이지만 사용자는 dir/filename이 아닌 다른 명령을 사용하지 않을 것입니다. 이 경우 입력을 위생해야합니다. Runtime.exec을 사용하여 다른 보안 위협에 대해 알고 계십니까? 정보 주셔서 감사합니다! – KrispyDonuts

+0

더 많은 연구가 이루어질 때 그것이 유일한 주요 관심사 인 것처럼 보입니다. 자세한 내용은 다음을 참조하십시오. http://stackoverflow.com/questions/5301485/runtime-getruntime-execstring-safety – KrispyDonuts

+0

더 명확하게하려면 파일 이름을 삭제해야합니다. 내 파일 이름은 "/ etc/passwd"또는 "../../../WEB-INF/web.xml"일 수 있습니다. –

2

@Jeanne Boyarsky : Runtime.exec()가 처음으로 쉘을 생성하지 않는 한, 언급 한 방식으로 Runtime.exec()에 삽입 할 수 없습니다. Windows 또는 Linux에서 쉬/bash는/CSH/KSH)에 cmd.exe를 명령을 실행합니다. 다음은이에 대해 이야기 좋은 링크입니다.

https://www.owasp.org/index.php/Command_injection_in_Java

작은 프로그램을 작성하여 테스트 해 보았습니다. 사용자 입력으로 명령을받습니다. 따라서 'pwd'(Linux 시스템)을 입력하면 현재 디렉토리가 시스템 콘솔에 인쇄됩니다. 이것은 완벽하게 작동합니다.

그러나 리눅스에서 허용하는대로 두 개의 명령을 실행하면 pwd; id과 같이 바로 예외가 발생합니다. Throw 된 Exception은 다음과 같습니다.

javax.faces.el.EvaluationException : 때 java.io.IOException : 프로그램을 실행할 수 없습니다 "PWD, LS"오류 = 2, 그런 파일이나 디렉토리

는 상황이 비록 있다고 말했다 데 때 이것이 문제가 될 수 있습니다. 다음과 같은 코드가있는 경우 :

프로세스 proc = runtime.exec (cmd); 따라서, 쉘 실행 유발하고 그 안에 명령들을 연쇄 이드;

...는 사용자 SH -c PWD 의 입력을 제공 할 수있다.

간단히 말해서 도움이된다면 Runtime.exec()를 사용하지 않는 것이 가장 좋습니다. 반드시 사용해야한다면 모든 사용자 입력을 표준화하고 특정 문자와 명령 만 허용하십시오.

다음은 보안 코드를 작성하는 방법에 대해 설명합니다. https://www.securecoding.cert.org/confluence/display/java/IDS07-J.+Do+not+pass+untrusted,+unsanitized+data+to+the+Runtime.exec%28%29+method

+0

사실, IMHO는 "사용자가 sh -c pwd; id의 입력을 제공 할 수 있습니다."라는 말은 실제로 완전히 사실이 아닙니다. 알다시피, runtime.exec()는 runtime.exec (String cmd), runtime.exec (String [] cmds) 등과 같이 다른 형식을 취합니다. 첫 번째 경우에는 sh -c 및 명령을 수행하기가 실제로 어렵습니다. 그러나 나는 당신과 다른 사람들의 답변에있는 나머지 권고들에 전적으로 동의합니다. 건배. – qre0ct