2012-07-09 6 views
2

가능한 중복 :
Issuing system commands in Linux from C, C++왜 리눅스 프로그래밍에서 system()을 사용하는 것이 좋지 않습니까?

I, 리눅스 프로그래밍 시스템() 호출을 사용하는 것이 좋다 아니라고 텍스트에 표시 나는 그것의 진짜 이유가 무엇인가 궁금해? 더 많은 메모리와 더 많은 CPU를 소비해야합니다. 이 외에도 이유가 무엇일까요?

예를 들어 fopen(), fwrite()을 사용하는 대신 system("echo 1 > file");을 입력하면 내 프로그램/Linux 시스템에서 해커가 수행 할 수있는 작업은 무엇입니까? 보안 문제로 인해 시스템이 조언을 듣지 못하는 것을 보았습니다. 그러나 사람이 system() 호출을 사용하기 때문에 리눅스 시스템을 어떻게 해킹 할 수 있습니까? 나는 누군가가 시스템()을 사용하는 것을 악의적으로 설명 할 수 있다면 기쁠 것이다.

+3

(http://stackoverflow.com/a/4622772/1275169) –

+0

가 – johan

+0

감사는 설명 – johan

답변

6

system("echo 1 > file");을 사용하면 문자 그대로 보안 위험이 없으므로 필요없는 다른 프로세스를 불필요하게 실행할 수 있습니다.

문자열을 프로그래밍 방식으로 작성한 다음 system()과 함께 사용하면 위험이 있습니다. 그렇다면 Shell Command Injection의 위험이 있습니다. 하나의 명령을 작성한다고 생각했지만 악의적 인 사용자는 사용자가 의도하지 않은 일을하도록주의 깊게 작성한 입력을 제공하여 프로그램을 파괴합니다.

+0

감사를 KingsIndian 오히려 질문을 뺀보다 이유를 설명하는 것이 더 건설적인 것, – johan

+3

심지어 시스템 ("echo 1> file")'**은 실행 방법에 따라 보안 상 위험 할 수 있습니다. 예를 들어'PATH'가 가짜로 설정되면,'echo'는 표준 echo 명령과 다른 프로그램이 될 수 있습니다. 그렇지 않은 경우에도 쉘 및/또는 에코가 수행 할 수있는 모든 종류의 환경 변수가 영향을 미칠 수 있습니다. 이로 인해 프로그램이 오작동을 일으킬 수 있으며, suid 인 경우 쉽게 권한 에스컬레이션이 발생할 수 있습니다. 게다가, "파일"에 "1"을 저장하는 실패 *를 확인하는 좋은 방법은 없으며, 실패를 확인하지 않는 것이 항상 버그이며 종종 보안상의 위험이 있습니다. –

+0

좋은 지적, 감사합니다! –

4

문제는 신뢰할 수있는 원본으로부터 시스템에 전달 된 문자열을 신뢰하고 있다는 것입니다.

char *command = null; 
//Read command from external source; 
system(command); 

당신이 수 명령이 안전하다고 신뢰하는 것이며, "~/* RM -fr"와 같은 불쾌한 일을하지 :이 같은 있다고 가정? fopen을 사용하면 해커가/etc/passwd와 같은 파일 이름을 전달할 수 있고 원하지 않는 것을 읽을 수 있기 때문에 필요한 보안을 확보 할 수 없습니다. 외부 세계와 인터페이스하는 프로그램의 최종선. 외부 사용자가 수행 할 수있는 작업에 대한 유효성 검사 및 제한을 입력 할 곳입니다.

1

System(3) 다른 프로세스를 시작하고 명령 인터프리터 ("/ bin/sh -c")를 실행하여 명령을 실행합니다. 프로그램이 SUID 또는 SGID 비트를 사용하여 실행중인 경우 문제가 될 수 있습니다. 셸의 동작은 많은 환경 변수에 의해 제어되며 이들 중 일부는 명령 인터프리터를 제어하는 ​​데 사용될 수 있습니다. 이 상황은 SUID 또는 SGID 쉘 스크립트를 실행하는 것과 유사합니다. [시스템은() 나쁜 이유]

관련 문제