SFTPresso moves files over SFTP (SSH) and FTP/FTPS and handles your server credentials along the way, so I take security reports seriously. Thanks in advance for the help.
Please don't open a public issue for a security problem.
Report it privately through GitHub instead:
- Go to https://github.com/jmwerk/SFTPresso/security/advisories/new, or
- Open the repo's Security tab → Report a vulnerability.
If private reporting isn't available to you for some reason, email
j.m.werkheiser+SFTPresso@gmail.com with SFTPresso security in the subject.
It helps a lot if you include:
- The affected version (next to SFTPresso in the Extensions view)
- Your VS Code version and OS
- The protocol/config involved (
sftp/ftp/ FTPS, hopping, profiles) — with credentials and hostnames redacted - Steps to reproduce, and what an attacker actually gains from it
- Anything relevant from the SFTP output channel (redacted, same as above)
I maintain this project alone, so treat these as best-effort targets, not an SLA:
| Stage | Target |
|---|---|
| I acknowledge your report | within 5 days |
| Initial assessment / severity call | within 14 days |
| Fix released, if accepted | as soon as I reasonably can, depending on severity |
Fixes go out as a normal release to the VS Code Marketplace and
Open VSX, along with a GitHub Security Advisory and a
CHANGELOG.md entry. You'll be credited in the advisory unless you'd rather not be.
If you can, please hold off on public disclosure until the fix has shipped.
Only the current release gets security fixes — there's no long-term-support branch. Updates arrive automatically through the Marketplace or Open VSX, so staying current is really the only supported path:
| Version | Supported |
|---|---|
| Whatever's currently published | ✅ |
| Any older SFTPresso release | ❌ — please upgrade |
vscode-sftp from @Natizyskunk or @liximomo |
❌ — different project, report it upstream |
In scope
- Credential handling — password storage, key/passphrase handling, secrets leaking into logs, the output channel, telemetry, or error messages
- Code execution or writes outside the local/remote paths you configured, including path traversal via a remote filename during download or sync
- Weakening SSH/TLS transport security below what you actually configured
- A vulnerable dependency that's genuinely reachable from the extension's own code
- Anything in the release pipeline that could ship a tampered
.vsix
Out of scope
- Vulnerabilities in the remote SFTP/FTP server you're connecting to — that's not this project
- The throwaway credentials and SSH keys under
test/integration/— test-only, never used outside the Docker compose stack - Anything that requires an attacker who already has code execution or filesystem
access as you — at that point they can just read
sftp.jsonand your SSH keys directly - Scanner output with no demonstrated impact
- Hardening that's really VS Code's job (extension sandboxing, the marketplace trust model)
A few things worth understanding up front, since they explain whether something you've noticed is a bug or just how this is built:
- Your config lives in your workspace.
.vscode/sftp.jsonis a plain file in your project. If it has apassword,privateKeyPath, orpassphrasein it, anything that can read the workspace — including a commit — can read those too. If the file holds secrets, put it in.gitignore. - The OS keychain is the better option. Leave
passwordout ofsftp.jsonand let SFTPresso prompt you for it — it'll store the password in VS Code'sSecretStorage(backed by your OS keychain), keyed byprotocol://username@host:port.SFTP: Save Password,SFTP: Clear Password, andSFTP: Migrate Plaintext Passwordmanage those entries, and I'd recommend using them over a plaintext password. - Private keys are read from disk by path, at connect time. Keeping that file's permissions locked down is on you.
- SSH host keys are checked. Every connection is verified against your own
~/.ssh/known_hosts(or SFTPresso's own store, for keys you've only accepted here) — see Host key verification in the wiki for exactly how that works and whatstrictHostKeyCheckingchanges about it. - FTP is unencrypted, by protocol. Set
"secure": truefor FTPS if your server supports it — plainftpsends credentials and file contents in the clear no matter what this extension does. sftp.jsonis config, not code, but treat it like any other untrusted file. It's parsed as JSONC, not executed — but it does decide where your files go, so review one from a repo you don't trust before connecting, the same as you would any other workspace file.
- CodeQL runs on every push and PR to
develop, plus weekly on a schedule. - Dependabot opens weekly update PRs for npm dependencies and GitHub Actions.
- Unit tests run on every push, and the FTP/SFTP integration suite runs the real client code against Docker-hosted servers in CI.