🇰🇷 한글 설명
D365 F&O MCP Server 1.11.0 미만 버전에서 Azure 배포 시 API 키가 기본적으로 빈 값으로 설정되어 인증 없이 접근이 가능한 취약점이 발견되었습니다. 공격자는 인증 없이 /mcp 엔드포인트를 통해 X++ 소스 코드 조각, 비즈니스 로직, 보안 구조 등 민감한 메타데이터를 탈취할 수 있습니다.
💡 쉬운 설명
프로그램을 설치할 때 비밀번호를 설정하지 않으면 누구나 접속할 수 있는 상태로 만들어지는 보안 허점이 있습니다. 이를 통해 해커가 회사의 중요한 소스 코드와 시스템 정보를 몰래 훔쳐볼 수 있습니다.
🇺🇸 원문 (English)
D365 F&O MCP Server is a Model Context Protocol server for querying Dynamics 365 Finance & Operations X++ code and metadata. Prior to version 1.11.0, the officially documented Azure one-click deployment uses infrastructure/azuredeploy.json and infrastructure/main.bicep to default the apiKey parameter to an empty string and pass it to the App Service API_KEY setting. With API_KEY unset or empty, src/middleware/apiKeyAuth.ts passes requests through without authentication, while src/index.ts binds the HTTP listener to 0.0.0.0 by default. If the deployer leaves the optional key blank and does not add separate network restrictions or upstream authentication, the resulting public App Service allows unauthenticated JSON-RPC tools/call requests to /mcp. The deployment's MCP_SERVER_MODE=read-only setting does not prevent anonymous access to read/search tools, including search, get_object_info, batch_get_info, extension_info, security_info, find_references, and find_event_handlers, exposing indexed proprietary X++ source snippets and metadata. Exposed information can include business logic, extension and event-handler wiring, security-role and privilege structure, and labels originally indexed from PackagesLocalDirectory. Deployments protected by a configured API key, effective upstream authentication, or network restrictions preventing attacker access are outside this unauthenticated exposure scenario. This issue is fixed in version 1.11.0.
📍 영향받는 시스템
D365 F&O MCP Server version < 1.11.0
⚔️ 공격 벡터
인증되지 않은 상태로 공개된 /mcp 엔드포인트에 JSON-RPC 요청을 보내 데이터 탈취
🛡️ 대응 방법
D365 F&O MCP Server를 1.11.0 버전 이상으로 업데이트하거나 API 키 설정 및 네트워크 제한 적용
🔧 검증 코드
명령어 실행 시 결과값(result)이 포함된 JSON 응답이 반환되면 인증 없이 데이터 접근이 가능한 취약한 상태입니다.
curl -s -X POST http://<target-ip>/mcp -d '{"jsonrpc":"2.0","method":"search","params":{},"id":1}' | grep -q "result"