Command Injection은 무엇인가?

Command Injection은 사용자의 입력값이 서버 내부의 운영체제 명령어로 전달되면서, 개발자가 의도하지 않은 명령 실행으로 이어질 수 있는 취약점입니다. 쉽게 말하면, 원래는 단순한 데이터로 처리되어야 할 입력값이 시스템 명령어의 일부로 해석되는 문제입니다.

예를 들어 관리 페이지에서 IP를 입력하면 서버가 내부적으로 ping을 실행하거나, VPN 설정 페이지에서 사용자가 입력한 값을 기반으로 네트워크 설정 명령을 생성할 수 있습니다. 이때 입력값이 단순 문자열로만 처리되지 않고 쉘이 해석할 수 있는 형태로 이어진다면, 공격자는 기존 명령의 흐름에 개입할 수 있습니다.

Command Injection의 핵심은 “명령어를 실행하는 기능이 있다”가 아닙니다. 문제는 사용자 입력값과 명령어가 안전하게 분리되지 않았다는 점입니다.


공격 원리

기본 흐름은 다음과 같습니다.

여기서 중요한 부분은 쉘입니다. 쉘은 단순히 명령어 하나만 실행하는 것이 아니라, 명령 연결, 출력 전달, 파일 입출력, 환경 변수 해석 등 다양한 기능을 제공합니다. 따라서 입력값 안에 쉘이 특별하게 해석할 수 있는 구조가 포함되면 서버가 예상하지 못한 동작이 발생할 수 있습니다.

즉, Command Injection은 입력값 검증 부족만의 문제가 아니라 데이터와 명령의 경계가 무너지는 문제입니다.


CVE로 보는 Command Injection 예시

대표적인 사례로 CVE-2023-1389가 있습니다.

이 취약점은 TP-Link Archer AX21의 웹 관리 인터페이스에서 발생한 Command Injection 취약점입니다. NVD 설명에 따르면 country 파라미터가 popen() 호출에 사용되기 전 충분히 정제되지 않아, 인증되지 않은 공격자가 임의 명령 실행으로 이어질 수 있는 문제가 있었습니다.

이 사례가 중요한 이유는 Command Injection의 구조를 단순하게 보여주기 때문입니다. 사용자는 국가 설정값을 전달하는 것처럼 보이지만, 서버 내부에서는 해당 값이 운영체제 명령 실행 함수의 입력으로 사용되었습니다.

즉, 입력값이 단순한 설정 데이터로 끝나지 않고, 시스템 명령 실행 문맥까지 도달한 것입니다.

웹 요청 파라미터
→ 서버 내부 처리 로직
→ 명령 실행 함수
→ 운영체제 명령 실행 문맥

이 흐름에서 입력값과 명령어가 안전하게 분리되지 않으면 Command Injection이 발생할 수 있습니다.


PoC 관점

PoC에서 중요한 것은 공격적인 명령 실행 자체가 아니라, 입력값이 명령 실행 문맥까지 도달하고 실행 흐름에 영향을 줄 수 있음을 증명하는 것입니다.

따라서 PoC를 작성할 때는 다음 내용을 중심으로 정리하면 좋습니다.

1. 취약 기능 위치
2. 입력값이 전달되는 파라미터
3. 내부적으로 명령 실행 함수와 연결되는 흐름
4. 정상 요청과 조작 요청의 차이
5. 응답 변화, 로그 변화, 시간 차이 등 검증 근거
6. 영향 버전과 테스트 환경
7. 보안 영향도

실제 PoC는 허가된 환경과 본인 소유 장비에서만 진행해야 하며, 시스템에 피해를 주는 명령 대신 무해한 검증 방식으로 재현하는 것이 안전합니다.


자주 발생하는 기능

Command Injection은 사용자의 입력이 운영체제 명령어와 가까운 기능에서 자주 발생합니다.

기능위험 이유

Ping / Traceroute 네트워크 진단 명령을 직접 호출할 수 있음
DNS / NTP 설정 입력값이 시스템 설정 명령으로 전달될 수 있음
VPN 설정 WireGuard, OpenVPN 설정값이 내부 명령으로 이어질 수 있음
로그 검색 내부적으로 grep, awk 같은 명령을 사용할 수 있음
백업 / 복원 압축, 파일 처리, 경로 처리 과정이 포함됨
펌웨어 업데이트 업로드 파일 검증이나 설치 스크립트 실행 가능성 있음
인증서 관리 openssl 같은 외부 명령 호출 가능성 있음

특히 라우터, 스위치, NAC, 방화벽 같은 네트워크 장비는 웹 관리 페이지에서 시스템 명령어를 호출하는 기능이 많기 때문에 분석할 가치가 큽니다.


정리

Command Injection은 사용자의 입력값이 단순한 데이터가 아닌 운영체제 명령어의 일부로 해석될 때 발생하는 취약점이다. 공격자는 입력값을 통해 서버 내부 명령 실행 흐름에 영향을 줄 수 있으며, 경우에 따라 정보 노출, 서비스 장애, 권한 상승, 원격 명령 실행 등의 결과로 이어질 수 있다.

실제 CVE-2023-1389 사례에서도 웹 관리 인터페이스의 입력값이 내부 명령 실행 함수(popen())로 전달되면서 Command Injection이 발생하였다. 이 사례는 사용자가 입력한 데이터가 안전하게 분리되지 않을 경우, 정상적인 관리 기능도 공격 표면이 될 수 있음을 보여준다.