Command Injection
외부 입력이 운영체제 명령으로 해석되는 경우
발생 상황
Ping 진단, 파일 변환, 압축, 백업 기능이 사용자 입력을 셸 명령 문자열에 연결할 때 발생합니다.
주요 유형
셸 메타문자로 명령 구조를 바꾸는 경우와 실행 프로그램의 옵션을 바꾸는 Argument Injection을 구분합니다. 출력이 직접 보이지 않는 Blind 유형도 있습니다.
분석할 때 주의할 점
입력값을 따옴표로 감싸는 것만으로 모든 셸·플랫폼에서 안전해지지 않습니다. SQLi와 달리 해석 주체는 셸 또는 실행 프로그램입니다. 정상 기능의 출력과 종료 코드를 기준으로 확인합니다.
대응 방안
가능하면 운영체제 명령 대신 라이브러리 API를 사용합니다. 실행이 필요하면 셸을 거치지 않고 고정 실행 파일과 인자 배열을 사용하며 인자를 허용목록으로 검증합니다. 실행 계정 권한과 처리 시간도 제한합니다.
자주 놓치는 부분과 특이사항
shell=false여도 공격자가 프로그램 옵션을 주입할 수 있으면 위험할 수 있습니다. 옵션 종료 구분자 지원 여부와 파일명·호스트명에 허용할 형식을 함께 검토합니다.
요청과 구현 비교
셸을 없애고 인자도 검증
파일 읽기는 셸의 cat 대신 파일 API를 사용하는 식으로 명령 실행 자체를 줄입니다. 실행이 필요하면 아래처럼 서버가 고정한 실행 파일에 검증된 IP만 전달합니다. 이는 Node.js/Linux 예시이며 실행 파일 위치·옵션은 환경에 맞춰 고정해야 합니다.
import { isIP } from 'node:net';
import { execFile } from 'node:child_process';
if (!isIP(host)) throw new Error('IP 주소만 허용');
execFile('/usr/bin/ping', ['-c', '1', '-W', '1', host],
{ timeout: 3000, maxBuffer: 16384 }, callback);적용 조건과 재검증
명령을 고정해도 목적지는 확인
셸 없이 고정 실행 파일과 검증된 인자를 사용하더라도, 허용한 IP가 내부 관리망이나 다른 제한 대상일 수 있습니다. 진단 서비스가 접근할 네트워크 목적지를 별도로 제한하고 정상 Ping 기능이 유지되는지 확인해야 합니다.