명령어 주입 (Command Injection)
Command Injection
설명
명령어 주입 취약점은 사용자의 입력값이 검증 없이 운영 체제 명령어로 실행될 때 발생합니다. Node.js에서 child_process의 spawn이나 spawnSync 함수에 사용자 입력이 직접 전달되면, 공격자가 악의적으로 쉘 명령어나 추가 코드를 삽입하여 실행할 수 있습니다.
잠재적 영향
시스템 제어 권한 탈취 (시스템을 공격자가 제어할 수 있음)
데이터 유출 및 변조 (중요 파일 접근이나 데이터 삭제)
서비스 마비 (DoS, 시스템 장애 등)
해결 방법
사용자 입력값을 운영 체제 명령으로 직접 전달하지 말고, 반드시 허용된 값만 명령 인자로 사용할 것
불가피하게 입력을 명령에 사용할 경우, 화이트리스트 검증을 적용할 것
쉘 식별자(bash, sh 등)나 "-c"와 같은 파라미터를 사용하지 않고, 명시적으로 실행 커맨드와 인자를 구분하여 입력할 것
취약한 코드 및 안전한 코드 예시
취약한 코드
const {spawnSync} = require('child_process');
function runCommand(userInput) {
// 취약: 사용자가 입력한 명령어를 직접 실행
spawnSync('sh', ['-c', userInput]);
}안전한 코드
설명:
취약한 코드: 위 예제는 사용자 입력값(userInput)을 쉘의 커맨드로 직접 실행하므로, 공격자가 "; rm -rf /"와 같이 위험한 명령어 조작이 가능합니다.
안전한 코드: 안전한 코드는 사용자 입력값을 미리 정해진 값(화이트리스트) 안에서만 허용하고, 쉘 커맨드를 직접 조작하지 못하도록 하여 명령 조작 위험을 방지합니다.
참조
Last updated