npm PraisonAI MCPServer는 인증되지 않은 HTTP 도구/호출을 노출합니다.
게시된 npm 패키지 praisonai는 다음을 사용하여 HTTP JSON-RPC 전송을 통해 도구, 리소스 및 프롬프트를 노출할 수 있는 TypeScript MCPServer를 내보냅니다.
``ts wait server.start({ 포트: 3000 });
HTTP 전송에는 인증 또는 권한 부여 경로가 없습니다. `MCPServerConfig`는 인증/보안 설정을 노출하지 않으며 `startHttp()`는 `Authorization` 헤더를 무시하며 모든 POST 요청은 구문 분석되어 `handleRequest()`로 직접 전달됩니다. 해당 요청 핸들러는 'tools/call', 'resources/read' 및 'prompts/get'과 같은 민감한 MCP 메서드를 전달합니다.
또한 구현에서는 호스트 인수 없이 `this.httpServer.listen(port)`를 호출합니다. Node.js에서는 지정되지 않은 주소에 바인딩됩니다. 로컬 PoV는 `{ address: "::", family: "IPv6" }`를 관찰하여 포트가 노출된 시스템의 모든 인터페이스에서 서비스에 연결할 수 있도록 했습니다.
이를 통해 모든 네트워크 클라이언트가 HTTP 포트 목록 도구에 도달하고 자격 증명 없이 등록된 서버 측 도구를 호출할 수 있습니다. `권한 부여: 전달자가 유효하지 않음`을 제공해도 아무런 차이가 없습니다.
## 기술적인 세부사항
`MCPServerConfig`는 서버 메타데이터, 도구/리소스/프롬프트, stdio, 포트 및 로깅을 노출합니다. 인증 토큰, 인증 정책, `MCPSecurity` 인스턴스, 인증 콜백 또는 루프백 전용 옵션을 노출하지 않습니다.
``텍스트
src/praisonai-ts/src/mcp/server.ts
57: 내보내기 인터페이스 MCPServerConfig {
63: 도구?: MCPServerTool[];
65: 자원?: MCPResource[];
67: 프롬프트?: MCPPrompt[];
69: stdio?: 부울;
73: 포트?: 번호 | 널;
75: 로깅?: 부울;
handleRequest()는 민감한 MCP 메서드를 직접 전달합니다.
``텍스트 src/praisonai-ts/src/mcp/server.ts 203: 비동기 핸들요청(요청: MCPRequest): Promise { 219: 케이스 '도구/호출': 220: 결과 = wait this.handleToolCall(params); 225: '리소스/읽기' 사례: 226: 결과 = wait this.handleResourceRead(params); 231: '프롬프트/가져오기' 케이스: 232: 결과 = wait this.handlePromptGet(params);
도구 디스패처는 등록된 핸들러를 호출합니다.
``텍스트
src/praisonai-ts/src/mcp/server.ts
285: private async handlerToolCall(params?: any): Promise<any> {
288: const 도구 = this.tools.get(이름);
298: const 결과 = wait tool.handler(args ?? {});
HTTP 서버는 모든 POST 본문을 구문 분석하고 인증 확인 없이 handleRequest()에 전달합니다.
``텍스트 src/praisonai-ts/src/mcp/server.ts 403: async startHttp(port: number): Promise { 409: this.httpServer = http.createServer(async (req, res) => { 416: const 응답 = this.handleRequest(요청)을 기다립니다. 434: this.httpServer.listen(port, () => {
동일한 TypeScript 패키지가 이미 전용 MCP 보안 관리자를 제공하기 때문에 이는 보호 범위 격차입니다.
``텍스트
src/praisonai-ts/src/mcp/security.ts
2: * MCP 보안 - 인증, 권한 부여 및 속도 제한
79: MCPSecurity 클래스 내보내기 {
132: 비동기 검사(요청: { 경로?: 문자열; 메서드?: 문자열; 헤더?: ... })
167: const auth = headers['authorization'] ?? 헤더['인증'];
239: '인증' 케이스:
303: 내보내기 함수 createApiKeyPolicy(...)
MCPServer는 HTTP 요청 경로에서 해당 보안 관리자를 참조하지 않습니다.
PraisonAI의 MCP 문서에는 MCP 서버를 통해 AI 모델이 도구를 사용하고 외부 시스템과 통신할 수 있다고 나와 있습니다. 동일한 페이지의 보안 고려 사항에는 프로덕션에서 API 키 사용, 속도 제한 구현, 들어오는 요청 확인, HTTPS 사용 및 사용자 정의 도구 권한 제한이 나와 있습니다.
PraisonAI의 보안 페이지에는 API 서버가 기본적으로 인증을 요구하고 0.0.0.0 대신 127.0.0.1에 바인딩되도록 변경된 강화 이전의 문서도 나와 있습니다. MCP tools/call 문제를 보안 취약점으로 별도로 나열합니다.
npm TypeScript MCPServer는 반대 작업을 수행합니다.
start({ port })는 지정되지 않은 주소에 바인딩됩니다.MCPServerConfig에는 인증/보안 필드가 없습니다.startHttp()는 Authorization을 검사하지 않습니다.tools/list, tools/call, resources/read 및 prompts/get은 모두 인증 없이 전달됩니다. 그리고이는 단순한 배포 강화 제안이 아닙니다. 패키지는 HTTP MCP 서버 API와 별도의 보안 관리자를 노출하지만 서버 자체 HTTP 전송은 문서화된 API 키 요구 사항을 시행할 방법을 제공하지 않습니다.
PoV는 게시된 npm 패키지를 임시 프로젝트에 설치하고, 로컬 임시 포트에서 내보낸 MCPServer를 시작하고 루프백 JSON-RPC 요청을 보냅니다. 패키지 설치 후에는 LLM 공급자나 외부 서비스를 호출하지 않습니다.
로컬 복제 체크아웃에서 실행:
``물고기 노드 poc/pov_poc.js 1.7.1
관찰 결과:
``json
{
"패키지": "프라이소나이",
"버전": "1.7.1",
"mcpServerExported": 사실,
"바인딩 주소": {
"주소": "::",
"가족": "IPv6"
},
"초기화": {
"상태": 200
},
"목록": {
"상태": 200,
"json": {
"결과": {
"도구": [
{
"이름": "admin_reset_marker",
"description": "권한 있는 마커 도구"
}
]
}
}
},
"callNoAuth": {
"상태": 200,
"json": {
"결과": {
"콘텐츠": [
{
"텍스트": "호출됨:NO_AUTH_MARKER"
}
]
}
}
},
"callBadAuth": {
"상태": 200,
"json": {
"결과": {
"콘텐츠": [
{
"텍스트": "호출됨:BAD_AUTH_MARKER"
}
]
}
}
},
"전화": [
"NO_AUTH_MARKER",
"BAD_AUTH_MARKER"
],
"패치컨트롤": {
"noAuthStatus": 401,
"withAuthStatus": 200,
"patchedCalls": [
"부름"
]
}
}
해석:
tools/list는 등록된 도구를 반환합니다.tools/call은 등록된 도구를 호출합니다.위의 PoV 섹션에는 로컬 재생 명령, 입력 및 결정적인 출력이 포함됩니다.
npm TypeScript MCPServer HTTP 포트에 연결할 수 있는 모든 클라이언트는 자격 증명 없이 등록된 모든 MCP 도구를 나열하고 호출할 수 있습니다.
실제 영향은 애플리케이션이 등록하는 도구, 리소스 및 프롬프트에 따라 달라집니다. MCP 도구는 일반적으로 파일 시스템 작업, API 클라이언트, 데이터베이스 쿼리, 에이전트 작업, 배포 작업, 이메일/Slack 작업, 브라우저 자동화 및 코드 실행을 래핑합니다. 이러한 처리기는 서버 프로세스 권한과 서버측 자격 증명으로 실행되므로 인증되지 않은 호출자가 동일한 작업을 수행할 수 있습니다.
'resources/read' 및 'prompts/get'도 인증되지 않았으며 서버에 등록된 애플리케이션 데이터나 프롬프트 자료를 공개할 수 있습니다.
제안된 심각도: 심각.
근거:
AV: 공격은 직접적인 HTTP JSON-RPC 요청입니다.AC: 경주, 사용자 동작 또는 특수 상태가 필요하지 않습니다.PR: 자격 증명이 필요하지 않습니다. 잘못된 자격 증명은 무시됩니다.UI: 서버 실행 후 사용자 상호작용이 필요하지 않습니다.S: 영향은 MCP 서버 프로세스 및 등록된 도구의 권한 내에 있습니다.C: 리소스, 프롬프트 및 도구에서 반환된 데이터는 민감한 데이터를 노출할 수 있습니다.I: 인증되지 않은 호출자가 서버측 도구를 구동할 수 있습니다.권장되는 최소 수정 사항:
MCPServerConfig에 security, auth, authRequired, apiKeys 또는 authorize(req)를 추가합니다.127.0.0.1에 바인딩하거나 모든 인터페이스에 바인딩할 때 명시적인 호스트를 요구합니다.handleRequest()에 도달하기 전에 MCPSecurity.check(...) 또는 이와 동등한 미들웨어를 호출합니다.initialize, tools/list, tools/call, resources/read 또는 prompts/get을 전달하기 전에 자격 증명이 누락되거나 유효하지 않은 경우 401을 반환합니다.tools/list는 401을 반환합니다.tools/call은 401을 반환하고 핸들러를 호출하지 않습니다.start({ port })는 명시적인 옵트인 없이는 모든 인터페이스에 바인딩되지 않습니다.MervinPraison/PraisonAInpmpraisonaisrc/praisonai-ts/src/mcp/server.tssrc/praisonai-ts/src/mcp/security.ts1.7.1원산지/메인 확인됨: 1ad58ca02975ff1398efeda694ea2ab78f20cf3e확인된 영향 범위:
``텍스트
= 1.5.0, <= 1.7.1
경계:
``텍스트
1.4.0은 MCPServer를 내보내지 않으며 dist/mcp/server.js를 제공하지 않습니다.
이 보고서가 작성되는 시점에는 고정된 npm 버전이 알려져 있지 않습니다.
포함된 스윕은 선택한 npm 버전을 설치하고 HTTP MCPServer 경로를 확인합니다.
``물고기 노드 poc/version_sweep_poc.js
관찰 결과:
``텍스트
1.4.0: mcpServerExported=false, hasDistMcpServer=false
1.5.0: mcpServerExported=true, hasDistMcpServer=true, noAuthToolCallInvoked=true, binAddress=::
1.5.4: mcpServerExported=true, hasDistMcpServer=true, noAuthToolCallInvoked=true, binAddress=::
1.6.0: mcpServerExported=true, hasDistMcpServer=true, noAuthToolCallInvoked=true, binAddress=::
1.7.0: mcpServerExported=true, hasDistMcpServer=true, noAuthToolCallInvoked=true, binAddress=::
1.7.1: mcpServerExported=true, hasDistMcpServer=true, noAuthToolCallInvoked=true, binAddress=::
알려진 관련 공개 권고 사항:
GHSA-9mqq-jqxf-grvw / CVE-2026-44336: Python praisonai mcp Serve에서 RCE로의 pip:praisonai MCP tools/call 경로 탐색이 <= 4.6.33에 영향을 미쳤습니다.CVE-2026-47394: pip:praisonai Python 워크플로/배포 핸들러에 영향을 미치는 불완전한 MCP 경로 탐색 수정.이 보고서는 다음을 목표로 한다는 점에서 특별합니다.
npm;praisonai;src/praisonai-ts/src/mcp/server.ts;MCPServer HTTP 전송에 인증이 누락되었으며 MCPSecurity를 사용하지 않습니다.tools/call은 등록된 임의의 TypeScript MCP 도구를 호출합니다. 그리고>= 1.5.0, <= 1.7.1.Python MCP 권고는 특정 Python MCP 도구 핸들러의 경로 탐색을 다룹니다. npm TypeScript MCPServer 전송 또는 연결되지 않은 보안 관리자는 다루지 않습니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 98.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 98.00 |
VPI 공식 vpi-v1 기준