CVE-2026-90847 (ipTIME C200E OS 명령 주입) 분석
분류: CVE · 임베디드·네트워크장비 · OS 명령 주입 · CVE-2026-90847 · [표준]
임베디드 네트워크 장비의 관리 CGI가 사용자 입력을 셸(shell)에 그대로 흘려보내면, 인증된 관리자 화면 하나가 곧 웹 서버 프로세스 권한의 원격 명령 실행 통로가 됩니다. 이번 CVE-2026-90847은 EFM Networks의 ipTIME C200E(제조사 분류상 IP 카메라) 펌웨어 1.094에서, 시스템 설정 처리를 담당하는 iux_set.cgi가 바로 그 실수를 저지른 사례로 보고되었습니다. 공개 시점 기준 확인된 수정 펌웨어는 없고, 개념 증명(PoC, Proof-of-Concept)은 이미 외부에 공개된 상태입니다.
임베디드 장비의 명령 주입은 새로운 종류의 버그가 아닙니다. 웹 서버 애플리케이션이 20년 전에 겪은 문제가, 리소스가 빠듯한 임베디드 장비 펌웨어의 CGI(Common Gateway Interface) 계층에서 반복되는 것입니다. 관리 기능을 빠르게 구현하려고 사용자 값을 그대로 시스템 명령 문자열에 이어 붙이면, 세미콜론 하나로 그 뒤에 임의 명령이 딸려 실행됩니다. CVE-2026-90847은 그 교과서 같은 실수가 국내에서 널리 쓰이는 소비자용 네트워크 장비에서 다시 나온 사례입니다.
01 개요
- 무엇: ipTIME C200E(제조사 분류상 IP 카메라)의 관리용 CGI
iux_set.cgi(“System Setup” 처리부)에서 발생하는 OS 명령 주입(OS command injection). 특정 입력 필드의 값이 검증 없이 셸로 전달되어, 공격자가 기기에서 임의 운영체제 명령을 실행할 수 있는 것으로 보고되었습니다.⚠️미확인(팩트체크 대상)— 정확한 취약 파라미터 이름은 자문(advisory)에 공개되지 않았습니다. - 누가 노출되나: 펌웨어 1.094 버전의 ipTIME C200E.
⚠️미확인— 다른 펌웨어 버전이나 형제 모델의 영향 범위는 이 CVE 레코드에 명시되지 않았습니다. - 심각도: CVSS v3.1 기준 9.1(Critical), 벡터
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H로 보고되었습니다. CVSS v4.0 기준으로는 9.4(Critical), 벡터CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H로 확인됩니다(Tenable·OpenCVE 기준). OpenCVE 변경 이력에는 위협 성숙도 수정치(E:P)가 반영된 값도 함께 남아 있습니다.분석 - 전제 조건이 중요합니다: 벡터의
PR:H는 높은 권한(관리자급) 인증이 필요함을 뜻합니다. 즉 무인증 원격 공격이 아니라, 로그인한 관리자 세션을 전제로 한 취약점으로 읽는 것이 맞습니다.⚠️미확인— 일부 2차 매체는 “인증 불필요”라고 서술하나, 이는 자문의 “원격 공격 가능(remotely)“이라는 문구를 오독한 것으로 보이며, 1차 CVSS 벡터를 신뢰하면 인증 필요가 맞습니다.
한 줄 요약: 인증된 관리자 화면의 입력 하나가 검증 없이 셸에 닿으면, 그 화면이 곧 기기 전체의 원격 명령 실행 통로가 됩니다.
02 기술 배경 — CGI와 명령 주입 30초
임베디드 네트워크 장비의 웹 관리 화면은 대개 작은 CGI 프로그램(여기서는 iux_set.cgi)이 처리합니다. 브라우저가 보낸 설정 값을 받아 기기 내부 상태를 바꾸는 역할입니다.
문제는 이 과정에서 값을 다루는 방식입니다. 설정을 적용하려고 내부적으로 시스템 명령을 호출할 때, 사용자가 보낸 값을 명령 문자열에 그대로 이어 붙이면 셸은 그 값 안의 특수문자(;, &, |, 백틱 등)를 “명령 구분자”로 해석합니다. 값이어야 할 것이 명령이 되어 버리는 것입니다. 이것이 OS 명령 주입이며, 분류 체계로는 CWE-78(OS 명령에서 특수 요소 부적절 무력화) 와 그 상위인 CWE-77(명령 주입) 에 해당합니다.
03 CVE 분석 요약 — 어느 지점이 원인인가
보고된 근본 원인은 단순합니다. iux_set.cgi의 “System Setup” 처리 경로에서 특정 입력 값이 셸 메타문자에 대한 중화(sanitize) 없이 시스템 명령 실행으로 전달됩니다. 그 결과 공격자가 값 자리에 명령 구분자와 임의 명령을 넣으면, 원래 의도된 명령에 이어 그 명령이 웹 서버 프로세스 권한으로 실행됩니다.
소스 코드를 직접 인용하지 못하는 한계를 먼저 밝힙니다. ipTIME 펌웨어는 폐쇄소스(비공개) 입니다. 공개된 GitHub 저장소, 오픈소스 패치 커밋, 렌더 가능한 원본 소스 파일이 존재하지 않습니다. 따라서 이 표준판은 “고정 커밋의 취약 라인” 형태의 코드 그림을 제시하지 않습니다. 자문에 취약 함수 이름도 공개되지 않았습니다. ⚠️미확인 — 형제 격인 CVE-2026-7833(ipTIME C200, 1.092 이하)은 동일 계열 CGI(iux_set.cgi)의 RestoreFile 처리 경로에서 명령 주입을 언급합니다. 다만 함수 지목은 출처마다 갈립니다. 공개 PoC/보고서(glkfc)는 실행 지점을 sub_409054로 설명하고 sub_408F90은 원시값을 조회·반환하는 함수로 봅니다. 반면 VulDB 요약은 sub_408F90을 적습니다. 어느 쪽이든 이는 관련 CVE의 유추일 뿐 CVE-2026-90847에 대해 확인된 사실이 아닙니다. 분석
아래는 이 부류의 버그가 왜 생기는지 보여주기 위한 개념용 단순화 도식입니다. 벤더의 실제 소스가 아니며, 실제 페이로드도 아닙니다.
/* 개념용 단순화, 실제 페이로드/원본 코드 아님 — 벤더 소스 아님 */
/* 위험한 형태: 사용자 값을 명령 문자열에 그대로 이어 붙임 */
snprintf(cmd, sizeof(cmd), "some_tool %s", user_value);
system(cmd); /* user_value 안의 ; & | ` 가 명령 구분자로 해석됨 */
/* 방어적 형태(개념): 인자를 셸로 흘리지 않고 배열로 직접 넘김 */
char *argv[] = { "some_tool", user_value, NULL };
execv("/path/some_tool", argv); /* 셸을 거치지 않아 메타문자가 값으로만 취급됨 */
핵심 원리는 “값이 셸을 거치느냐”입니다. 값을 셸 명령 문자열에 문자열로 합치는 순간 특수문자가 해석되고, 셸을 거치지 않고 인자 배열로 프로세스에 직접 전달하면 같은 문자는 그냥 데이터로 남습니다.
04 공격 시나리오 · 영향도 · 대응방안
공격 시나리오 (개념 수준)
- 공격자가 대상 기기의 관리자 세션을 확보합니다. 보고된 심각도 벡터상 이 단계가 전제이며(
PR:H), 원격에서 접근 가능한 관리 인터페이스가 노출되어 있어야 합니다. - “System Setup” 관련 요청의 특정 입력 필드에 명령 구분자와 명령을 얹은 값을 넣어 전송합니다.
iux_set.cgi가 그 값을 중화 없이 셸로 전달하면, 얹은 명령이 기기에서 실행됩니다.
완성형 익스플로잇과 작동하는 페이로드는 이 글에 싣지 않습니다(랩 공개 윤리 + 무해화 원칙). 위 서술은 원리 이해를 위한 흐름 요약입니다.
영향도
공개 레코드에서 직접적으로 확인되는 영향은 웹 서버 프로세스 권한의 임의 OS 명령 실행까지입니다. 심각도 벡터의 스코프 변경(S:C)과 기밀성·무결성·가용성 모두 High(C:H/I:H/A:H)는 여기서 더 나아가 기기 전반의 통제권 상실로 확대될 가능성을 시사하지만, 이는 CVSS 영향값에 근거한 일반론적 추정입니다. 임베디드 네트워크 장비가 장악되면 트래픽 가로채기, 내부망 발판 확보, 봇넷 편입 같은 후속 피해로 번질 수 있습니다. 분석 — 후속 피해 서술은 일반적 임베디드 장비 명령 주입의 귀결에 근거한 우리 추정이며, 이 CVE에 대해 실제 악용이 확인된 바는 없습니다. ⚠️미확인 — 공개 시점 기준 실환경 악용 미확인, CISA KEV(알려진 악용 취약점 목록) 미등재, EPSS(향후 악용 확률 추정치)는 일부 집계 사이트(Armis 등) 기준 약 2.2%로 나타나나 OpenCVE에는 “EPSS 값 없음(n/a)“으로 표시됩니다.
대응방안
- 근본 대책 — 안전 버전 적용:
⚠️미확인— 현재 보고 기준 벤더 공식 패치·회피책이 공개되지 않았습니다. 벤더(ipTIME) 펌웨어 공지를 주시하고, 수정 펌웨어가 나오면 즉시 적용하는 것이 근본 대책입니다. 발행 전 벤더 페이지에서 최신 펌웨어 배포 여부를 재확인해야 합니다. - 차선(패치 전까지): 관리 인터페이스를 인터넷에 노출하지 말고 내부망·VPN 경유로만 접근하도록 제한합니다. 관리자 계정 비밀번호를 강한 값으로 바꾸고 기본 자격증명을 제거합니다. 원격 관리 기능이 필요 없으면 비활성화합니다. 이 취약점이 인증을 전제로 하므로, 관리자 접근 경로를 좁히는 것이 실질적 완화가 됩니다.
- 탐지 관점: 관리 CGI 요청에서 값 필드에 섞인 셸 메타문자(
;,|,&, 백틱)와 비정상적 시스템 명령 패턴을 로그·IPS 규칙으로 모니터링합니다. 기기에서 예기치 않은 아웃바운드 연결이나 프로세스 생성이 관측되면 침해를 의심합니다.
05 왜 이 부류는 반복되는가 (논평)
이 사건은 새로운 발견이라기보다 오래된 실수의 재발입니다. 값과 코드의 경계를 흐리는 순간 생기는 취약점이라는 점에서, 이 명령 주입은 SQL 주입, 서버 사이드 템플릿 주입, LDAP 주입과 같은 뿌리에서 나옵니다. 모두 “신뢰할 수 없는 입력을, 해석기가 문법으로 읽는 자리에 그대로 놓았다”는 한 문장으로 요약됩니다.
임베디드 장비에서 이 계열이 특히 자주 보이는 이유는 구조적입니다. 리소스가 빠듯한 펌웨어는 기능을 빨리 붙이려고 외부 유틸리티를 셸로 호출하는 경우가 많고, 그 호출에 사용자 값을 문자열로 이어 붙이기 쉽습니다. 형제 격 CVE-2026-7833이 같은 CGI 계열에서 유사한 싱크로 보고된 점도, 이것이 한 번의 실수가 아니라 코드베이스 전반의 패턴일 수 있음을 시사합니다. 분석
핵심 교훈은 언어가 이미 답을 주었다는 것입니다. 값을 셸 문자열에 합치지 말고, 셸을 거치지 않는 인자 전달(예: 인자 배열로 직접 프로세스 실행)을 쓰면 이 계열 전체가 원천적으로 닫힙니다. 필터로 특수문자를 막는 방식은 우회 여지가 남지만, 애초에 셸을 경유하지 않으면 메타문자가 데이터로만 남습니다.
06 결론
CVE-2026-90847은 인증된 관리자 화면의 입력이 검증 없이 셸에 닿아 생긴 OS 명령 주입으로, 성공 시 소비자용 네트워크 장비 한 대에서 임의 명령이 실행될 수 있는 사례로 보고되었습니다. 이 한 틈은 언젠가 패치되겠지만, “값과 명령의 경계를 흐린다”는 사고방식은 다른 장비, 다른 CGI에서 또 나옵니다. 그래서 우리는 특정 익스플로잇이 아니라 경계를 지키는 방법을 기록으로 남깁니다.
References / 참고자료
- 원 CVE 레코드(1차출처·CNA): VulDB, “EFM ipTIME C200E System Setup iux_set.cgi os command injection” (VDB-403400) — 이 CVE를 배정한 CNA 레코드(취약 제품·파일·심각도 벡터·공개일의 기준). https://vuldb.com/cve/CVE-2026-90847
- NVD, “CVE-2026-90847 상세” — CVE 레코드를 수집·농축한 미러 출처(CWE·CVSS 농축치). https://nvd.nist.gov/vuln/detail/CVE-2026-90847
- OpenCVE, “CVE-2026-90847” — 제품·버전·CWE·CVSS 미러 집계, CVSS v4.0 및 변경 이력. https://app.opencve.io/cve/CVE-2026-90847
- OffSeq Threat Radar, “OS Command Injection in EFM ipTIME C200E 1.094” — 근본 원인·인증 전제·영향 서술 교차 확인. https://radar.offseq.com/threat/cve-2026-90847-os-command-injection-in-efm-iptime-c200e-1c30057b126bbbf4
- 관련 선행 CVE(VulDB 요약): VulDB, “CVE-2026-7833 — ipTIME C200 iux_set.cgi (
sub_408F90,RestoreFile)” — 동일 계열 형제 사례(유추 근거, 본 CVE 확정 아님). VulDB는 싱크를sub_408F90으로 적습니다. https://vuldb.com/vuln/361112 - 관련 선행 CVE(원 PoC/보고서): glkfc, “iptime c200
sub_409054vulnerability report” — 실행 지점을sub_409054로,sub_408F90을 원시값 조회 함수로 설명(#5와 함수 지목이 갈리는 근거). https://github.com/glkfc/IoT-Vulnerability/blob/main/iptime/c200/sub_409054_vulnerability_report_EN.md
이 글은 위 원 분석을 우리 관점에서 다시 쓰고 논평을 더한 것입니다. 특정 문장·코드를 그대로 옮기지 않았으며, 자세한 재현 절차는 원문을 참고하세요.
⚠️미확인표시가 붙은 항목은 발행 전 독립 팩트체커가 NVD·VulDB 등 1차출처로 대조·확정해야 합니다.