v1.16.0
This release fixes a critical security issue in how the extension writes SSH configuration and trusts vscode:// deep links, and we recommend everyone update. It also adds deployment announcements to the status bar, makes support bundles more complete and more transparent, speeds up the Shared Workspaces view, and tightens credential handling and log hygiene.
🔒 Security
SSH Config Hardening and Deep Link Trust
Fixes GHSA-5jhf-4v56-p5c8: a malicious Coder deployment, or a crafted vscode:// deep link pointing at one, could smuggle arbitrary directives such as ProxyCommand into the SSH config block the extension manages, which amounts to arbitrary code execution on your machine.
The extension now:
- Rejects dangerous SSH options from the deployment. Options that run code or change how Coder connects (
ProxyCommand,LocalCommand,RemoteCommand,Include,ProxyJump,Match, and others) are denied, mirroring the server's own validation of--ssh-config-options. Malformed options with embedded newlines are rejected outright, and every key, value, and hostname is re-validated when the config is written, so no call path can skip the check. Options you set yourself, in thecoder.sshConfigsetting or viacoder config-ssh --ssh-option, stay allowed because your value takes precedence over the deployment's. - Verifies the written config the way OpenSSH reads it. The post-write safety check now treats option names case-insensitively and takes the first value, matching OpenSSH semantics, so a
proxycommandor duplicate directive can no longer slip past it. All problems are reported in a single dialog stating the actual and expected values. - Asks before trusting unknown deployments. A deep link to a deployment you never logged in to now shows a "Trust and Continue" confirmation naming the workspace it opens, and a token in a link only signs you in or switches accounts after an explicit confirmation naming the accounts involved. A link normally shows at most one prompt, and a link that signs the same user in to the same deployment stays silent.
- Keeps your session token at home. The stored session is only ever sent to the origin it was created for, so a lookalike origin sharing the hostname cannot receive it.
The trust prompt shown when a deep link points at a deployment you have not logged in to
Important
Connection setup now fails with an error if your deployment sends a denied or malformed SSH option (previously all deployment options were written verbatim). If you need one of these options, set it yourself in coder.sshConfig.
Highlights
Deployment Announcements
Active deployment announcements now show up in a megaphone status bar item, with a popup for announcements you haven't seen yet. Notifications respect coder.disableNotifications; when suppressed, the status bar item is highlighted instead. The new Coder: View Announcements command opens the full messages in a markdown preview. (#1018)
The popup shown when a deployment has announcements you haven't seen yet |
The megaphone status bar item with the number of active announcements |
Better Support Bundles
Coder: Create Support Bundle now collects the remote editor's server logs from the workspace alongside the local extension and SSH logs, so one bundle tells the whole story, including the half that used to require shelling into the workspace (requires a Coder 2.36.0+ deployment). And before anything is gathered, the extension asks for confirmation with a summary of exactly what the bundle will contain. (#1042, #1054)
Improvements
- Shared Workspaces loads faster. The view now filters with the server-side
shared_with_userquery instead of fetchingshared:trueresults and filtering on the client, so fewer workspaces are fetched. Deployments too old to support the filter show a message explaining why instead of an empty list. (#1026) - Logout you can trust. Logging out now revokes the OAuth tokens at the server and warns you when locally stored credentials could not be fully removed, instead of showing a success message regardless. (#1054)
- Cleaner logs. More sensitive data is redacted from HTTP logs: authorization and cookie headers regardless of casing, OAuth credential fields in request and response bodies, and any header produced by
coder.headerCommand. Shell command output no longer appears in logs or error messages. (#1054)
Bug Fixes
- SSH config lands where your editor looks. Windsurf/Devin and Antigravity renamed the
remote.SSHsettings section, so a custom config file set asremote.devinSSH.configFile,remote.windsurfSSH.configFile, orremote.antigravitySSH.configFilewas ignored and the workspace host was written to~/.ssh/config, where those editors never looked. The extension now reads the active Remote-SSH extension's own settings section. (#1060) - Hung requests time out. REST requests get a 60-second default timeout, so a request stuck on a half-open TCP connection no longer stalls pollers forever. (#1025)
- Settings stick in remote windows.
coder.binarySource,coder.headerCommand, the TLS file settings, and other machine-only settings moved frommachinetoapplicationscope, fixing values reverting to their defaults in a remote window while still keeping workspace/foldersettings.jsonfrom overriding them. (#1034) - Wrong-deployment logins are skipped. A saved login that points at a different deployment than the one it was saved for is no longer used, and migrating file-based credentials with such a mismatch warns instead of failing the connection. (#1059)
- Legacy credentials are cleaned up. File-based credentials are deleted after migration to secret storage, instead of leaving plaintext copies behind. (#1054)
Full changelog: v1.15.2...v1.16.0

