[단독방어] 분석 — CVE-2026-59726
Critical unauthenticated RCE in Ruflo < 3.16.3 via exposed POST /mcp* endpoints; immediate external block of those URLs is the top‑priority mitigation.
📋 요약
- 심각도 critical · CVSS 10.0 · EPSS 0.00478 · 악용난이도 moderate
🔍 공격 기법
Ruflo 3.16.2 이하 기본 docker‑compose 배포에서는 /mcp 와 /mcp/:group POST 엔드포인트가 인증 없이 노출됩니다. 네트워크 상의 공격자는 해당 URL에 tools/call → terminal_execute payload 를 전송하면 브리지 컨테이너 내부에서 쉘을 획득하고, 저장된 Provider API 키를 열람하거나 AgentDB 학습 데이터를 변조할 수 있습니다. 이 흐름은 CVSS 3.1/AV:N/AC:L/PR:N/UI:N 로 정의된 완전 원격 코드 실행이며, 사용자 개입이 전혀 필요하지 않습니다.
악용 가능성: CVSS 벡터 AV:N/AC:L/PR:N/UI:N 은 네트워크를 통해 직접 접근 가능하고 공격 난이도가 낮으며 인증·사용자 상호작용이 전혀 필요하지 않음을 의미하므로, 원격 무인 공격이 현실적으로 가능한 상황을 나타냅니다. 실제로는 Docker‑compose 배포 환경에서 MCP 브리지 API인 POST /mcp 와 POST /mcp/:group 가 인증 없이 노출되어 있으면, 내부망에 접근할 수 있는 공격자는 해당 엔드포인트에 요청만 보내면 됩니다. EPSS 값 0.00478(≈0.48 %)은 이 취약점이 실제로 악용될 확률이 존재함을 보여주며, KEV 리스트에 등재되지 않았더라도 공개된 PoC와 유사한 시나리오가 보고된 점을 고려하면 실전 위
💥 영향 분석
- 브리지 컨테이너에 루트 쉘을 획득해 호스트 및 동일 네트워크의 다른 서비스까지 권한 상승
- Provider API 키 탈취 → 외부 Claude·Codex 서비스 무단 사용 및 비용 발생 위험
- AgentDB 학습 스토어 변조 → 악성 프롬프트가 지속적으로 재생산돼 추후 자동화 공격에 활용 가능
🔗 관련 취약점·체이닝
- CWE‑287 (Improper Authentication) – 인증 없이 중요한 API 노출
- CWE‑20 (Improper Input Validation) – POST 파라미터 검증 부재로 임의 명령 실행
- 추정: 브리지 컨테이너에 Docker API 혹은 SSH 서비스가 존재할 경우, 획득한 쉘을 통해 추가 권한 상승 체인이 형성될 수 있습니다.
🔎 탐지
로그 지표
- 웹 프록시(Nginx, Traefik 등) 접근 로그:
method=POST&uri가/mcp혹은/mcp/로 시작하는 항목. - 컨테이너 stdout/stderr 로그에
"terminal_execute"또는"shell spawned"문자열이 기록되는 경우.
SIEM 규칙 예시 (SQL‑like 형태)
- 규칙 1: 인증 로그와 매핑되지 않은
/mcp*POST 요청 탐지
1SELECT * 2FROM web_access_log 3WHERE http_method = 'POST' 4 AND uri LIKE '/mcp%' 5 AND NOT EXISTS ( 6 SELECT 1 FROM auth_log 7 WHERE auth_log.request_id = web_access_log.request_id 8 )- 규칙 2: 컨테이너 로그에
terminal_execute호출이 포함된 레코드 탐지
1SELECT * 2FROM container_stdout 3WHERE message ILIKE '%terminal_execute%'- 규칙 3: 위 두 조건을 결합해 고위험 경보 생성 (연속 5분 내 동일 source_ip 에서 3회 이상)
1SELECT source_ip, COUNT(*) AS cnt 2FROM web_access_log 3WHERE http_method='POST' AND uri LIKE '/mcp%' 4GROUP BY source_ip 5HAVING cnt >= 3 AND MAX(event_time) - MIN(event_time) <= INTERVAL '5 minutes'정규식 패턴
- HTTP 접근 로그:
(?i)POST\s+\/mcp(?:\/\w+)? - 컨테이너 출력:
terminal_execute\s*[:=]\s*success|shell\s*spawned
오탐 튜닝
CI/CD 파이프라인에서 자동 테스트가 /mcp 를 호출할 수 있습니다. 해당 요청은 고유 User-Agent(예: CI-Tester) 로 구분되므로, 규칙 1에 user_agent NOT LIKE 'CI-Tester%' 조건을 추가합니다. 또한 내부 관리망(IP 10.0.0.0/8)에서만 허용되는 경우 source_ip IN (10.0.0.0/8) 로 제한하면 정확도가 높아집니다.
🛡️ 완화 방안
즉시(긴급 차단) – 오늘 당장 적용할 임시 조치
Docker 호스트의 외부 인터페이스에 iptables 문자열 매칭 규칙을 추가해 /mcp 경로를 포함하는 HTTP(S) 트래픽을 차단합니다.
- 명령 예시 (루트 권한 필요)
1iptables -I INPUT -p tcp --dport 80 -m string --string "/mcp" --algo bm -j DROP 2iptables -I INPUT -p tcp --dport 443 -m string --string "/mcp" --algo bm -j DROP구현 난이도 ★★ (방화벽 규칙 삽입만) → 운영 영향 가용성 없음(엔드포인트는 외부에서 사용되지 않음).
검증 방법: 외부 IP에서 curl -X POST http://<host>/mcp 요청 시 403/404 혹은 연결 차단 응답이 반환되는지 확인합니다.
단기(완화)
프록시 또는 API 게이트웨이에 기본 인증(Basic Auth) 또는 토큰 기반 인증을 적용하고, /mcp* 경로는 내부 서브넷(예: 10.0.0.0/24)만 접근 허용하도록 네트워크 ACL을 설정합니다.
- 구현 난이도 ★★★ (프록시 설정 변경 및 인증 토큰 배포 필요) → 운영 영향 인증 요구로 기존 자동화 스크립트 수정 필요, 일시적 서비스 재시작 가능성 존재.
- 검증 방법: 내부 클라이언트는
200 OK를 받고, 외부 혹은 비인증 요청은401 Unauthorized가 반환되는지 테스트합니다.
근본(해결)
Ruflo 를 3.16.3 이상 버전으로 업그레이드합니다. 최신 이미지에는 /mcp 엔드포인트에 인증 검사가 내장되어 있습니다.
- 구현 난이도 ★★ (이미지 교체 후
docker-compose pull && docker-compose up -d실행) → 운영 영향 컨테이너 재시작에 따른 몇 분간 다운타임 발생 가능. - 검증 방법: 업그레이드 후 동일 비인증 POST 요청 시
401/403응답을 확인하고, 정상 기능(예: Agent 호출)이 기대대로 동작하는지 애플리케이션 테스트 수행합니다.
우선순위 근거
다중 소스 교차검증 결과(CVE-2026-59726)와 EPSS 0.00478(실측 악용 예측)·CVSS 10.0·critical 수준을 종합해, 이번 주 내에 긴급 차단 → 단기 인증 적용 → 버전 업그레이드 순으로 진행하는 것이 권장됩니다. KEV 등재가 없지만 EPSS 값이 ‘moderate’이며 네트워크 노출 자체가 높은 위험을 초래하므로 즉시 차단 조치가 최우선입니다.
⚖️ 위험도 / 우선순위
- 조치: scheduled (이번 주 내)
- 근거: CVSS=10.0 · non-KEV · EPSS=0.00478 · exploit=moderate · in_scope=None