NTerm stores credentials and runs commands on network devices. Here is exactly what that means.
Do not open a public issue. Report privately through GitHub private vulnerability reporting or email security@nterm.ai.
We acknowledge within three business days and aim to ship a fix or mitigation within thirty days for confirmed issues. You will be credited unless you prefer otherwise.
| Where | What |
|---|---|
./data | session hosts, usernames, stored credentials, SSH host keys |
| Settings | AI provider key, bench feed key, relay token — encrypted at rest |
| Scrollback | whatever the device printed, including secrets you typed |
./data is a credential vault. It is gitignored and must stay that way. Deleting it is unrecoverable.
NTerm generates a token into ./data/.auth_token and requires it on every /api, /ws and /mcp request. That exists because without it, any website you visit could reach 127.0.0.1:8787 from your browser and read your session inventory — CORS does not block a no-cors POST.
It is not a network access control. The page itself is unguarded, because the app must load before it can present a token. Anything that can reach the port can read the token out of the served HTML. Binding to loopback is what protects the vault — not the token.
Shared sessions are read-only; input is never accepted from a browser viewer. Known secret shapes are redacted on the relay before viewers see them. That is pattern matching, not a guarantee. Treat a shared session as visible.
Only read-only status commands rated low risk execute directly. Everything that writes waits for an explicit Confirm. A path that bypasses that confirmation is a security bug and we want to hear about it.
In scope: the backend, frontend, Electron shell and Docker packaging in the repository. Out of scope: this marketing site, the sharing relay service, and third-party dependencies.