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
- Install NemoClaw with managed llama.cpp Muse Glimmer 30B (interactive menu, recommended option)
- Confirm sandbox is Ready:
nemoclaw {sandbox} status
- 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
- Observe HTTP 200 with full model catalog (expected: HTTP 401)
- Repeat with a known-invalid credential in the Authorization header:
curl -s -H "Authorization: Bearer <invalid>" http://127.0.0.1:8081/v1/models
- 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
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-cppcontainer has/run/secrets/llama-cpp-api-keymounted andllama-serveris started with--api-key-file. However, the node bridge process (docker-llama-cpp-private-bridge-process.js) that proxies127.0.0.1:8081to the container does not enforce the key at the loopback level. The managed inference route through the OpenShell gateway atinference.localuses 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
Steps to Reproduce
nemoclaw {sandbox} statuscurl -s -H "Authorization: Bearer <invalid>" http://127.0.0.1:8081/v1/modelsExpected 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-keyis mounted innemoclaw-llama-cppcontainer andllama-serverstarts with--api-key-file(key configured correctly inside container). Thedocker-llama-cpp-private-bridge-process.jsnode process proxies127.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