-
-
Notifications
You must be signed in to change notification settings - Fork 67
Security
SSH Pilot is built around a simple rule: your passwords and passphrases should never live as plain text in the app’s UI layer, config files, or logs. Storage uses real credential vaults. Autofill uses OpenSSH’s official askpass path — not typing secrets into the terminal stream.
This page explains why that design is secure. For how to choose and set up a backend, see Credentials.
| Concern | How SSH Pilot handles it |
|---|---|
| Where passwords are stored | In your chosen vault (system keyring, KeePass, Bitwarden/Vaultwarden, or pass) — not in ~/.ssh/config or app preferences as plaintext |
| How OpenSSH receives a password | Via SSH_ASKPASS (a short-lived helper), the same mechanism desktop SSH tools use |
| Does the GUI hold a password dump? | No. The window process does not enumerate decrypted credentials for normal use |
| Do secrets appear in logs? | No. Diagnostic output is sanitized; askpass helpers print only the secret to OpenSSH on stdout, never diagnostics mixed with it |
| Can you avoid storing passwords? | Yes — use SSH keys + agent, hardware keys (PKCS#11), or SSH Agent Only storage |
When you check Save password, SSH Pilot does not write the secret into its settings JSON or into your SSH config. It stores it through a credential backend you control:
| Backend | Why it is trustworthy |
|---|---|
| System keyring (libsecret) | Uses GNOME Keyring / KDE Wallet (or the macOS Keychain via keyring). Secrets are encrypted by the OS and typically unlock with your login session. |
KeePass (.kdbx) |
Industry-standard encrypted database; unlocked only with your master password (and optional key file). |
| Bitwarden / Vaultwarden | Encrypted vault; SSH Pilot talks to the vault through the CLI/rbw agent. See Bitwarden & Vaultwarden. |
| pass | Classic Unix password store protected by your GPG key. |
| SSH Agent Only | Nothing persistent for passwords — authentication relies on keys already in the agent. |
Automatic mode picks an available backend (usually the system keyring on Linux desktops). You can lock vaults after inactivity (Settings > Security > Vault lock timeout) so cached access does not last forever.
SSH Pilot also keeps connection metadata (nickname, host, user) separate from secret values. Normal APIs and UI lists show hosts and status — not decrypted passwords.
OpenSSH needs a password or key passphrase at connect time. SSH Pilot supplies it the way OpenSSH expects:
- OpenSSH sets
SSH_ASKPASSand asks for a secret - A small helper talks to SSH Pilot’s daemon over a local socket (token-protected)
- If a matching secret exists in your vault (or was staged for this connect), it is returned once
- If not, you get a secure dialog; optionally save it to the vault for next time
- The helper clears its copy after handing the secret to OpenSSH
- No fake terminal typing for login passwords on the native SSH path. Secrets are not pasted into the PTY as if you typed them (which would expose them to terminal scrollback and recording).
- One-shot staging. Session passwords held for a pending connect live in memory for a single askpass consumption — they are not left on disk as a standing cache.
- Daemon-owned secrets. Connect-time lookup and vault lifecycle run in the daemon. The GTK frontend does not walk a list of decrypted passwords.
- OTP / MFA still work. When OpenSSH asks for a verification code, askpass shows a challenge dialog instead of inventing a stored password.
- Hardware keys and agents. PKCS#11 and SSH agent flows stay on the OpenSSH path; see Key Management.
SSH Pilot’s security model deliberately avoids:
- Storing login passwords in plaintext preference files
- Putting passwords on process command lines (where other users can see them in
ps) - Returning secret values in ordinary API responses or connection list payloads
- Shipping passwords inside normal log lines (diagnostics redact sensitive fields)
- Requiring a cloud account — local keyring / KeePass /
pass/ agent-only all work offline
Backups that include secrets are explicit export operations. Archives can be passphrase-protected; Bitwarden backups use vault secure notes. See Backup.
- Prefer SSH keys over passwords when the server allows it — deploy with Key Management, then stop saving login passwords.
- Use the system keyring on a single trusted machine for the smoothest and still OS-backed experience.
- Use KeePass or Bitwarden if you need portable or multi-device secrets — and unlock only when you need them.
- Enable vault lock timeout if you step away from the desk often.
- Choose SSH Agent Only (plus a hardware key if you have one) for maximum minimalism — nothing password-like is persisted by SSH Pilot.
-
Isolated Mode keeps SSH Pilot’s config/keys separate from
~/.sshif you want a sandbox; passwords still use the same credential backend. See Isolated Mode. - Plugins run with your user permissions — only install plugins you trust (Plugins).
If you believe you found a vulnerability in credential handling, askpass, or backup export:
- Prefer a private report via GitHub Security Advisories when available, or open a carefully redacted GitHub Issue
- Do not attach real passwords, private keys, or vault dumps
- Include OS, SSH Pilot version, and steps to reproduce with dummy credentials
For connection/askpass troubleshooting (without secrets), see Troubleshooting.
- Credentials -- Choose and configure a storage backend
- Bitwarden & Vaultwarden -- Cloud vault setup and performance notes
- Key Management -- Move from passwords to keys
- Backup -- How secret-bearing backups are handled
- Settings -- Security options and vault lock timeout
- Home
- Installation
- Quick Start
- Main Window
- Sidebar
- Connections
- Groups
- Terminal
- File Manager
- Credentials
- Key Management
- Known Hosts
- Authorized Keys
- Keyboard Quick Reference
- Omni-search
- Snippets
- Keyboard Shortcuts
- Plain Terminal Mode
- Docker Console
- Protocols
- Security
- Bitwarden & Vaultwarden
- Settings
- Isolated Mode
- Backup
- Plugins
- FAQ
- Troubleshooting