명령어 주입 (Command Injection)

Command Injection

설명

명령어 주입(Command Injection)은 애플리케이션이 사용자 입력을 운영 체제 명령어로 실행할 때 발생하는 취약성입니다. 공격자는 조작된 입력을 통해 시스템 명령어를 실행하여 권한 상승, 데이터 유출, 시스템 손상 등을 초래할 수 있습니다.

잠재적 영향

  • 시스템 권한 상승: 공격자가 시스템 명령어를 실행하여 관리자 권한을 획득할 수 있습니다.

  • 데이터 유출: 민감한 데이터가 공격자에게 노출될 수 있습니다.

  • 서비스 거부(DoS): 시스템 자원을 소모시키거나 중요한 프로세스를 중단시켜 서비스가 중단될 수 있습니다.

해결 방법

  • 사용자 입력 검증: 명령어로 사용되는 모든 사용자 입력을 철저히 검증합니다.

  • 명령어 실행 함수 제한: subprocess 모듈의 run이나 Popen 대신 안전한 API를 사용하여 외부 명령어 실행을 제한합니다.

  • 입력값 인코딩: 쉘 명령어의 특수 문자를 이스케이프하여 악의적인 명령어가 실행되지 않도록 합니다.

취약한 코드 및 안전한 코드 예시

OS `system`

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 사용자 입력값을 검증하지 않고 운영 체제 명령어로 실행하여, 공격자가 임의의 명령어를 실행할 수 있습니다.

  • 안전한 코드: 허용된 명령어만 실행하도록 검증하여, 공격자가 임의의 명령어를 실행할 수 없도록 합니다.

Paramiko `exec_command`

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 사용자 입력값을 검증하지 않고 운영 체제 명령어로 실행하여, 공격자가 임의의 명령어를 실행할 수 있습니다.

  • 안전한 코드: shlex.quote을 사용하여 위험한 문자를 제거하거나 가능할 경우 허용된 명령어만 실행하도록 검증하여, 공격자가 임의의 명령어를 실행할 수 없도록 합니다.

  • 참고: shlex.quote는 Unix shells 대상으로만 만들어졌기에 Windows와 같은 non-POSIX compliant shells 대상으로는 안전하지 않음

    • shlex.quote 대상 예시

      • &

      • |

      • ;

      • $

      • >

      • <

      • `

      • \

      • !

참조

Last updated