
RufRoot: Ruflo의 MCP 브리지에 대한 인증되지 않은 요청 한 번으로 명령이 실행되고, 키가 탈취되며, AI 메모리가 오염됐다
- OrcaNEWOrcaCyber: MiniMax M3.1 Flash Abliterated / Uncensored2026-10-29101 tok/s
- OrcaNEWOrcaCyber: GLM 5.3 Flash Abliterated / Uncensored2026-10-27$0.80 / $1.60 100만 토큰당 · 103 tok/s
- OrcaNEWOrcaCyber: Qwen3.8 Flash Next Abliterated / Uncensored2026-10-26$0.80 / $1.60 100만 토큰당 · 283 tok/s
- OrcaNEWOrcaCyber: MiMo V2.6 Flash Abliterated / Uncensored2026-10-26$0.80 / $1.60 100만 토큰당 · 93 tok/s
- MoonshotNEWMoonshotAI: Kimi K3.1 Pro2026-10-2446지능
- OrcaNEWOrcaCyber: DeepSeek V4.1 Flash Abliterated / Uncensored2026-10-23$0.80 / $1.60 100만 토큰당 · 107 tok/s
- minimaxNEWMiniMax: M3.1 Flash2026-10-1929지능
- OrcaNEWOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 100만 토큰당 · 70 tok/s
- deepseekNEWDeepSeek: DeepSeek V4.1 Flash 10172026-10-1733지능
- DeepSeekNEWDeepSeek: DeepSeek V4.1 Flash2026-10-1740지능
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 100만 토큰당 · 96 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2955지능
- anthropicAnthropic: Claude Sonnet 5.52026-09-2854지능
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 100만 토큰당 · 168 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2228지능
- OpenAIOpenAI: GPT-6 Sol2026-09-2248지능
- AnthropicAnthropic: Claude Opus 5.52026-09-2258지능
- xiaomiXiaomi: MiMo-V2.6-Flash2026-09-2127지능
- xiaomiXiaomi: MiMo-V2.6-Pro2026-09-2130지능
- xAIGrok 4.72026-09-2134지능
2026년 6월 30일에, Noma Labs는 Ruflo의 관리자에게 프로젝트 자체에 맞선 동작하는 익스플로잇을 넘겼다. Noma Security의 연구 부문은 Ruflo가 — 오픈소스 에이전트 오케스트레이션 플랫폼으로, 예전에는 Claude Flow로 출시되었던 — 기본 Docker Compose 배포를 제공하면서 그 Model Context Protocol 브리지를 모든 네트워크 인터페이스의 포트 3001에 바인딩하고 인증을 전혀 요구하지 않았다는 사실을 발견했다. /mcp 엔드포인트에 대한 단일 HTTP 요청만으로도 컨테이너 내부에서 node 사용자 권한으로 셸 명령을 실행할 수 있었고, 그 셸에서 공격자는 환경에 있는 모든 LLM 제공업체 API 키를 읽고, 저장된 모든 대화를 덤프하고, 피해자의 키로 과금되는 에이전트 스웜을 생성하고, AgentDB 학습 저장소에 지침을 기록하여 해당 인스턴스의 모든 사용자에 대해 AI의 답변을 계속 조종할 수 있었다. 이 취약점은 CVE-2026-59726이며, RufRoot라는 별명을 얻었고, CVSS 10.0으로 평가되었으며 3.16.3에서 24시간 이내에 수정되었다. 우리가 읽은 어떤 출처에서도 실제 악용되었다고 보고하지 않았다. 이 취약점에 대한 아카이브 자체 기록은 출처 목록 및 신뢰도 등급과 함께 AI 사건 아카이브에 있으며, 주변에 등록된 다른 MCP 및 인프라 항목 옆에 있다.
문을 열어준 기본값
Ruflo는 Noma Labs가 에이전트 메타 하네스라고 부르는 것으로, 최대 100개의 에이전트로 구성된 스웜을 위한 자체 호스팅 계층이며, Claude Code와 OpenAI Codex용으로 구축되었고, 장기 메모리와 도구 호출을 위한 내장 MCP 서버를 갖추고 있습니다. 일반적인 설정은 Noma가 설명하는 것과 같습니다 — 저장소를 복제하고, LLM API 키를 추가한 뒤, docker compose up -d를 실행합니다. 프로젝트의 기본 compose 파일은 브리지를 0.0.0.0의 3001번 포트에 바인딩했고, 함께 제공되는 MongoDB를 모든 인터페이스의 27017번 포트에 바인딩했으며, Mongo 인증은 꺼져 있었습니다. 그 영향 범위는 배포 환경을 둘러싼 방화벽, 보안 그룹, 네트워크 분할에 따라 달라집니다. Noma 자체의 표현에 따르면, 네트워크에서 접근 가능한 모든 인스턴스는 인증 없이 완전히 악용될 수 있었습니다.
MCP Bridge는 HTTP를 통해 도착하는 JSON-RPC 요청을 Ruflo의 내부 도구 라이브러리에 대한 호출로 변환하는 Express.js 서버입니다. 취약한 코드 라인에서 해당 라이브러리에는 233개의 도구가 있었으며, 셸 액세스, 데이터베이스 작업, 에이전트 관리 및 메모리 저장을 포괄했습니다. Noma의 글은 그것이 무엇을 의미하는지에 대해 직설적입니다: "MCP Bridge는 임의의 보조 디버그 인터페이스가 아니라, Ruflo의 중추 신경계입니다. 모든 도구 호출, 모든 에이전트 작업, 모든 메모리 작업은 MCP Bridge를 거칩니다."
인증 계층은 단지 약한 것이 아니라 존재하지 않았습니다. POST /mcp 및 POST /mcp/:group는 MCP JSON-RPC 프로토콜을 구현하고, 수신되는 tools/call 요청을 내부 executeTool() 함수로 직접 전달합니다. Ruflo는 명령 차단 목록을 유지했으며, 그 목록은 AUTOPILOT_BLOCKED_PATTERNS이며, 위험한 셸 작업을 막기 위한 것이었지만, GitHub 권고문은 이 목록이 “오토파일럿 흐름에서만 적용되었습니다. POST /mcp 및 POST /mcp/:group은 이를 우회했습니다.”라고 분명히 밝힙니다. 인증되지 않은 호출 하나가 있었으며, 그 이름은 ruflo__terminal_execute이었습니다. 따라서 그 호출은 토큰, 세션 또는 사전 상호작용이 전혀 필요 없이 컨테이너의 node 사용자(권고문에는 uid 1000으로 기록됨)로서 임의 명령을 실행했습니다. 다음에 일어난 일을 위해서는 권한 상승이 필요하지 않았습니다: 자격 증명, 에이전트 API, 메모리 저장소 및 데이터베이스 모두 해당 셸에서 접근할 수 있었습니다.
여덟 단계로 살펴보는 체인
Noma Labs는 8단계로 구성된 개념 증명(PoC)을 공개하고, AWS EC2에서 기본 Ruflo 배포를 대상으로 각 단계를 실제로 검증했으며, 실행과 데이터 유출을 확인하기 위해 Burp Collaborator에 대한 대역 외 콜백을 사용했습니다. 이 단계들은 이론적 버그 위에 쌓아 올린 추측성 결과가 아니라 입증된 공격 시퀀스이며, 권고문의 해결 조치 섹션은 이미 해당 시퀀스에 빠져 있을 수 있는 운영자를 위해 작성되었습니다.

