Skip to content

v1.16.0

Choose a tag to compare

@github-actions github-actions released this 06 Aug 10:33
· 36 commits to main since this release
v1.16.0
15d4c8f

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 the coder.sshConfig setting or via coder 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 proxycommand or 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.

Trust prompt shown when a deep link points at an unknown Coder deployment
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)

Popup notification for an unseen deployment announcement
The popup shown when a deployment has announcements you haven't seen yet
Megaphone status bar item showing active announcements
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_user query instead of fetching shared:true results 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.SSH settings section, so a custom config file set as remote.devinSSH.configFile, remote.windsurfSSH.configFile, or remote.antigravitySSH.configFile was 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 from machine to application scope, fixing values reverting to their defaults in a remote window while still keeping workspace/folder settings.json from 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