npm의 open 패키지는 URL이나 파일을 운영체제 기본 방식으로 여는 작은 유틸리티지만, Windows에서는 PowerShell을 거친다. CVE-2026-119025는 이 PowerShell 경로에서 인자 이스케이프가 불완전했던 문제를 가리킨다. 같은 결함이 MCP Inspector의 OAuth 인가 URL 자동 오픈 동작과 만나면, 원격 MCP 서버가 사용자 머신에서 코드를 실행하는 경로로 승격될 수 있다는 점이 보안 어드바이저 GHSA-q978-78c7-phqw로 공개됐다.
개요

- npm open 패키지에서 PowerShell 인자 이스케이프 처리 결함으로 인한 OS 명령 삽입 취약점 CVE-2026-119025가 보고됐다. 영향 범위는 7.2.0 이상 11.0.0 미만이고, Windows에서 PowerShell을 통해 URL을 열 때 성립한다. CVE 배정자는 VulnCheck(CNA)이며 레코드 상태는 PUBLISHED다.
- 이 결함은 MCP Inspector의 동작과 결합한다. Inspector는 OAuth 인가 URL을 자동으로 열고, 그 URL은 원격 MCP 서버가 정한다. 따라서 악성 또는 미검증 MCP 서버가 인가 URL에 페이로드를 심어 사용자 머신에서 임의 코드를 실행할 수 있는 경로가 GHSA-q978-78c7-phqw로 기술됐다.
- Windows와 WSL이 함께 거론된다. 개념 증명(PoC)과 기술 연구는 확인됐으나, 야생 실제 악용 사례와 CISA KEV 등재 여부는 이번 자료에서 확인되지 않았다.
영향 범위
- open 패키지: 7.2.0 이상 11.0.0 미만. PowerShell을 경유해 URL이 열리는 Windows 환경이 전제 조건이다.
- MCP Inspector 사용자: GHSA-q978-78c7-phqw의 범위에서, 신뢰할 수 없는 원격 MCP 서버의 OAuth 인가 URL을 자동으로 여는 환경.
- 플랫폼: Windows, 그리고 WSL을 포함해 Windows의 URL 오프너가 동작하는 환경.
- 자산 관점: 개발자 워크스테이션이 표적이 되면 소스 코드, 자격 증명, 저장된 토큰 등이 직접 노출될 수 있다. 이는 위 조건이 충족됐을 때의 잠재 피해로 해석해야 하며, 확인된 실제 피해 사례는 이번 자료에 없다.
기술적 분석
PowerShell이 URL을 해석하는 순간
open은 Windows에서 URL을 열 때 PowerShell을 사용한다. 7.2.0부터 11.0.0 미만에서는 인자 이스케이프가 불완전했고, 어드바이저에 따르면 URL 직렬화는 페이로드에 필요한 모든 문자를 그대로 보존한다. 그 결과 URL 안에 PowerShell 서브표현식 형태의 구문이 포함되면, 이스케이프되지 않은 채 PowerShell 해석기에 전달된다. 원인은 URL을 여는 행위 자체가 아니라, URL을 PowerShell 인자로 넘기는 지점의 인용 처리에 있다.
OAuth 인가 URL이 공격 표면이 되는 조건
MCP Inspector 어드바이저는 Inspector가 OAuth 인가 URL을 자동으로 열며 그 URL을 원격 MCP 서버가 선택한다고 설명한다. 상대가 URL을 정하고 도구가 개입 없이 여는 구조에서는 사용자의 눈으로 확인하는 단계가 사실상 생략된다. Inspector의 용도 자체가 동작을 알 수 없는 서버를 향하도록 설계돼 있으므로, 이 도구를 쓰는 집단은 애초에 위험이 몰리는 방향에 있다. 악성 MCP 서버가 인가 URL에 삽입 페이로드를 심고, open의 이스케이프 결함이 그 페이로드를 PowerShell 해석기로 실어 나르면, 최종 단계는 사용자 머신에서의 임의 코드 실행이 된다.
공개 PoC·익스플로잇 분석
- 출처: 이번 자료에서 공격 경로와 PoC의 근거로 확보된 문서는 modelcontextprotocol/inspector 저장소의 보안 어드바이저 GHSA-q978-78c7-phqw다. 어드바이저는 URL 직렬화가 페이로드에 필요한 모든 문자를 보존한다고 명시하고, Inspector가 OAuth 인가 URL을 자동으로 열되 그 URL은 원격 MCP 서버가 선택한다고 설명한다. 원인과 수정 측의 근거는 CVE 레코드 CVE-2026-119025(VulnCheck 배정, PUBLISHED)와 v11.0.0 릴리스 노트의 "Fix PowerShell argument escaping" 항목이 제공한다.
- 전제조건: 확인된 경로는 다음 조건이 한 흐름에 모일 때 성립한다. 사용자가 공격자가 제어하는 원격 MCP 서버에 연결할 것, OAuth 인가 흐름에서 인가 URL이 도구에 의해 자동으로 열릴 것, 그 URL을 여는 코드가 Windows 또는 WSL에서 open 7.2.0 이상 11.0.0 미만의 PowerShell 인자 경로를 지날 것. 세 조건 중 하나라도 없으면 이 경로는 닫힌다.
- 입증 범위: 확인된 단계는 개념 증명(PoC)과 기술 연구까지다. 어드바이저가 보이는 것은 URL 문자열이 이스케이프 없이 PowerShell 해석기에 도달할 수 있다는 메커니즘과, 그 메커니즘이 Inspector의 자동 오픈 동작과 결합하면 원격 서버 선택 문자열이 셸에 전달된다는 구조다. 이는 관찰된 실제 침해 사례를 뜻하지 않는다. 야생 악용 사례와 CISA KEV 등재 여부는 이번 조사에서 확인하지 못했다.
- 운영상 의미: PoC 존재는 "실제 공격이 있었다"와 같은 말이 아니지만, 조건이 한 번 맞아떨어지면 성립하는 경로가 검증됐다는 뜻이다. 따라서 대응 판단의 근거를 실제 악용 확인에 두기보다, 자동 오픈 코드 경로·외부 제어 URL·PowerShell 의존 세 조건을 각 환경에서 점검하는 데 두는 편이 합리적이다. 특히 공격 진입점이 Inspector의 기본 동작에 있으므로, 사용자의 주의만으로 막기 어려운 구조라는 점이 버전 관리와 신뢰 경계 정비의 우선순위를 올린다.
두 결함의 결합이 주는 운영 의미
open만의 문제로 보면 심각도가 낮아 보일 수 있다. 그러나 확인된 사실을 연결하면, 조건이 한 흐름에 모이는 순간 영향이 계단식으로 커진다. 점검 관점에서는 다음 세 질문이 교차점을 찾는다.
- URL을 자동으로 여는 코드 경로가 있는가.
- 그 URL의 값을 외부, 즉 원격 서버가 정하는가.
- 여는 방식이 PowerShell 인자 이스케이프에 의존하는가.
세 조건이 동시에 성립하면, 사용자는 최종적으로 상대편이 고른 문자열을 셸 해석기에 넘기게 된다. 반대로 어느 하나라도 없으면 이 경로는 성립하지 않으므로, 동일 패키지 버전이라도 자동 오픈이나 외부 제어 URL이 없는 구성에서는 우선순위가 달라진다.
한 가지 더, 개발자 도구들이 URL 오프너를 공유하는 흐름도 점검 대상이다. opencode 저장소에는 opencode와 TUI가 브라우저 오프너를 공유하도록 만드는 변경(#51414)이 존재한다. 이런 구성에서는 오프너 구현 하나를 수정하거나 버전을 올리는 작업이 여러 구성 요소에 동시에 반영돼야 한다. 다만 이번에 확보된 인용은 의존성 변경의 일부에 가까워, 해당 저장소가 취약 버전을 사용했는지는 이 자료로 판단할 수 없다.
확인되지 않은 경계
- CVE 레코드의 상세 서술, CVSS 점수, 공식 심각도 등급은 원문 인용이 부분적으로만 확보되어 단정하지 않는다. 이번 글에서 확인한 것은 식별자, PUBLISHED 상태, 배정자(VulnCheck)뿐이다.
- CISA KEV 등재 여부와 야생 악용 사례는 확인되지 않았다. 따라서 "PoC와 기술 연구가 확인됨"과 "실제 공격이 확인됨"을 구분해서 다뤄야 한다.
- open 이외의 URL 오프너 라이브러리로 같은 문제가 퍼지는지는 근거가 없어 판단하지 않는다.
- 패치 내용은 v11.0.0 릴리스 노트의 "Fix PowerShell argument escaping"(커밋 274d704) 수준에서만 확인됐고, 그 밖의 세부 수정 내역은 확인되지 않았다.
대응 방안
먼저: open 버전 올리기
- 프로젝트와 전역 설치 상태에서
open을 11.0.0 이상으로 업그레이드한다. 11.0.0 릴리스에는 PowerShell 인자 이스케이프 수정이 포함된다. - 직접 의존성과 개발자 도구에 포함된 간접 의존성을 함께 점검한다. 점검 대상은 URL을 자동으로 여는 경로를 가진 도구다.
동시에: MCP 서버 신뢰 경계 정비
- 신뢰할 수 없는 원격 MCP 서버와의 연결을 중단하고, 승인된 서버만 사용하도록 정책을 정비한다.
- MCP Inspector 사용자는 자동으로 열리는 OAuth 인가 URL이 신뢰할 수 있는 서버에서 나온 것인지 확인하는 습관을 절차로 바꾼다.
탐지와 확인
- Windows에서 open 또는 URL 오프너가 호출한 PowerShell 프로세스의 명령줄에 서브표현식 구문이 포함되는지 모니터링한다.
- MCP Inspector 실행 이후 예상치 못한 인가 리디렉션 URL과 후속 PowerShell 자식 프로세스 생성을 상관 분석한다.
- 개발 머신과 저장소에서 open 7.2.0 이상 11.0.0 미만 버전을 쓰는지 종속성 점검을 진행한다.
지속 관리
- open 11.0.0 이상을 유지하는 상시 업데이트 관리.
- 오픈소스 CLI 도구가 내부적으로 URL을 셸 또는 PowerShell에 전달하는 경로에 대한 취약점 정기 점검.
- URL 오프너를 공유·재사용하는 도구 체계에서 수정 버전이 실제로 전파됐는지 확인.
이 글의 한계
위 탐지와 대응 항목은 전달된 분석 범위 안의 제안이다. 특정 로그 포맷이나 감사 설정, 탐지 규칙의 유효성, 업그레이드 후 동작 변경처럼 아직 확인되지 않은 세부 사항은 검증된 사실로 서술하지 않았다. 운영에 적용하기 전에 각 환경의 실제 의존성과 로그 가용성을 직접 확인해야 한다.
참고자료
- CVE-2026-119025: open 7.2.0 before 11.0.0 OS Command Injection via PowerShell on Windows
- share a browser opener across opencode and tui (#51414)
- Release v11.0.0 · sindresorhus/open
- A remote MCP server can execute arbitrary code on the user's machine through the OAuth authorization URL (PowerShell subexpression injection on Windows and WSL)
함께 읽으면 좋은 글
- CVE-2026-96652: Plex Media Server 인증 없는 SSRF와 CISA KEV 등재
- CVE-2026-106931 SiteGuard Server Edition OS 명령 주입 — 야생 악용 확인과 KEV 등재가 뜻하는 대응 순서
- CVE-2026-105134: AhsayCBS Replication Receiver OS 명령 주입, KEV 등재와 파트너 핫픽스 대응
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!