정찰이 가장 먼저인 이유는 도구 목록이 모든 호출자에게 공개되어 있기 때문입니다: tools/list는 자격 증명 없이 233개 항목 전체를 반환합니다. 명령 실행은 같은 엔드포인트에서 이어지며, Noma의 개념 증명은 응답 본문에서 추론하는 대신 대역 외 콜백으로 이를 확인했습니다. 환경 단계는 호스트 침해를 청구 및 데이터 손실 문제로 바꾸는 단계입니다: compose 파일이 제공자 키를 컨테이너로 전달했고, 백엔드 프로세스가 전체 환경을 상속했으며 그 경로는 { ...process.env }였습니다. 따라서 단 한 번의 printenv가 이를 덤프했습니다. 그런 다음 그 키들로 인해 ruflo__swarm_init 및 ruflo__agent_spawn이 공격자가 제어하는 스웜을 시작하여 피해자의 할당량과 컴퓨팅 자원을 소모할 수 있게 했습니다.
다섯 번째 단계는 침입이 끝난 뒤에도 지속되는 단계입니다.ruflo__agentdb_pattern-store를 사용해, Noma는 이후 생성하는 모든 배포 스크립트에 공격자가 제어하는 URL을 삽입하도록 AI에 지시하는 조작된 SOC2 준수 정책을 심었습니다. AgentDB는 세션 전반에서 에이전트 동작이 개선되도록 바로 이런 유형의 패턴을 지속적으로 저장하기 위해 존재하므로, 주입된 항목은 시스템이 설계된 대로 작동했습니다. "향후 대화는 공격자의 영향을 받은 출력을 생성하며, 사용자는 이를 구분할 방법이 없습니다"라고 Noma의 분석 글은 밝힙니다. 이 결함을 7월 29일 보도한 Dark Reading은 이 구분에 대해 외부 전문가의 의견을 구했습니다. Viakoo의 부사장 John Gallagher는 이를 다른 부류의 문제라고 규정했습니다: "이것은 소프트웨어 결함을 악용하는 것이 아니라, 메모리 중독입니다."
나머지 단계는 일반적인 포스트 익스플로잇(post-exploitation)이며, 이례적으로 손쉽게 실행되었다. 내부 Docker 네트워크의 MongoDB에는 인증이 없었기 때문에 공격자들은 /tmp에 클라이언트를 설치하고, 대화를 덤프한 뒤 외부로 전송했다. 지속성은 /app/beacon.js를 작성하고, require('./beacon.js') 줄을 index.js에 추가하고 PID 1을 종료함으로써 확보되었으며, 그 후 Docker의 재시작 정책이 비콘이 활성화된 상태로 컨테이너를 다시 띄웠다. 마지막 단계는 셸 기록을 지우는 것이었다. 이 모든 것은 단일 비인증 요청에서 비롯되었으며, 기본 배포 환경에서는 어느 지점에서도 이 체인을 중단시키지 못했다.
수정, 그리고 패치가 닿을 수 없는 부분
메인테이너는 Ruflo 3.16.3을 6월 30일 공개 후 24시간 이내에 출시했으며, GitHub는 GHSA-c4hm-4h84-2cf3에 2026년 7월 1일권고를 게시했습니다. 저장소에서 ADR-166으로 추적되고 풀 리퀘스트 2521에서 병합된 이 수정은 단순히 검사를 추가하는 대신 기본값을 변경합니다:
• MCP 브리지는 기본적으로 127.0.0.1에 바인딩됩니다. 공개 바인딩에는 MCP_AUTH_TOKEN이 필요하며, 토큰이 없으면 프로세스는 부팅 시 치명적 메시지를 출력하고 종료됩니다.
• 브리지 앞에는 상수 시간 비교를 사용하는 베어러 토큰 미들웨어가 있습니다.
• terminal_execute는 서버 측에서 MCP_ENABLE_TERMINAL=true 설정 뒤에서 게이트되며, 기본적으로 꺼져 있고, 이 게이트는 /mcp, /mcp/:group 및 오토파일럿 흐름에서 동일하게 적용됩니다 — 공개된 체인이 셸에 도달할 수 있게 했던 빠진 연결 고리입니다.
• MongoDB는 인증이 필요하며, 컨테이너를 부팅하려면 루트 비밀번호가 필요합니다.
• 브리지 컨테이너는 tmpfs가 적용된 읽기 전용 루트 파일 시스템으로 실행되고, CORS 허용 목록이 와일드카드를 대체하며, CI 회귀 잠금이 정적 구성과 런타임 동작을 보호합니다.
그중 어느 것도 이미 AgentDB에 기록된 항목을 제거하지는 않습니다. 이 권고는 노출된 인스턴스의 운영자에게 즉시 포트 3001 및 27017을 방화벽으로 차단하고, 제공자 키를 교체하며, 패턴 저장소에서 주입된 agentdb_pattern-store 항목을 감사해 삭제하고, MongoDB에서 변조 여부를 감사하며, 깨끗한 이미지로 컨테이너를 재빌드하라고 지시합니다. 그 경고는 유난히 직설적입니다. "패치된 재배포만으로는 오염을 절대 되돌리지 못합니다." Noma의 글도 같은 결론을 내립니다. 패턴 저장소를 감사하는 것은 교정 조치의 일부이며, 패치는 그렇지 않습니다.
그 이유는 부주의하기보다 구조적이다. 향후 모델 출력을 형성하는 패턴 저장소는 합법적으로 학습된 지시와 공격자가 심어놓은 지시를 구별할 방법이 없다. 둘 다 패턴으로 들어오며, 시스템은 이를 신뢰하도록 설계되어 있다. 이로 인해 네트워크 취약점이 규모를 알 수 없는 백로그를 지닌 데이터 무결성 문제로 바뀌고, 운영자에게 중요한 질문은 포트에 접근 가능했는지 여부만이 아니라 이제 메모리에 무엇이 들어 있는지가 된다.

