OS 명령어 삽입이란?
OS 명령어 삽입은 공격자가 취약한 애플리케이션을 통해 서버에서 임의의 운영 체제 명령어를 실행할 수 있도록 하는 취약점입니다. MITRE에서 CWE-78로 분류되며, 애플리케이션이 외부에서 제공된 입력값을 적절히 특수 문자를 무력화하지 않고 OS 명령어를 구성할 때 발생합니다. 그 결과, 기본 운영 체제에 대한 직접적이고 비인가된 접근이 이루어집니다.
이 취약점 유형은 2014년 Shellshock 대규모 악용 사례부터 CISA 권고문에 기록된 네트워크 장비 공격까지 주요 사이버 공격과 연관되어 있습니다. CWE-78은 MITRE Top 25에 포함되어 있으며, out-of-bounds write, 크로스사이트 스크립팅, SQL 인젝션과 함께 상위 취약점으로 분류됩니다.
OWASP Top 10에서는 더 넓은 Injection 카테고리가 CWE-77과 CWE-78 모두를 포함합니다. 셸 레벨에서 이 취약점이 어떻게 동작하는지 이해하는 것이 방어의 첫걸음입니다.
OS 명령어 삽입은 어떻게 동작하는가?
OS 명령어 삽입은 애플리케이션이 사용자 제어 입력값을 데이터와 제어 명령어를 분리하지 않고 OS 셸 명령어에 직접 전달하는 근본적인 결함을 악용합니다.
MITRE는 OS 명령어 삽입의 두 가지 하위 유형을 정의합니다.
하위 유형 1: 직접(명령어 구분자 삽입)
애플리케이션은 단일 고정 프로그램을 실행할 의도로 외부 입력을 인수로만 사용합니다. 공격자는 명령어 구분자(;, |, &&, ||, 또는 개행 문자)를 삽입하여 추가 명령어를 덧붙입니다.
DNS 조회를 수행하는 웹 애플리케이션을 예로 들 수 있습니다:

공격자가 example.com; cat /etc/passwd를 도메인 파라미터로 입력하면, 셸은 nslookup example.com과 cat /etc/passwd를 모두 실행하여 서버의 패스워드 파일을 반환합니다.
하위 유형 2: 간접(전체 명령어 제어)
애플리케이션이 입력값을 통해 실행할 프로그램 전체를 결정하도록 허용합니다. 공격자는 인수뿐만 아니라 전체 명령어를 제어할 수 있습니다:

