명령어 주입 (Command Injection)

Command Injection

설명

Node.js에서 child_process 모듈의 spawn, spawnSync 함수에 {shell: true} 또는 {shell: '/bin/sh'} 옵션을 사용하면 외부 명령어가 쉘 환경에서 실행됩니다. 이로 인해 사용자 입력 값이 특수 문자를 포함할 경우 의도치 않은 명령어가 실행될 수 있고, 공격자가 임의의 명령어를 삽입(주입)할 수 있습니다.

잠재적 영향

  • 명령어 실행 권한 탈취 (명령어 권한 남용): 공격자가 악성 코드를 실행하거나 서버의 중요한 파일을 삭제, 유출할 수 있습니다.

  • 데이터 유출 및 손상 (데이터 누출 및 변조): 민감한 시스템 데이터를 외부로 유출하거나, 데이터를 조작 및 파괴할 수 있습니다.

  • 서비스 중단 (서비스 거부): 시스템 자원을 고갈시키거나 프로세스를 종료시켜 서비스가 중단될 수 있습니다.

해결 방법

  • spawn, spawnSync 함수에서 {shell: true} 옵션을 사용하지 않습니다.

  • 반드시 필요한 경우가 아니라면, 기본값(shell: false) 또는 안전하게 인자만 전달하는 방법을 사용합니다.

  • 외부 입력값을 명령어 인자로 사용할 때는 모두 검증하거나, 필요 없는 입력은 제거합니다.

  • 명령어 실행이 필요한 경우, 사전에 허용된 명령어 목록만 제한적으로 사용합니다.

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

취약한 코드

안전한 코드

설명:

  • 취약한 코드: shell: true 옵션을 사용하면, 사용자가 입력한 값에 특수 문자가 포함될 경우 쉘에서 그 값을 명령어처럼 해석할 수 있어 명령어 주입 공격이 발생할 수 있습니다.

  • 안전한 코드: shell: false(기본값)를 명시하거나 사용하여, 입력 값이 쉘에 전달되지 않고 명령어의 인자로만 사용되어 안전하게 실행됩니다. 이로써 명령어 주입 위험이 사라집니다.

참조

Last updated