무엇이 확립되었고, 무엇이 그렇지 않은가
여기서 기술 기록은 1차 자료이며 일관됩니다. 권고문은 영향을 받은 패키지(npm ruflo 3.16.3 미만)와 패치된 버전, 정확한 엔드포인트, 컨테이너 사용자 및 두 개의 포트를 명시합니다. 유지관리자의 릴리스 노트는 동일한 체인을 설명하고, Noma의 분석 글은 개념 증명의 세부 내용을 제공하며, 독립 매체인 The Hacker News와 Dark Reading은 2026년 7월 29일에, SecurityWeek는 7월 30일에 모순되는 특정 사항을 추가하지 않고 같은 메커니즘을 보도했습니다. 2026년 8월 5일자 Cloud Security Alliance 연구 노트는 해당 순서를 다시 서술하고, 앞서 추적한 비인증 MCP 및 에이전트 오케스트레이션 취약점들과 함께 이를 배치합니다. 아카이브는 해당 기록의 신뢰도를 A, 논란 없음으로 평가하고 이를 이정표로 표시합니다. 기록의 심각도 등급은 높음이며, 이는 CVSS 점수 자체와 구별됩니다.
한 가지 점수 산정 세부 사항은 정확히 밝힐 필요가 있습니다. 두 주요 문서가 서로 다르기 때문입니다. GHSA-c4hm-4h84-2cf3는 CVSS 10.0벡터 AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — 범위 변경이 최대치로 끌어올리는 요인입니다. 같은 권고문의 3.16.3 릴리스 페이지 사본은 해당 점수를 "CVSS 9.8 치명적"이라고 설명합니다. 2026년 10월 30일에 확인한 National Vulnerability Database 기록은 2026년 7월 9일에 발행되었고 Deferred로 표시되어 있으며, GitHub의 10.0을 보조 지표로 포함하고 NVD가 자체 작성한 점수는 없습니다. 우리는 9.8이라는 표기에 대한 설명을 찾지 못했고, 이 글에서도 그것을 해결하지 않습니다.
도입 수치는 더 빈약하다. Noma Labs는 당시 해당 프로젝트에 67,000개 이상의 GitHub 스타, 약 1,000만 건의 다운로드, 약 100만 명의 활성 사용자가 있다고 설명했다. Cloud Security Alliance가 요약한 내용에 따르면, The Hacker News는 66,500개 이상의 스타를 언급했다. 다운로드 및 사용자 수는 Noma 자체 집계이며 독립적으로 검증되지 않았다. 2026년 10월 30일 기준 저장소의 스타 수는 80,198이었다. 이는 프로젝트의 도달 범위를 확인한 것이지 노출도를 측정한 것은 아니며, 네트워크에서 실제로 접근 가능한 배포가 몇 개였는지 공개한 출처는 없다.

