Skip to content

[DGX Spark][Security] managed llama.cpp bridge exposes port 8081 on host loopback without API key enforcement #9591

Description

@hulynn

Description

The managed llama.cpp private bridge process exposes the llama.cpp inference endpoint on host loopback (127.0.0.1:8081) without enforcing the API key configured in the container. Any local process on the host can query the model catalog and potentially invoke inference without authentication.

The nemoclaw-llama-cpp container has /run/secrets/llama-cpp-api-key mounted and llama-server is started with --api-key-file. However, the node bridge process (docker-llama-cpp-private-bridge-process.js) that proxies 127.0.0.1:8081 to the container does not enforce the key at the loopback level. The managed inference route through the OpenShell gateway at inference.local uses proper authentication; only the direct loopback port bypasses auth.

Platform scope: Reproduced on DGX Spark only; other platforms not tested (managed llama.cpp only supported on DGX Spark).
Regression: Unknown — managed llama.cpp is new in v0.0.110.
OpenShell issue: No.

Environment

Device:        DGX Spark (GB10, aarch64)
OS:            Ubuntu 24.04.4 LTS
Architecture:  aarch64
Node.js:       v22.23.1
npm:           10.9.8
Docker:        29.2.1
OpenShell CLI: 0.0.101
NemoClaw:      v0.0.110
OpenClaw:      v2026.7.1

Steps to Reproduce

  1. Install NemoClaw with managed llama.cpp Muse Glimmer 30B (interactive menu, recommended option)
  2. Confirm sandbox is Ready: nemoclaw {sandbox} status
  3. From the host (SSH session, outside sandbox), make an unauthenticated HTTP request to the loopback endpoint:
curl -s http://127.0.0.1:8081/v1/models
  1. Observe HTTP 200 with full model catalog (expected: HTTP 401)
  2. Repeat with a known-invalid credential in the Authorization header:
curl -s -H "Authorization: Bearer <invalid>" http://127.0.0.1:8081/v1/models
  1. Observe HTTP 200 with full model catalog (expected: HTTP 401)

Expected Result

HTTP 401 for unauthenticated or invalid-credential requests to 127.0.0.1:8081. The API key configured in the container should be enforced at the bridge layer.

Actual Result

Both requests return HTTP 200 with the full model catalog.

Technical detail: /run/secrets/llama-cpp-api-key is mounted in nemoclaw-llama-cpp container and llama-server starts with --api-key-file (key configured correctly inside container). The docker-llama-cpp-private-bridge-process.js node process proxies 127.0.0.1:8081 → container internal network but does not forward or enforce API key authentication. Any host-local process can bypass auth via direct loopback access.

Logs

$ curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8081/v1/models
200

$ curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer <invalid>" http://127.0.0.1:8081/v1/models
200

Metadata

Metadata

Assignees

No one assigned

    Labels

    NV QABugs found by the NVIDIA QA Teamneeds: triageAwaiting maintainer classification

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions