명령어 주입 (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대상 예시&|;$><`\!
참조
OWASP: Command Injection
Injection Filter for UNIX Shells: shelex.quote
Last updated