
MCPJam Inspector RCE에서 root까지 — CVE-2026-23744, JupyterLab 토큰 노출, 커널 실행 및 OPSMCP 권한 상승
이 저장소는 공인된 보안 연구, 침투 테스트 및 교육 목적으로만 사용됩니다. 명시적인 승인 없이 여기에 설명된 기술을 시스템에 사용하지 마십시오.
MCPJam Inspector RCE에서 root까지 — CVE-2026-23744, JupyterLab 토큰 노출, 커널 실행 및 OPSMCP 권한 상승.
이 저장소는 노출된 MCPJam Inspector 인스턴스에서 root 수준 접근까지 이어지는 완전한 Linux 공격 체인을 문서화합니다.
이 체인은 개발자 도구, 로컬 서비스, 자격 증명 처리 및 애플리케이션 권한 부여 전반에 걸친 취약점들을 연결합니다:
MCPJam Inspector
│ CVE-2026-23744
▼
RCE
│
▼
JupyterLab Token
│
▼
Jupyter Kernel
│
▼
User
│
▼
OPSMCP API
│
▼
Hidden Admin Tool
│
▼
Root Credential
│
▼
root
[!WARNING] 이 저장소는 공인된 보안 연구, 침투 테스트 및 교육 목적으로만 사용됩니다. 이 문서 전체에 등장하는 대상 주소, 자격 증명, 토큰 및 기타 환경별 값은 삭제되었거나 실습용 플레이스홀더로 대체되었습니다.
초기 정찰은 외부에 노출된 서비스 식별에 초점을 맞춥니다.
nmap -sC -sV -oN nmap_initial.txt TARGET
그런 다음 전체 TCP 스캔을 수행할 수 있습니다:
nmap -p- --min-rate 5000 -oN nmap_full.txt TARGET
관련 외부 서비스:
| 포트 | 서비스 | 역할 |
|---|---|---|
| 22 | SSH | 원격 관리 |
| 6274 | MCPJam Inspector | 초기 공격 표면 |
localhost에만 바인딩된 서비스:
| 포트 | 서비스 | 권한 |
|---|---|---|
| 8888 | JupyterLab | User |
| 5000 | OPSMCP | root |
포트 6274의 외부 접근 가능한 MCPJam Inspector가 초기 진입점이 됩니다.
노출된 MCPJam Inspector 인스턴스는 CVE-2026-23744의 영향을 받습니다.
MCPJam Inspector는 주로 MCP 서버용 개발 및 테스트 인터페이스로 설계되었습니다. 이 인터페이스가 신뢰할 수 없는 네트워크에 노출되면 이 취약점은 특히 위험해집니다 — 취약한 구성 흐름으로 인해 공격자가 제어하는 데이터가 명령 실행 경로에 도달할 수 있습니다.
Remote Request
│
▼
MCP Server Configuration
│
▼
Command Execution
│
▼
Initial Shell
이 취약점은 1.4.2 이하 버전의 MCPJam Inspector에 영향을 미칩니다. 공인된 테스트를 위해 공개 PoC(Proof of Concept)를 사용하여 대상 환경에서 취약점을 검증할 수 있습니다.
악용에 성공한 후 실행 컨텍스트를 확인합니다:
id
whoami
hostname
초기 발판을 확보한 후 로컬 서비스가 보이게 됩니다.
ss -tlnp
ps aux | grep -E 'jupyter|python|node'
Network
│
▼
MCPJam Inspector
:6274
│
▼
Initial RCE
│
┌─────────┴─────────┐
▼ ▼
JupyterLab OPSMCP
:8888/local :5000/local
│ │
▼ ▼
User root
두 내부 애플리케이션 간의 권한 차이는 특히 흥미롭습니다.
JupyterLab 프로세스는 인증 토큰을 명령줄에 직접 넣은 채로 시작되었습니다:
--ServerApp.token=<JUPYTER_TOKEN>
명령줄은 다음을 통해 확인할 수 있습니다:
ps aux | grep jupyter
# or
cat /proc/<PID>/cmdline
이는 일반적인 비밀 관리 문제를 보여줍니다:
Secret → Command-line argument → Process metadata → Local credential disclosure
복구된 토큰은 로컬 Jupyter API에 대한 접근 권한을 제공합니다.
Jupyter는 커널 관리를 위한 REST API를 노출합니다. 복구된 토큰으로 인증한 후 다음을 통해 커널을 생성할 수 있습니다:
POST /api/kernels
응답에는 커널 UUID가 포함됩니다. Jupyter 커널은 WebSocket을 통해 통신합니다:
/api/kernels/<KERNEL_ID>/channels
Jupyter 메시징 프로토콜은 execute_request 메시지를 사용하여 Python 코드를 실행합니다:
{
"header": { "msg_type": "execute_request" },
"content": { "code": "<AUTHORIZED_LAB_CODE>" }
}
이는 Jupyter 서비스의 신원으로 Python 실행을 가능하게 합니다 — 이 환경에서 커널은 User 권한으로 실행됩니다.
MCPJam RCE → JupyterLab → User
사용자 셸을 확보한 후 다음 단계는 로컬에 설치된 애플리케이션을 조사하는 것입니다. OPSMCP 애플리케이션은 다음 위치에 있습니다:
/opt/opsmcp/
소스 코드를 검토하면 내장된 API 자격 증명이 드러납니다:
VALID_API_KEY = "<REDACTED_OPSMCP_API_KEY>"
애플리케이션은 또한 두 개의 도구 모음을 유지합니다:
표시되는 도구
ops.system_statusops.list_servicesops.check_diskops.view_logs숨겨진 도구
ops._admin_dumpops._debug_mode관리 기능은 일반적인 도구 열거로는 반환되지 않기 때문에 특히 흥미롭습니다.
문서화되지 않았다고 해서 접근할 수 없는 것은 아닙니다.
백엔드는 여전히 숨겨진 도구를 등록하고 있으며 일반 도구 실행 메커니즘을 통해 해당 이름을 수락합니다.
애플리케이션은 API 키를 사용하여 요청을 인증합니다:
X-API-Key: <OPSMCP_API_KEY>
인증되면 도구 실행 엔드포인트는 요청된 함수가 존재하는지 여부만 확인합니다 — 호출자가 실행 권한이 있는지는 확인하지 않습니다.
현재 동작:
API Key → Authenticated → Tool exists? → Execute
올바른 동작:
API Key → Authenticated → Permission check → Allowed → Execute
└ Denied → 403
숨겨진 관리 기능은 root가 소유한 민감한 리소스에 접근할 수 있습니다.
관리 도구는 요청된 정보를 설명하는 대상을 입력받습니다. 지원되는 리소스 중 하나는 root SSH 키입니다:
{
"name": "ops._admin_dump",
"arguments": {
"target": "ssh_keys",
"confirm": true
}
}
애플리케이션은 OPSMCP가 root로 실행되어 /root/*를 읽을 수 있기 때문에 root가 소유한 SSH 개인 키를 읽습니다. 따라서 애플리케이션은 자격 증명 노출 프리미티브가 됩니다.
공인된 실습용 SSH 자격 증명을 확보한 후 제한적인 권한으로 저장합니다:
chmod 600 <ROOT_KEY>
결과적인 인증 컨텍스트를 확인합니다:
whoami
id
최종 권한 수준: root 🎉
┌──────────────────────────────┐
│ MCPJam Inspector │
│ TCP/6274 │
└──────────────┬───────────────┘
│ CVE-2026-23744
▼
┌──────────────────────────────┐
│ Initial RCE │
└──────────────┬───────────────┘
▼
┌──────────────────────────────┐
│ JupyterLab │
│ 127.0.0.1:8888 │
└──────────────┬───────────────┘
│ Token disclosure
▼
┌──────────────────────────────┐
│ Jupyter Kernel │
│ WebSocket RCE │
└──────────────┬───────────────┘
▼
User
│ Source review
▼
┌──────────────────────────────┐
│ OPSMCP │
│ 127.0.0.1:5000 │
│ root │
└──────────────┬───────────────┘
│ API key + hidden tool
▼
┌──────────────────────────────┐
│ Root Credential Leak │
└──────────────┬───────────────┘
▼
root
| 시스템 | 관찰 대상 |
|---|---|
| MCPJam | 예상치 못한 구성 변경 · 의심스러운 자식 프로세스 · 비정상적인 원격 클라이언트 |
| JupyterLab |
01 — 개발자 도구는 공격 표면이다 로컬 개발용으로 설계된 도구는 신뢰할 수 없는 네트워크에 노출되면 심각한 취약점이 될 수 있습니다.
02 — Jupyter 토큰은 강력한 자격 증명이다 Jupyter 토큰에 대한 접근은 UI 접근 이상을 제공할 수 있습니다 — 커널 API는 임의 코드 실행을 제공할 수 있습니다.
03 — 숨겨짐이 안전을 의미하지는 않는다 문서화되지 않은 엔드포인트는 권한 부여 메커니즘이 아닙니다.
04 — 소스 코드는 사후 침투 단계에서 가치가 높다 애플리케이션 소스는 인증 메커니즘, 비밀, 숨겨진 기능 및 권한 경계를 즉시 드러낼 수 있습니다.
05 — 최소 권한은 공격 체인을 끊을 수 있다 OPSMCP가 권한이 없는 서비스 계정으로 실행되었다면 최종 영향은 상당히 줄어들었을 것입니다.
이 저장소는 공인된 보안 연구, 침투 테스트 및 교육 목적으로만 사용됩니다. 명시적인 승인 없이 여기에 설명된 기술을 시스템에 사용하지 마십시오.
⚡ MCPJam → RCE → Jupyter → User → OPSMCP → root ⚡
| 단계 | 단계 |
|---|
| 1 | MCPJam Inspector가 네트워크에 노출됨 |
| 2 | CVE-2026-23744 악용 |
| 3 | 초기 RCE 달성 |
| 4 | JupyterLab 토큰 노출 |
| 5 | Jupyter 커널 실행 |
| 6 | 사용자 수준 셸 |
| 7 | OPSMCP 소스 코드 검토 |
| 8 | 하드코딩된 API 자격 증명 발견 |
| 9 | 숨겨진 관리 기능 악용 |
| 10 | Root 자격 증명 노출 |
| 11 | root |
| # | 취약점 | 영향 |
|---|
| 1 | 노출된 MCPJam Inspector | 원격 공격 표면 |
| 2 | CVE-2026-23744 | 초기 RCE |
| 3 | 프로세스 인자에 있는 토큰 | 자격 증명 노출 |
| 4 | Jupyter 커널 접근 | 사용자 수준 코드 실행 |
| 5 | 읽기 가능한 애플리케이션 소스 | 자격 증명 발견 |
| 6 | 하드코딩된 OPSMCP API 키 | API 인증 우회 |
| 7 | 숨겨진 관리 기능 | 권한 있는 작업 |
| 8 | root로 실행되는 OPSMCP | 전체 시스템 손상 |
| 예상치 못한 토큰 사용 · 예상치 못한 커널 생성 · 비정상적인 WebSocket 연결 · 커널에서 생성된 셸 프로세스 |
| OPSMCP | 문서화되지 않은 도구 호출 · 자격 증명 관련 요청 · 예상치 못한 API 클라이언트 · 관리 작업 |
| SSH | 예상치 못한 root 로그인 · 새로운 SSH 키 · 비정상적인 인증 소스 |