Command Injection 공격

Command Injection

Command Injection은 운영체제 명령어(쉘 명령어)를 실행하는 기능이 존재하는 경우, 외부 입력값을 검정, 제한 하지 않고 운영체제 명령어 또는 운영체제 명령어의 일부로 사용하는 경우 발생하는 취약점입니다. 이 공격을 통해 공격자는 시스템 제어권을 탈취하여 해당 시스템을 마음대로 제어할 수 있게 됩니다.

=> 검증하지 않았다는 것은 추가 명령어 실행에 사용되는 &, |, ; 등의 문자열 포함여부를 확인하지 않았다는 의미

=> 제한하지 않았다는 것은 내부 조직에서 사용할 수 있는 명령어 또는 명령어의 파라미터 값을 미리 정의하고 정의된 리스트 내에서 사용되도록 하지 않았다는 의미

 

Command Injection 취약점을 방어하기 위해 외부 입력값을 검정, 제한하여야합니다.

=> 화이트 리스트 방식(허용목록) : 정의된 리스트 내의 값만 사용 가능하며, 새로운 입력 유형에 대해서도 동일한 보안성을 제공하기 때문에 안전합니다.

=> 블랙 리스트 방식(제한목록) : 정의된 리스트 내의 값은 사용 불가하며, 모집합의 규모가 크고, 변화가 심한 경우에 사용합니다.

 

1. 외부 입력값을 운영체제 명령어로 사용하는 경우

[run.jsp]

String cmd = request.getParameter("cmd");

Runtime.exec(cmd);

 

개발자가 원하는 실행은 run.jsp?cmd=ifconfig

=> 서버의 네트워크 설정 정보를 반환하는 명령어

공격자가 조작한 실행은 run.jsp?cmd=cat /etc/passwd 또는 run.jsp?cmd=ifconfig & cat /etc/password

=> 개발자가 의도하지 않은 계정정보가 노출되는 명령어

 

2. 외부 입력값을 운영체제 명령어의 일부로 사용하는 경우(파라미터로 사용)

[view.jsp]

String file = request.getParameter(".file")

Runtime.exec("cat " + file);

 

개발자가 원하는 실행은 view.jsp?file=myfile.txt

=> /data/upload 아래에 있는 myfile.txt 내용을 반환하는 명령어

공격자가 조작한 실행은 view.jsp? file=/etc/passwd 또는 view.jsp?data/upload/myfile.txt & cat /etc/password

=> 개발자가 의도하지 않은 시스템 파일의 내용이 반환되는 명령어

 

3. 보안대책

(1) 불필요한 운영체제 명령어 실행을 제거합니다.

: 운영체제 명령어 실행이 꼭 필요한지 여부를 확인하고 불필요한 경우 해당 기능을 제거하거나 다른 기능으로 대체

: 운영체제 명령어 실행이 발생하지 않도록 설계

 

(2) 운영체제 명령어 또는 운영체제 명령어의 파라미터로 사용할 값을 화이트 리스트 방식으로 제한합니다.

: 시스템 내부에서 사용할 값을 미리 정의하고 정의된 리스트 내에서만 사용하도록 설계

 

(3) 추가 명령어 실행에 사용되는 &, |, ; 등의 문자열 포함여부를 확인합니다.

 

(4) 외부에서 시스템 내부 처리를 유추할 수 없도록 코드화합니다.