# Security Policy ## Supported versions | Version | Supported | | --- | --- | | 1.x | Yes | | < 1.0 | No | The plugin is a local DSH Desktop bundle. It runs with the same OS user privileges as DeepSeek Harness and is not sandboxed by the plugin system itself. ## Reporting a vulnerability Please do **not** open a public issue for a vulnerability that exposes credentials, allows guest-to-host code execution, or bypasses the Electron webview boundary. Use the repository's **Security → Report a vulnerability** flow (GitHub private advisory). Include: - DSH Desktop version and OS. - Steps to reproduce. - Whether the issue involves the host document, the embedded DeepSeek guest, or the Desktop browser bridge. - Any relevant console output with tokens redacted. Please allow time for a fix before public disclosure. ## Design boundaries - **No Host HTTP routes.** The Host half (`index.js`) exports an empty `apply()`. - **No Harness credentials in the guest.** The plugin never reads or forwards an API key, Harness session token, or account token. - **Isolated webview.** The guest is attached through the Desktop browser bridge with sandboxing, context isolation, no Node integration and no webviewTag. Permission, device and display-media requests are denied by the host policy. - **No HTML injection from the guest.** Results from the guest are limited to fixed console markers and boolean checks; guest markup is never inserted into the Harness document. - **Local token storage.** The DeepSeek web sign-in is stored in the DSH renderer's `localStorage` under `dsh.deepseek-web.auth.v1`. It is plaintext and has the same exposure as other DSH browser storage. On launch it is copied into the DeepSeek origin's `localStorage` on a same-origin warmup page before the chat app boots; the plugin does not send it anywhere. - **Environment-warning preference.** Before the chat app boots, the plugin sets DeepSeek's own `closeUnsafeEnvWarn` preference on a same-origin warmup page. This is the state its “dismiss” X button writes, and it prevents the “abnormal usage environment” advisory from reappearing on every launch. It does not spoof the User-Agent, bypass authentication, or change isolation; it does dismiss a third-party security advisory, and the embedded page remains non-official. - **No telemetry.** The plugin does not send analytics or call any third-party API of its own. ## Third-party content The embedded page is `https://chat.deepseek.com/`, owned and operated by DeepSeek. The plugin does not control its content, availability, authentication flow or privacy policy. Review DeepSeek's terms and privacy policy before signing in. ## Local data To remove the saved web sign-in from the DSH renderer: ```js localStorage.removeItem('dsh.deepseek-web.auth.v1') ``` Removing the plugin does not remove data that DeepSeek's own web page stored in its webview partition; that partition is process-scoped and is discarded when the app exits. ## Dependency surface There are no runtime npm dependencies. The repository's check script uses only Node built-ins. CI uses GitHub Actions and Node.js.