CVE-2026-33032: nginx-ui MCP 엔드포인트 미들웨어 한 줄 누락이 부른 서버 탈취
nginx-ui의 MCP 통합 기능에서 인증 미들웨어가 누락돼 CVSS 9.8의 무인증 서버 탈취로 이어진 CVE-2026-33032의 공격 구조와 MCP 보안 원칙을 정리한다.
2026-08-12 · 최초 발행 2026-04-19
인터넷에 접속 가능한 Nginx 관리 인터페이스 2,600여 개가 아무런 인증 없이 노출된 채 발견됐다. 공격자는 단 두 번의 HTTP 요청만으로 서버 전체를 장악할 수 있었고, 이미 실제 공격이 한 달 이상 진행된 뒤에야 공개됐다. AI 시대의 편의 기능 MCP가 관리 인터페이스와 결합될 때 어떤 일이 벌어지는지를 보여주는 사례다.
27자짜리 코드가 부른 파국
CVE-2026-33032는 오픈소스 Nginx 웹 관리 UI인 nginx-ui(GitHub 스타 11,000+, Docker 풀 430,000+)에서 발견된 CVSS 9.8의 치명적 인증 우회 취약점이다. 연구자들은 이를 MCPwn이라 명명했다. 원인은 놀랍도록 단순하다. nginx-ui가 AI 에이전트 연동을 위해 새로 추가한 MCP(Model Context Protocol) 통합 기능에서, 개발자 한 명이 커밋 하나에서 미들웨어 참조 하나를 빠뜨렸다. 27자짜리 코드 추가가 수천 개 서버를 위험에 빠뜨린 셈이다.
nginx-ui는 두 개의 MCP HTTP 엔드포인트를 노출한다.
| 엔드포인트 | IP 화이트리스트 | 인증(AuthRequired) |
|---|---|---|
/mcp |
적용 | 적용 |
/mcp_message |
적용 | 미적용 (누락) |
문제는 기본 IP 화이트리스트가 비어 있고, 미들웨어가 이를 "모두 허용"으로 처리한다는 점이다. 결과적으로 네트워크 접근이 가능한 모든 공격자가 /mcp_message를 통해 인증 없이 모든 MCP 도구를 실행할 수 있었다.
코드로 보는 취약점의 정체
취약 버전(2.3.3 이하)의 라우터 코드는 다음과 같은 구조적 불균형을 보인다.
// /mcp 엔드포인트 - 인증 있음
mcpGroup.GET("/mcp", IPWhiteList(), AuthRequired(), mcpHandler.SSE)
// /mcp_message 엔드포인트 - 인증 누락 (취약)
mcpGroup.POST("/mcp_message", IPWhiteList(), mcpHandler.Message)
// 패치 버전(2.3.4)에서의 수정
mcpGroup.POST("/mcp_message", IPWhiteList(), AuthRequired(), mcpHandler.Message)
공격 흐름은 2단계로 이루어진다.
공격자는 먼저 /mcp 엔드포인트에 SSE 연결을 수립해 sessionID를 획득한 뒤, 이 세션 ID를 파라미터로 /mcp_message에 POST 요청을 보낸다. 이때 AuthRequired() 미들웨어가 없으므로 토큰 검증이 전혀 이루어지지 않는다. 이렇게 얻은 접근으로 공격자는 Nginx 설정 파일을 임의로 생성·수정·삭제하고, server 블록을 재작성해 트래픽을 하이재킹하며, 잘못된 설정을 주입한 뒤 리로드를 트리거해 서비스를 중단(DoS)시키고, Nginx 프로세스 재시작 명령까지 실행할 수 있었다.
이미 한 달 넘게 진행되던 공격
Recorded Future는 2026년 4월 13일 보고서를 통해 CVE-2026-33032의 야생 악용이 이미 시작됐음을 확인했다. Shodan 기준 약 2,700개의 취약 인스턴스가 인터넷에 노출되어 있었고, 공격은 취약점 공개 전 최소 한 달간 은밀하게 진행됐다. 패치는 2026년 3월 15일 릴리스된 버전 2.3.4에 이미 포함돼 있었지만, 수많은 운영자가 이를 인지하지 못한 채 노출된 상태로 운영을 계속했다.
인증을 옵션으로 취급한 대가
CVE-2026-33032는 관리용 API에서 반복되는 구조적 실수를 보여준다. 바로 기능을 추가할 때 보안 미들웨어를 선택 사항으로 취급하는 안티패턴이다.
관리용 API는 반드시 Secure-by-Default 원칙을 따라야 한다. 라우터 그룹 전체에 인증 미들웨어를 전역 적용하고, 공개가 필요한 엔드포인트만 명시적으로 예외 처리해야 한다. 개별 엔드포인트를 등록할 때마다 미들웨어를 선택적으로 추가하는 방식은 인간의 실수(human error)에 취약하다.
MCP 엔드포인트는 일반 REST API보다 훨씬 강력한 제어 권한을 갖는 경우가 많다. AI 에이전트가 시스템 자원에 직접 접근·제어하는 특성상, MCP 보안은 다음 원칙을 반드시 지켜야 한다.
MCP 서버는 OAuth 2.1 리소스 서버로 동작해야 하며, 모든 요청은 Authorization 헤더의 Bearer 토큰으로 인증하고 토큰은 단기 수명(short-lived)이어야 한다. MCP 도구별로 세분화된 스코프를 정의해 각 엔드포인트가 필요한 스코프만 검증하는 범위 최소화(Least Privilege Scope)도 필요하다 — nginx:read와 nginx:write를 분리하는 방식이 대표적이다. 그리고 MCP-Session-Id는 인증 수단으로 쓸 수 없다. CVE-2026-33032처럼 세션 ID만으로 권한 있는 작업을 실행하는 구조는 명백한 설계 결함이다.
관리 인터페이스는 인터넷과 분리돼야 한다
nginx-ui 같은 관리 인터페이스는 인터넷에 직접 노출되어서는 안 된다. 아래는 권장 격리 아키텍처다.
핵심 격리 원칙은 네 가지다. 관리 인터페이스는 별도 포트(예: 8080)를 쓰고 방화벽·보안그룹으로 허용 IP를 명시적으로 제한하는 관리 포트 분리, 관리망 접근을 반드시 VPN이나 Bastion Host로 경유시키는 VPN/Bastion 강제, AI 에이전트와 MCP 엔드포인트 간 통신을 별도 격리된 네트워크 세그먼트에 두는 MCP 전용망, 내부 서비스 간 MCP 통신에 상호 TLS(mTLS)로 클라이언트 인증을 적용하는 것이다.
MCP가 AI 인프라의 핵심 통합 레이어로 자리잡으면서 보안 고려사항도 전통적인 API 보안과는 다른 차원이 됐다. 모든 AI 에이전트는 고유 ID를 가져야 하고, MCP 접근 토큰은 에이전트 ID와 테넌트 정보를 인코딩하며 단기 수명 토큰과 자동 갱신 메커니즘을 결합해야 한다. Nginx 설정 수정이나 서비스 재시작 같은 파괴적 작업에는 인간 승인(human-in-the-loop) 또는 MFA를 요구하는 다단계 동의 워크플로우를 적용해야 하는데, MCP 2.4 스펙은 이를 공식 지원한다. 모든 MCP 도구 실행은 에이전트 ID·타임스탬프·실행된 도구와 파라미터를 포함한 감사 로그로 남겨야 하고, 야간 대량 설정 변경 같은 이상 패턴은 즉시 알림을 보내야 한다. "네트워크 내부라도 신뢰하지 않는다"는 Zero Trust 철학을 MCP 레이어에도 적용해야 하며, IP 화이트리스트만으로는 충분하지 않고 요청마다 토큰을 검증해야 한다.
지금 확인해야 할 것들
nginx-ui를 운영 중이라면 아래 조치를 즉시 수행해야 한다.
버전 확인 및 업그레이드
# nginx-ui 버전 확인
nginx-ui --version
# Docker 환경
docker inspect nginx-ui | grep -i image
# 취약 버전: 2.3.3 이하
# 패치 버전: 2.3.4 이상으로 업그레이드 필수
인터넷 노출 여부 점검
# 관리 포트가 외부에 노출되었는지 확인
curl -s https://api.shodan.io/shodan/host/search?query=nginx-ui&key=YOUR_API_KEY
# 로컬에서 MCP 엔드포인트 접근 가능 여부 테스트
curl -s -o /dev/null -w "%{http_code}" http://localhost:9000/mcp
방화벽 규칙 임시 차단 (패치 전 긴급 조치)
# iptables로 nginx-ui 포트 외부 접근 차단
iptables -A INPUT -p tcp --dport 9000 -s 0.0.0.0/0 -j DROP
iptables -A INPUT -p tcp --dport 9000 -s 192.168.0.0/24 -j ACCEPT
# 또는 ufw 사용
ufw deny 9000
ufw allow from 192.168.0.0/24 to any port 9000
침해 여부 확인
# nginx 설정 변경 이력 확인 (git 관리 중인 경우)
git -C /etc/nginx log --oneline -20
# 최근 nginx 설정 파일 수정 시간 확인
find /etc/nginx -newer /etc/nginx/nginx.conf -type f
# nginx-ui 접근 로그에서 /mcp_message 무인증 접근 탐지
grep "POST /mcp_message" /var/log/nginx-ui/access.log
CVE-2026-33032는 단순한 미들웨어 누락 실수가 어떻게 수천 개 서버의 완전 장악으로 이어지는지를 보여주는 교과서적 사례다. AI 에이전트 통합을 위한 MCP 기능이 관리 인터페이스에 결합되는 순간, 보안 설계의 중요성은 기하급수적으로 커진다. MCP 엔드포인트는 일반 API가 아니라 시스템 자원에 대한 직접 제어권을 AI 에이전트에게 부여하는 통로이기 때문이다.
Secure-by-Default 원칙, 관리 인터페이스의 네트워크 격리, 토큰 기반 에이전트 인증, 고위험 작업에 대한 인간 승인 워크플로우 — 이 네 가지가 AI 인프라 시대의 MCP 보안 필수 요건이다. nginx-ui를 사용 중이라면 지금 당장 버전을 확인하고 2.3.4로 업그레이드해야 한다.
Sources
- Actively Exploited nginx-ui Flaw (CVE-2026-33032) Enables Full Nginx Server Takeover — The Hacker News
- CVE-2026-33032 (MCPwn): How a Missing Middleware Call in nginx-ui Hands Attackers Full Web Server Takeover — Picus Security
- CVE-2026-33032: Nginx UI Missing MCP Authentication — Rapid7
- Critical Nginx UI auth bypass flaw now actively exploited in the wild — BleepingComputer
- CVE-2026-33032: severe nginx-ui bug grants unauthenticated server access — Security Affairs
- CVE-2026-33032, nginx-ui's Unauthenticated MCP Endpoint Allows Remote Nginx Takeover — Endor Labs
- Security Best Practices - Model Context Protocol
- MCP Authentication: Step by Step Guide and Security Best Practices — Obot AI
- Securing the Model Context Protocol (MCP): A Deep Dive into Emerging AI Risks — Zenity
- Model Context Protocol (MCP): Security Risks — Security Boulevard