확립되지 않은 부분이 바로 가장 쉽게 부풀려지는 부분이다. Noma도, 메인테이너도, 우리가 읽은 어떤 매체도 이 취약점이 실제 환경에서 악용되었다고 주장하지 않으며, 아카이브에도 이 항목에 대한 실제 피해 기록은 없다. Noma의 개념 증명은 연구진이 EC2에서 직접 통제한 배포 환경을 대상으로 실행된 것으로, 이는 기본 설치가 허용하는 범위를 보여줄 뿐 특정 운영 인스턴스가 겪은 피해를 보여주는 것은 아니다. 인터넷에 노출된 Ruflo 배포의 수는 공개된 적이 없고, 어떤 운영자도 AgentDB 감사 결과를 공개하지 않았으므로, 영향을 받은 집단과 존재하는 오염된 메모리의 양은 모두 알 수 없다. 노출된 배포를 완전한 침해로 취급하라는 Cloud Security Alliance의 권고는 제로 인터랙션 익스플로잇에 의해 정당화되는 위험 태도일 뿐, 침해가 발생했다는 증거는 아니다.
아카이브가 이를 이정표로 표시하는 이유
아카이브의 이정표 표식은 최고 점수보다 더 구체적인 무언가에 달려 있다. 인기 있는 셀프 호스팅 서비스에서 발견된 CVSS 10.0 원격 코드 실행 버그는 익숙한 유형이며, 여기서의 수정은 24시간 이내에 이루어졌다. RufRoot를 구별 짓는 점은 익스플로잇이 AI 자체의 학습 파이프라인에서 종료되었다는 점이다. 여기서는 업그레이드, 재배포, 포트 닫기 같은 전통적 조치가 주입된 지시를 그대로 남겨 두고 여전히 답변을 형성한다. Cloud Security Alliance의 노트는 이를 LangGraph 체크포인트 체인과 인증되지 않은 AutoGen Studio 표면을 포함해 에이전트 도구 전반에서 이미 문서화한 패턴의 사례 연구로 읽으며, 에이전트 행동을 형성하는 데 사용되는 영구 메모리는 캐시로 취급하기보다 무결성 모니터링 아래의 민감한 데이터 저장소로 취급해야 한다고 주장한다.
그렇게 관점을 다시 잡는 것이 실질적인 핵심입니다. 이번 사건의 눈에 보이는 산출물은 패치된 의존성과 공개된 보안 권고이고, 눈에 보이지 않는 산출물은 운영자의 AgentDB에 여전히 남아 있을 수 있는 패턴입니다. 그리고 정당하게 학습된 정책과 심어진 정책을 구별해 주는 공개된 도구나 시그니처는 없습니다. 접근 가능한 네트워크 뒤에서 기본 compose 파일을 실행한 조직이라면, 유용한 대응은 Noma와 권고가 모두 제시하는 것입니다. 키가 읽힌 것으로 가정하고, 키를 교체하며, 메모리가 만들어내는 답변을 신뢰하기 전에 메모리를 점검하십시오.