공격자가 SCRIPTNAME 속성을 제어할 경우, 시스템 내 임의의 실행 파일을 지정할 수 있습니다.
공격 흐름
일반적인 OS 명령어 삽입 공격은 다음과 같은 순서로 진행됩니다:
- 공격자가 폼 파라미터, HTTP 헤더, 쿠키, URL 쿼리 문자열 등 서버 측 명령어에 전달되는 입력 필드를 식별합니다.
- 공격자가 셸 메타문자와 악의적 명령어를 결합하여 해당 입력값에 삽입합니다.
- 애플리케이션이 정제되지 않은 입력값을 OS 셸에 전달합니다.
- 셸이 메타문자를 해석하여 삽입된 명령어를 애플리케이션 프로세스와 동일한 권한으로 실행합니다. 애플리케이션이 root로 실행 중이라면 공격자도 동일한 권한을 획득합니다.
각 단계는 셸이 특정 문자를 제어 명령어로 해석하는 것에 의존합니다. 이를 가능하게 하는 연산자는 플랫폼에 따라 다릅니다.
일반적인 삽입 연산자 및 메타문자
OS 명령어 삽입은 운영 체제가 명령어 문자열을 해석하는 방식을 변경하는 셸 메타문자에 의존합니다. 공격자가 사용할 수 있는 연산자는 대상 플랫폼에 따라 다릅니다.
명령어 구분자 및 인라인 실행
| 연산자 | 기능 | 플랫폼 |
| ; | 명령어를 순차적으로 실행 | Unix |
| & | 두 번째 명령어를 백그라운드에서 실행 | Unix 및 Windows |
| && | 첫 번째 명령어가 성공할 때만 두 번째 명령어 실행 | Unix 및 Windows |
| || | 첫 번째 명령어가 실패할 때만 두 번째 명령어 실행 | Unix 및 Windows |
| | | 첫 번째 명령어의 출력을 두 번째 명령어로 전달 | Unix 및 Windows |
| ` (backticks) | 인라인 실행; 출력이 해당 표현식으로 대체됨 | Unix |
| $() | 인라인 실행; backticks와 기능적으로 동일 | Unix |
| 0x0a (newline) | 일부 셸에서 새 명령어 시작 | Unix |
사용자 입력이 원래 명령어의 따옴표(" 또는 ') 안에 포함될 경우, 공격자는 먼저 따옴표를 닫아야 구분자가 동작합니다. URL 인코딩, 이중 인코딩, 유니코드 정규화와 같은 인코딩 기법은 이러한 문자를 필터링하는 우회 방법으로 사용될 수 있습니다. 이러한 연산자가 셸에 도달하는 것은 사용자 데이터와 명령어 구문을 분리하지 않는 특정 코딩 패턴 때문입니다.
OS 명령어 삽입의 원인
OS 명령어 삽입은 사용자 입력이 적절한 통제 없이 시스템 셸에 도달하도록 허용하는 코딩 관행에서 비롯됩니다. 다섯 가지 근본 원인이 대부분의 취약점을 차지합니다.
불충분한 입력값 검증
가장 직접적인 원인입니다. OWASP 가이드에 따르면, 애플리케이션이 폼, 쿠키, HTTP 헤더 등 사용자 제공 데이터를 정제 없이 시스템 셸에 전달할 때 명령어 삽입 공격이 가능해집니다. 사용자가 예상값만 입력할 것이라 신뢰하면 검증을 생략할 수 있습니다.
언어 고유 API 대신 셸 실행 사용
system(), exec(), shell_exec(), os.system() 호출은 OS 셸을 중간 매개체로 사용합니다. 셸을 호출할 때마다 삽입 표면이 생성됩니다. OWASP 치트시트는 주요 언어별로 위험한 API를 식별합니다:
| 언어 | 위험한 API |
| Java | Runtime.exec() |
| C / C++ | system(), exec(), ShellExecute() |
| Python | exec(), eval(), os.system(), os.popen(), subprocess.Popen(), subprocess.call() |
| PHP | system(), shell_exec(), exec(), proc_open(), eval(), passthru() |
| Node.js | child_process.exec(), execSync(), spawn() |
거부 목록 필터링에 의존
허용할 값을 정의하는 대신 특정 위험 문자를 차단하려 할 수 있습니다. 이 접근법은 CWE-184(불완전한 거부 목록)로 분류되며, 일관되게 실패합니다. OWASP는 PHP의 escapeshellcmd()가 추가 명령어 실행은 막지만 인수 삽입은 허용한다고 명시합니다. 공격자는 --output-document=와 같은 플래그를 삽입해 명령어 구분자 없이도 파일 쓰기를 달성할 수 있습니다.
환경 변수 조작
애플리케이션이 실행 파일의 절대 경로를 지정하지 않고 환경 변수를 정제하지 않으면, 공격자가 $PATH를 악성 바이너리로 리디렉션할 수 있습니다. 애플리케이션이 setuid root 권한으로 실행 중이면, 공격자 바이너리가 root 권한으로 실행됩니다.
최소 권한 원칙 위반
시스템 권한이 상승된 상태로 애플리케이션이 실행되면 모든 삽입 취약점의 영향이 커집니다. 명령어 삽입이 www-data 권한으로 실행되는 애플리케이션을 공격할 경우, 공격자는 해당 사용자 권한에 제한됩니다. 동일한 취약점이 root 프로세스에서 악용되면 전체 시스템 제어권을 얻게 됩니다. 이러한 원인이 해결되지 않으면, 영향은 취약한 애플리케이션을 넘어 확산됩니다.
OS 명령어 삽입의 영향 및 위험
OS 명령어 삽입은 취약점 분류 체계에서 항상 최상위 점수를 기록합니다. OWASP Top 10:2021은 인젝션을 주요하고 지속적인 위험 카테고리로 식별합니다. 기능적 영향은 직접적입니다: 공격자가 손상된 애플리케이션 프로세스와 동일한 권한으로 서버에서 임의 명령어를 실행할 수 있습니다.
영향 카테고리별 심각도
| 영향 | 증거 |
| 원격 코드 실행 | CVE-2024-3400 |
| 전체 시스템 손상 | SANS 보고서: "전체 시스템 손상, 데이터 유출 또는 네트워크 침투" |
| 횡적 이동 | CISA 권고문: OS 명령어 삽입과 경로 탐색 결합으로 다단계 침입 가능 |
| 봇넷 동원 | Mirai 변종 |
| 랜섬웨어 배포 | CISA 권고문; CISA 권고문 |
CVSS 점수만으로는 전체 위험을 설명할 수 없음
CVE-2024-20399(Cisco NX-OS)는 비교적 낮은 CVSS 점수를 가지고 있으며, 로컬 접근 및 관리자 권한이 필요합니다. 그러나 CISA는 중국 연계 Velvet Ant 캠페인에서 실제 악용이 확인된 후 이를 Known Exploited Vulnerabilities 카탈로그에 추가했습니다.
이 사례는 CVSS 점수만으로는 운영상 위험을 반영하지 못함을 보여줍니다. KEV 카탈로그 등재, 국가 지원 공격, 장비의 네트워크 위치 등은 기본 점수보다 훨씬 더 큰 위험 요인이 될 수 있습니다. 공격자가 사용하는 구체적 기법을 이해하면 실제 악용이 흔한 이유를 설명할 수 있습니다.
공격자가 OS 명령어 삽입을 악용하는 방법
공격자는 발견에서 블라인드 인젝션, 취약점 체이닝에 이르기까지 일련의 기법을 사용해 OS 명령어 삽입을 탐지, 확인, 악용합니다.
발견 및 열거
공격자는 서버 측 시스템 명령어와 상호작용하는 입력 필드를 식별하고, 모든 파라미터, HTTP 헤더(User-Agent, Referer), 쿠키, URL 쿼리 문자열, 구조화 데이터 입력(JSON, XML, SOAP)을 테스트합니다.
직접 출력 인젝션
공격자가 명령어 구분자 뒤에 알려진 출력 명령어를 삽입합니다:

응답에 실행 중인 프로세스의 사용자명이 포함되면, 인젝션이 확인되어 공격자는 더 파괴적인 명령어로 진행할 수 있습니다.
시간 지연을 이용한 블라인드 인젝션
명령어 출력이 HTTP 응답에 나타나지 않을 때, 공격자는 시간 지연 명령어를 삽입하고 응답 지연을 측정합니다. Linux 대상에 & sleep 10 &을 삽입하면 명령어가 실행될 경우 측정 가능한 지연이 발생합니다.
Out-of-Band (OAST) 탈취
공격자는 자신이 제어하는 인프라로 DNS 콜백을 유발하는 명령어를 삽입합니다:

공격자 서버로 DNS 쿼리가 도달하면, 출력이나 시간 차이가 없어도 코드 실행이 확인됩니다. PortSwigger OAST는 Burp Collaborator가 기존 방법으로 식별 불가능했던 블라인드 OS 명령어 삽입 취약점 탐지를 가능하게 했다고 설명합니다.
인증 우회 체이닝
CVE-2024-21887(Ivanti Connect Secure)는 인증된 관리자 접근이 필요하지만, 공격자는 CVE-2023-46805(인증 우회)와 결합해 이 요구사항을 완전히 제거했습니다. CISA 권고문에 따르면, 중국 국가 지원 공격자는 Ivanti, Cisco 등 네트워크 장비에서 이 체이닝 패턴을 체계적으로 사용했습니다.
인수 삽입 우회
방어자가 명령어 구분자(;, |, &&)를 필터링할 때, 공격자는 인수 삽입(CWE-88)으로 전환합니다. - 또는 --로 시작하는 플래그나 옵션을 삽입해, 새로운 명령어를 추가하지 않고 이미 호출된 프로그램의 동작을 조작합니다. OWASP는 PHP의 escapeshellcmd()가 명령어 구분자가 차단되어도 이 공격 경로를 허용한다고 문서화합니다. 이러한 기법의 폭넓음으로 인해 영향은 단일 애플리케이션 유형이나 산업에 국한되지 않습니다.
OS 명령어 삽입의 영향 대상
OS 명령어 삽입은 애플리케이션 코드가 사용자 입력을 OS 셸에 전달하는 모든 시스템에 영향을 미칩니다. 특정 애플리케이션 유형과 산업군은 실제 악용 데이터에 따라 불균형적으로 높은 위험을 가집니다.
가장 취약한 애플리케이션 유형
- 네트워크 장비 및 SSL-VPN 기기: 이 카테고리는 CISA KEV 카탈로그에서 확인된 CWE-78 악용 사례가 가장 집중적으로 발생합니다. CVE-2023-44221(SonicWall SMA100), CVE-2024-8190(Ivanti Cloud Services Appliance), CVE-2024-40891(Zyxel CPE), CVE-2023-28771(Zyxel Firewall/VPN) 모두 관리 인터페이스가 입력값을 OS 수준 명령어 실행에 직접 전달하는 구조입니다.
- IoT 및 임베디드 펌웨어: QNAP NAS(CVE-2023-47218), TP-Link 라우터(CVE-2023-1389), Wavlink 라우터 등에서 CWE-78 취약점이 확인되었습니다. Mirai 변종은 여러 라우터 및 IoT 펌웨어 플랫폼에서 OS 명령어 삽입 CVE를 체계적으로 무기화하여 봇넷 동원에 활용했습니다.
- 서버 측 시스템 호출이 포함된 웹 애플리케이션: OWASP Top 10의 대표 시나리오는 Java 애플리케이션이 Runtime.getRuntime().exec()로 문자열 연결을 통해 OS 명령어를 구성하는 경우입니다.
- 엔터프라이즈 관리 인터페이스: CISA 권고문은 Ivanti Cloud Service Application 관리 인터페이스에서 체이닝된 명령어 삽입 악용을 문서화합니다.
가장 위험한 산업군
- 중요 인프라 및 통신: CISA 권고문은 중국 국가 지원 공격자가 네트워크 장비의 명령어 삽입을 악용해 통신 및 라우터 인프라를 표적으로 삼았음을 기록합니다.
- 연방 정부: CISA KEV 등재 항목은 "연방 기관에 중대한 위험을 초래"한다고 명시합니다. 연방 기관은 KEV 일정에 따라 명령어 삽입 CVE에 대응해야 합니다.
이들 카테고리의 악용 데이터는 OS 명령어 삽입이 코드 수준 결함에서 조직 전체 피해로 확산되는 과정을 보여줍니다.
OS 명령어 삽입의 실제 사례
확인된 OS 명령어 삽입 사고는 오픈소스 소프트웨어의 대규모 악용부터 네트워크 인프라를 겨냥한 국가 지원 캠페인까지 다양합니다.
Shellshock (CVE-2014-6271), 2014년
GNU Bash 4.3 버전까지 환경 변수 내 함수 정의 뒤에 오는 문자열을 처리하여, 조작된 값으로 셸 명령어를 삽입할 수 있었습니다. 이 취약점은 CGI 스크립트, DHCP 클라이언트, SSH ForceCommand 구성 등에서 악용 가능해 단일 OS 명령어 삽입 결함이 인터넷 전체로 확산될 수 있음을 보여줍니다.
Equifax 침해(CVE-2017-5638), 2017년
Apache Struts 2는 Content-Type 헤더를 통한 OGNL 표현식 삽입을 허용해 임의 코드 실행이 가능했습니다. 하원 보고서에 따르면, Apache는 2017년 3월 7일 패치를 발표했고, 3월 10일 공격자가 Equifax 네트워크에서 최초로 취약점을 악용했습니다. 이로 인해 7억 달러 합의와 경영진 사임이 발생했습니다.
Log4Shell (CVE-2021-44228), 2021년
Apache Log4j2의 JNDI 메시지 조회 기능은 조작된 로그 메시지를 통해 인증 없는 원격 코드 실행을 허용했습니다. CVSS 10.0. CISA 권고문에 따르면, APT 공격자는 패치되지 않은 VMware Horizon 서버에서 Log4Shell을 악용해 횡적 이동 및 민감 데이터 탈취를 달성했습니다. LockBit 계열 및 북한 그룹도 이 취약점을 악용했습니다.
Velvet Ant / CVE-2024-20399, 2024년
Sygnia 보고서는 중국 연계 스파이 그룹이 Cisco NX-OS CLI 명령어 삽입 취약점을 악용한 사례를 설명합니다. 비교적 낮은 CVSS 점수에도 불구하고, 그룹은 Nexus 스위치의 리눅스 OS에서 악성 코드를 실행했습니다. CISA는 이를 KEV 카탈로그에 추가하여, 운영상 위험이 CVSS 점수보다 클 수 있음을 강조했습니다.
Zyxel 방화벽 악용(CVE-2023-28771), 2023년
Zyxel 방화벽 펌웨어의 오류 메시지 처리 미흡으로 인증 없는 원격 OS 명령어 실행이 가능했습니다. CVSS 9.8. Cybersecurity Dive는 단 하루 만에 사전 활동 없이 적극적 타깃팅이 이루어졌다고 보도했습니다.
이러한 사고는 웹 애플리케이션 초창기부터 이어진 광범위한 패턴의 일부입니다.
OS 명령어 삽입의 연혁 및 타임라인
- 1988~1998년: CGI 시대. 초기 웹 서버는 사용자 입력을 정제하지 않고 셸 스크립트에 전달해 최초의 OS 명령어 삽입 공격 표면을 만들었습니다. MIT Lincoln Laboratory의 DARPA 침입 탐지 평가 데이터셋은 이 시기 CGI 기반 공격과 sendmail 악용을 기록했습니다.
- 1999년: 공식 분류. CVE-1999-0067은 파이프(|) 메타문자를 무력화하지 않은 CGI 프로그램을 OS 명령어 삽입의 초기 공식 사례로 기록했습니다. MITRE의 CWE-78이 취약점 유형을 표준화했습니다.
- 2014년: Shellshock. CVE-2014-6271은 인터넷 규모의 대량 악용이 이루어진 최초의 OS 명령어 삽입 취약점이 되었습니다.
- 2017년: 엔터프라이즈 영향. CVE-2017-5638을 통한 Equifax 침해는 애플리케이션 프레임워크에 내장된 명령어 실행 기능이 엔터프라이즈 규모의 직접 OS 명령어 삽입과 동일한 결과를 초래함을 보여주었습니다.
- 2021년: 인젝션 카테고리 통합. OWASP Top 10:2021은 모든 인젝션 유형을 A03 Injection 카테고리로 통합했습니다. Log4Shell(CVE-2021-44228)은 이 패턴을 범용 로깅 라이브러리로 확장했습니다.
- 2023~2026년: 네트워크 장비 타깃팅. 공격 표면이 네트워크 경계 장비로 결정적으로 이동했습니다. CISA 권고문에 따르면, 중국 국가 지원 공격자는 2021~2025년 네트워크 장비에서 명령어 삽입을 체계적으로 악용했습니다. OWASP Top 10:2025는 CWE-88(인수 삽입)을 명시적으로 추가했습니다.
악용이 지속되는 상황에서, 조기 식별은 전체 애플리케이션 라이프사이클에서 우선순위입니다.
OS 명령어 삽입 탐지 방법
OS 명령어 삽입 탐지는 사전 배포 테스트와 런타임 가시성을 결합한 다계층 접근이 필요합니다.
정적 애플리케이션 보안 테스트(SAST)
OWASP Top 10에 따르면, 소스 코드 리뷰가 인젝션 취약점 탐지에 가장 효과적입니다. SAST 도구는 system(), exec(), popen(), shell_exec() 등 위험한 API가 사용자 제어 입력을 받을 때 플래그를 표시합니다. 문자열 연결로 OS 명령어 실행 함수에 전달하거나, PHP에서 escapeshellcmd() 대신 더 안전한 escapeshellarg()를 사용하지 않는 패턴이 주요 탐지 대상입니다.
SAST는 CI/CD 파이프라인에 통합해 배포 전 인젝션 결함을 탐지해야 합니다. 단점은 런타임에만 나타나는 취약점은 탐지할 수 없다는 점입니다.
동적 애플리케이션 보안 테스트(DAST)
DAST는 실제로 악용 가능한 취약점을 실행 중인 애플리케이션을 테스트하여 검증합니다. Web Security Academy는 세 가지 DAST 기법을 문서화합니다:
- 직접 출력 인젝션:
& echo uniquestring &을 삽입하고 응답에 문자열이 나타나는지 확인 - 블라인드 시간 기반 인젝션:
& sleep 10 &을 삽입하고 응답 지연 측정 - Out-of-band(OAST) 인젝션: DNS 콜백 명령어를 삽입하고 외부 서버로의 요청을 모니터링. 블라인드 인젝션 탐지에 가장 신뢰할 수 있는 방법입니다.
프로세스 수준의 행위 가시성
호스트 수준에서, NIST SP 800-53(정보 시스템 모니터링)은 행위 이상 탐지 프레임워크를 제시합니다. SOC는 다음과 같은 지표를 모니터링해야 합니다:
- 웹 서버 프로세스(
apache, nginx, tomcat)가 셸 프로세스(bash, sh, cmd.exe, powershell)를 생성하는 경우 - 웹 애플리케이션 프로세스 컨텍스트에서 발생하는 예상치 못한
execve()또는system()호출 - 애플리케이션 프로세스가 외부 IP로 시작하는 아웃바운드 네트워크 연결
웹 애플리케이션 방화벽(WAF) 규칙
OWASP ModSecurity Core Rule Set은 HTTP 입력값 내 셸 메타문자(;, |, &, backticks, $())와 일반적인 OS 명령어(whoami, cat /etc/passwd, nslookup)를 탐지합니다. WAF 규칙은 인코딩 및 대소문자 변형으로 우회될 수 있으므로, 완전한 통제가 아닌 신호원 중 하나로 간주해야 합니다.
방법별 비교
| 방법 | 시점 | 블라인드 인젝션 탐지 | 주요 한계 |
| SAST | 배포 전 | N/A(정적) | 런타임 전용 이슈 탐지 불가 |
| DAST | 배포 전/후 | 예(OAST 활용) | 복잡한 흐름 누락 가능 |
| 행위 가시성 | 운영 환경 | 예 | 기준선 튜닝 필요 |
| WAF | 운영 환경 | 부분적 | 우회 가능, 근본 원인 해결 불가 |
취약점 탐지만으로는 충분하지 않습니다. 예방을 위해서는 코드와 아키텍처의 근본 원인을 제거해야 합니다.
OS 명령어 삽입 예방 방법
예방의 핵심은 사용자 제어 입력값이 포함된 직접적인 OS 셸 호출을 제거하는 것입니다. 셸 호출을 완전히 제거할 수 없는 경우, 계층적 통제로 공격 표면을 줄입니다.
1차 방어: OS 명령어 호출 자체를 피하기
PortSwigger에 따르면, 애플리케이션 계층 코드에서 OS 명령어를 호출하지 않는 것이 가장 강력한 예방책입니다. 대부분의 경우, 더 안전한 플랫폼 고유 API로 필요한 기능을 구현할 수 있습니다. 이메일 전송이 필요하다면 SMTP 라이브러리를, DNS 조회가 필요하다면 DNS 라이브러리를 사용하십시오. 셸 중개자를 제거하십시오.
파라미터화된 명령어 API 사용
OS 명령어 실행이 불가피하다면, 데이터와 명령어를 분리하는 구조적 메커니즘을 사용하십시오. Python에서는 subprocess.run()의 리스트 형태를 사용합니다:

리스트 기반 형태는 어떤 인수에도 셸이 메타문자를 해석하지 못하게 합니다.
허용 목록 기반 입력값 검증
OWASP 치트시트는 허용 목록 기반 검증을 두 번째 방어 계층으로 권장합니다. 엄격한 정규 표현식으로 허용 문자와 최대 문자열 길이를 정의하십시오. OWASP는 ^[a-z0-9]{3,10}$ 예시를 제공하며, 모든 메타문자와 공백을 제외합니다.
PortSwigger는 명시적으로 경고합니다: 셸 메타문자를 이스케이프하여 입력값을 정제하려 하지 마십시오. 이 방법은 오류가 발생하기 쉽고 숙련된 공격자에게 우회당할 수 있습니다. 허용 목록이 항상 더 안전합니다.
최소 권한 원칙 적용(NIST AC-6)
NIST SP 800-53은 최소 권한 원칙 적용을 요구합니다. 명령어 삽입 방어를 위해:
- 웹 애플리케이션 프로세스를 전용 비권한 서비스 계정으로 실행
- 서비스 계정 권한을 필요한 파일 시스템 경로로만 제한
- 웹 애플리케이션 서비스 계정에 셸 접근(
/bin/sh, /bin/bash) 금지 - Linux에서
seccomp프로필로 사용 가능한 시스템 호출 제한
샌드박싱 및 컨테이너화 적용
읽기 전용 루트 파일 시스템, Linux 네임스페이스 및 cgroups, 강제 접근 제어 프로필(AppArmor 또는 SELinux) 등 컨테이너 격리는 삽입 발생 시 피해 범위를 줄입니다. 이 통제는 NIST CM-7 최소 기능 원칙과 일치합니다.
PHP 전용 통제
PHP에서 셸 명령어 호출이 불가피하다면, escapeshellcmd() 대신 escapeshellarg()를 사용하십시오. 이는 입력값을 단일 인수로 제한해 인수 삽입을 방지합니다.
이러한 코딩 및 아키텍처 통제가 기반을 이루며, 도구는 대규모로 이를 강제할 수 있는 가시성을 제공합니다.
OS 명령어 삽입 탐지 및 예방 도구
효과적인 방어를 위해서는 애플리케이션 보안 테스트, 런타임 보호, 엔드포인트 가시성을 아우르는 도구가 필요합니다. CISA 및 FBI 공동 경보는 명령어와 인수를 분리하는 내장 라이브러리 함수, 입력 파라미터화, 모든 사용자 입력값 검증을 명령어 삽입 방어로 권고합니다.
애플리케이션 보안 테스트 도구
- SAST 도구는 소스 코드에서 사용자 입력을 받는 위험한 API 호출을 탐지합니다. CI/CD 파이프라인에 통합해 배포 전 인젝션 결함을 탐지할 수 있습니다.
- DAST 도구는 Burp Suite 등 실행 중인 애플리케이션에서 악용 가능한 인젝션 지점을 테스트합니다. Burp Suite의 OAST 기능은 출력이 없는 블라인드 명령어 삽입 탐지에 특히 효과적입니다.
런타임 및 네트워크 보호
- WAF 솔루션은 OWASP ModSecurity Core Rule Set을 활용해 셸 메타문자 및 일반적인 인젝션 페이로드를 네트워크 계층에서 필터링합니다. 이는 심층 방어 계층으로 작동하지만, 근본 원인 해결을 대체할 수 없습니다.
- RASP 솔루션은 런타임에서 애플리케이션을 계측해 전체 애플리케이션 컨텍스트로 인젝션 시도를 차단할 수 있으며, 수정이 어려운 레거시 애플리케이션의 보완 통제로 활용됩니다.
엔드포인트 및 행위 가시성
엔드포인트 보안 플랫폼은 프로세스 생성, 부모-자식 관계, 명령줄 인수를 모니터링해 사후 악용 활동을 탐지하는 데 필수적입니다. 웹 서버 프로세스가 예상치 못한 셸을 생성할 때, 커널 수준의 행위 분석이 최후의 방어선이 됩니다.
관련 취약점
OS 명령어 삽입은 사용자 데이터와 실행 명령어를 분리하지 못하는 공통 원인을 가진 인젝션 취약점 계열에 속합니다. 여러 관련 취약점 유형이 CWE-78과 연계되거나 중첩될 수 있습니다.
- SQL 인젝션(CWE-89): OS 셸이 아닌 SQL 데이터베이스 엔진을 대상으로 합니다. SQL 인젝션은
xp_cmdshell등 데이터베이스 기능을 통해 OS 명령어 삽입으로 연계될 수 있습니다. - 코드 인젝션(CWE-94): 애플리케이션 자체 언어 런타임(PHP
eval(), Pythonexec())을 대상으로 합니다. 코드 인젝션은 공격자가 자신의 코드를 삽입해 애플리케이션이 실행하도록 하며, 삽입된 코드가system()또는exec()를 호출할 경우 OS 명령어 삽입으로 확장될 수 있습니다. - 인수 삽입(CWE-88): CWE-78의 하위 유형입니다. 구분자를 통한 새로운 명령어 삽입 대신, - 또는 --로 시작하는 플래그로 이미 호출된 프로그램의 인수를 조작합니다. 명령어 구분자 필터링이 적용되어도 성공할 수 있습니다.
- 서버 측 템플릿 인젝션(CWE-1336): 템플릿 엔진(Jinja2, FreeMarker)을 대상으로 합니다. SSTI는 템플릿 엔진이 언어 런타임에 접근할 수 있어 OS 명령어 삽입으로 자주 확장됩니다.
- 표현식 언어 인젝션(CWE-917): 웹 프레임워크의 표현식 언어 파서를 대상으로 합니다(OGNL, Spring SpEL). Log4Shell(CVE-2021-44228)이 대표적 사례로, 자주 OS 명령어 실행으로 연계됩니다.
| 취약점 | CWE | 대상 인터프리터 | OS 실행으로의 직접 경로 |
| OS 명령어 삽입 | CWE-78 | OS 셸 | 직접 |
| SQL 인젝션 | CWE-89 | SQL 엔진 | 간접(xp_cmdshell 경유) |
| 코드 인젝션 | CWE-94 | 애플리케이션 런타임 | 간접(시스템 호출 경유) |
| 인수 삽입 | CWE-88 | OS 셸 인수 파서 | 직접(호출된 명령어 조작) |
| SSTI | CWE-1336 | 템플릿 엔진 | 자주 OS 명령어로 확장 |
| EL 인젝션 | CWE-917 | 표현식 언어 파서 | 자주 OS 명령어로 확장 |
위 표는 여러 취약점 유형이 OS 수준 실행으로의 직접 또는 간접 경로를 제공함을 보여주며, 모든 인젝션 유형에 대한 심층 방어가 필수적임을 시사합니다.
관련 CVE
| CVE ID | 설명 | 심각도 | 영향 제품 | 연도 |
| git diff API 엔드포인트에서 명령어 삽입으로 에이전트 실행 통제 우회 | 치명적 | OpenHands AI Platform | 2026 | |
| WAN 진단 기능의 curl 파라미터를 통한 OS 명령어 삽입 | 치명적 | Tenda G300-F Router | 2026 | |
| VPN 모듈의 OS 명령어 삽입; 인증된 인접 공격자 | 높음 | TP-Link Archer BE230 | 2026 | |
| ICS 통신 장치의 인증 없는 OS 명령어 삽입 | 치명적 | Zenitel Devices | 2025 | |
| EDR 관리 플랫폼의 인증 없는 OS 명령어 삽입; 적극적 악용 | 치명적 | Sangfor EDR | 2025 | |
| DDNS CLI 구성에서 인증 후 명령어 삽입 | 높음 | Zyxel ATP/USG FLEX Firewalls | 2025 | |
| image.php에서 exec()로 전달된 정제되지 않은 입력값을 통한 명령어 삽입 | 치명적 | ZoneMinder v1.36.34 | 2025 | |
| 미들웨어 API 엔드포인트에서 인증 없는 RCE(명령어 삽입) | 치명적 | Hoverfly API Simulator | 2025 | |
| Nexus 스위치의 CLI 명령어 삽입; Velvet Ant 캠페인에서 악용 | 중간 | Cisco NX-OS | 2024 | |
| Task Manager 컴포넌트의 인증 없는 OS 명령어 삽입 | 치명적 | Synology BeePhotos/Photos | 2024 | |
| remote_help-cgi 엔드포인트의 인증 없는 명령어 삽입 | 치명적 | Zyxel NAS326/NAS542 | 2024 | |
| CGI 프로그램의 HTTP POST를 통한 인증 후 명령어 삽입; CISA KEV | 높음 | Zyxel VMG1312-B10A | 2024 | |
| CGI 요청 명령어 삽입으로 루트 수준 코드 실행 가능 | 치명적 | Webmin | 2024 | |
| 웹 UI를 통한 루트 수준 명령어 삽입; 적극적 악용; CISA KEV | 치명적 | Cisco IOS XE | 2023 | |
| 악의적 .tar 파일명을 통한 명령어 삽입; 적극적 악용; CISA KEV | 치명적 | Barracuda ESG | 2023 | |
| HTTP 요청을 통한 인증 전 OS 명령어 삽입; CISA KEV | 치명적 | Zyxel NAS326/540/542 | 2023 | |
| show_zysync_server_contents 함수의 인증 없는 명령어 삽입 | 치명적 | Zyxel NAS326/NAS542 | 2023 | |
| 사용자명 또는 호스트명 내 셸 메타문자를 통한 OS 명령어 삽입 | 중간 | OpenBSD OpenSSH | 2023 | |
| 로그인 인터페이스의 인증 없는 셸 메타문자 삽입; CISA KEV | 치명적 | Control Web Panel 7 | 2022 | |
| c_rehash 스크립트의 악의적 인증서 파일명을 통한 명령어 삽입 | 치명적 | OpenSSL | 2022 | |
| 웹 관리 인터페이스의 인증 없는 OS 명령어 삽입 | 치명적 | Zyxel NWA1100-NH | 2021 | |
| 라우터 펌웨어의 인증 전 명령어 삽입; CISA KEV | 치명적 | DrayTek Vigor Routers | 2020 | |
| weblogin.cgi를 통한 인증 전 명령어 삽입; 루트 권한 상승; CISA KEV | 치명적 | Zyxel NAS326 | 2020 | |
| goform/setUsbUnload의 deviceName 파라미터를 통한 명령어 삽입; CISA KEV | 치명적 | Tenda AC15 Router | 2020 |
결론
OS 명령어 삽입은 안전하지 않은 입력값을 셸 인터프리터에 전달하는 애플리케이션을 통해 공격자에게 직접적인 OS 수준 실행 권한을 부여합니다. OS 명령어 호출을 제거하고, 필요시 파라미터화된 API를 사용하며, 허용 목록 검증을 적용하면 노출을 줄일 수 있습니다.
예방에 실패할 경우, 엔드포인트에서 셸 생성, 아웃바운드 연결 등 악용 징후를 신속히 탐지하는 행위 가시성이 중요합니다.
자주 묻는 질문
OS command injection(CWE-78)은 애플리케이션이 정제되지 않은 외부 입력을 사용하여 운영 체제 명령을 구성할 때 발생하는 취약점입니다. 공격자는 셸 메타문자(;, |, &&)를 삽입하여 악의적인 명령을 추가하고, 이는 애플리케이션 권한으로 OS 셸에서 실행됩니다.
근본 원인은 입력을 셸 인터프리터에 전달하기 전에 사용자 데이터와 명령 구문을 분리하지 않는 데 있습니다.
네. OS command injection은 OWASP Top 10:2021 및 OWASP Top 10:2025 모두에서 Injection 카테고리로 분류되어 있습니다. CWE-77과 CWE-78 모두 명시적으로 포함되어 있습니다.
2025 버전에는 CWE-88(Argument Injection)도 추가로 매핑된 취약점으로 포함되었습니다.
네. CISA KEV 카탈로그에 등재된 대부분의 CWE-78 취약점은 인증 없이 원격에서 악용이 가능합니다. CVE-2014-6271(Shellshock), CVE-2023-28771(Zyxel), CVE-2024-3400 모두 인증되지 않은 원격 악용을 허용합니다.
방화벽, VPN 집중기, 엔터프라이즈 스위치를 포함한 네트워크 장비는 확인된 CWE-78 악용 사례가 가장 많이 발생하는 장비입니다. NAS 장치와 라우터를 포함한 IoT 및 임베디드 펌웨어는 봇넷 모집을 위해 체계적으로 표적이 됩니다.
서버 측 시스템 명령을 호출하는 웹 애플리케이션과 엔터프라이즈 관리 인터페이스 또한 높은 위험을 수반합니다.
공격자는 입력 필드, HTTP 헤더, 쿠키, URL 매개변수에 셸 메타문자와 진단 명령을 삽입하여 탐색합니다. 블라인드 인젝션의 경우 시간 지연(sleep 10)이나 공격자가 제어하는 서버로의 DNS 콜백을 사용합니다.
스캐너와 퍼징 도구는 모든 입력 벡터를 체계적으로 테스트합니다.
주요 지표로는 웹 서버 프로세스(apache, nginx, tomcat)가 예상치 못한 셸 프로세스(bash, sh, cmd.exe)를 생성하는 현상이 있습니다. 그 외에도 애플리케이션 프로세스에서 알 수 없는 IP로의 아웃바운드 네트워크 연결, 웹 애플리케이션 프로세스 컨텍스트에서 비정상적인 execve() 또는 system() 호출 등이 있습니다.
OS command injection은 공격자에게 직접적인 OS 수준 접근 권한을 제공하므로 매우 심각한 취약점 범주에 속합니다. 즉, 공격자는 호스트 운영 체제가 지원하는 모든 명령을 실행할 수 있습니다.
CWE-78은 MITRE 소프트웨어 취약점 분류 상위에 속하며, 확인된 CVE는 CVSS 9.0 이상 점수를 받는 경우가 많습니다.
SAST 도구는 소스 코드 내 위험한 API 호출을 신뢰성 있게 탐지하지만, 런타임에서만 발생하는 취약점은 놓칠 수 있습니다. DAST 도구는 악용 가능한 인젝션 지점을 찾아내며, 블라인드 인젝션에는 OAST 기법을 활용합니다.
WAF 규칙은 알려진 패턴을 탐지하지만 인코딩을 통해 우회될 수 있습니다. 프로세스 수준의 행위 가시성이 가장 신뢰할 수 있는 런타임 탐지 방법입니다. 단일 도구로 모든 변종을 탐지할 수 없으므로 계층적 대응이 필요합니다.
중요 인프라와 통신 산업이 가장 높은 위험에 노출되어 있습니다. CISA 권고문은 중국 정부 지원 공격자가 통신 및 라우터 인프라를 표적으로 삼은 사례를 문서화하고 있습니다.
연방 정부 기관은 KEV 조치 기한을 준수해야 합니다. 인터넷에 노출된 네트워크 장비나 임베디드 펌웨어를 사용하는 모든 산업이 잠재적 표적이 될 수 있습니다.


