편집자 노트

AndyYJF/dsh-lan-web-auth

DeepSeek Harness (dsh) host plugin: crypto.randomUUID polyfill + password auth for running the web GUI over LAN / ZeroTier

이것은 DeepSeek Harness(DSH) 플러그인입니다. 이 사이트는 GitHub README, 설치 정보, 유지보수 상태, 공개 보안 시그널을 모아 보여줍니다.

dsh-lan-web-auth

English | 简体中文

面向 DeepSeek Harnessdsh --profile web)的宿主插件:让浏览器 GUI 能在局域网中正常使用,并加上密码保护。包含两个功能:

  1. crypto.randomUUID polyfill —— GUI 的 RPC 客户端用 crypto.randomUUID() 生成请求 id,而浏览器只在安全上下文(HTTPS 或回环地址)中暴露该 API。纯 HTTP 的局域网来源(192.168.x.x、主机名、ZeroTier IP)不是安全上下文,因此每次 /api 调用都会在客户端直接抛错(crypto.randomUUID is not a function):会话列表永远加载不出来、工作区基线永远不就绪,界面一直停在"选择工作区"。polyfill 基于 crypto.getRandomValues 实现——它在非安全上下文中可用。

  2. 密码鉴权 —— 对页面 fallback、/api 前缀路由、以及两个 WebSocket 下行通道(/api/events.mux/api/events.host)统一做 cookie 校验。未登录的访客会看到内置登录页;向 POST /api/auth/login 提交正确密码后种下 HttpOnly cookie(30 天有效)。回环来源(127.0.0.1 / localhost / ::1)默认免密(config.loopbackExempt)。

安全与风险

在把 GUI 暴露到本机之外之前,请先读完本节。dsh web 是一个远程控制面:harness 可以执行 shell 命令、读写文件、管理凭据与设置,因此"认证成功(或被绕过)"等价于以你的用户身份远程执行代码。

  • 明文 HTTP、无 TLS。 密码、会话 cookie 和全部对话内容都以明文传输。任何能嗅探网段的人(例如开放 Wi-Fi、被攻破的 AP/路由器)都可以截获密码或劫持会话。在不可信网络上,请把 dsh 放到 TLS 反向代理后面,或只通过加密隧道(ZeroTier / Tailscale / WireGuard)访问。
  • 无暴力破解防护。 登录端点没有限速或锁定机制,弱密码可以被猜出。请使用长、随机、不与其他账号重复的密码。
  • 密码明文存储。 config.password 明文保存在 ~/.dsh/profiles/web/cordis.patch.yml 中;改用 DSH_WEB_PASSWORD 环境变量时,密码也会出现在进程环境里。任何拥有本机读取权限的人都能拿到。不要把真实密码提交进 git(示例 patch 用的是占位符)。
  • 回环免密是一个真实缺口。 loopbackExempt: true(默认)时,本机任何进程——不只是你的浏览器——只要连得上 127.0.0.1:3080 就完全绕过密码,因为它可以发送回环 Host 头,而 DNS-rebinding 栅栏约束不了非浏览器客户端。不信任本机进程时请设 loopbackExempt: false,让回环访问也要求密码。
  • 无状态 token、无法吊销。 会话 token 是密码的 SHA-256 哈希;改密码是吊销已有 cookie 的唯一手段。cookie 有效期 30 天。
  • 绑定 0.0.0.0 会扩大暴露面。 示例 patch 监听所有网卡,机器挂载的每个网络(Wi-Fi、ZeroTier、TUN 虚拟网卡……)都能访问 GUI。在不完全信任的网络上,请只绑定具体接口(例如 host: '192.168.1.13')。
  • 鉴权是附加层,不是安全边界。 本插件的密码门禁叠加在内置浏览器信任栅栏(Host/Origin 校验)之上,是家用/局域网场景的便利层,不能替代 HTTPS + 真正的认证。如果威胁模型重要,请在 dsh 前面架设正规反向代理。
  • Workaround,可能与上游冲突。 本插件绕过了上游的缺口(非安全上下文下缺少 crypto.randomUUID;无内置认证)。如果未来某个 dsh 版本修复了其中任意一项,升级前请评估是否还需要本插件。

安装

  1. 把包复制进 web profile 的 node_modules:

    ~/.dsh/profiles/web/node_modules/dsh-lan-web-auth/
    

    (或者作为插件安装:在 ~/.dsh/profiles/web/package.json 的 dependencies 中加入 "dsh-lan-web-auth": "file:<路径>",然后运行 dsh plugin --profile web install。)

  2. 在用户 patch 层 ~/.dsh/profiles/web/cordis.patch.yml 中加入对应行——完整的局域网配置(绑定 0.0.0.0、信任主机名、插件行)见 patch.example.yml。patch 层是用户自有的扩展点:npm i -g @deepseek-ai/dsh 升级不会覆盖它。

  3. 重启 dsh --profile web(或让用户 patch 监视器热加载)。

配置

字段含义
password登录密码。缺省时回退到 DSH_WEB_PASSWORD 环境变量。两者都没有时鉴权保持关闭(仅 polyfill),并输出警告日志。
loopbackExempttrue(默认)时,回环来源跳过密码。

在 patch 中修改 config.password 会通过 HMR 即时生效;局域网客户端需要重新登录。

备注

  • token 是密码的 SHA-256——无状态,重启不失效。
  • 鉴权叠加在内置 DNS-rebinding / 浏览器信任栅栏之上,栅栏仍然生效。
  • 插件代码改动需要重启 dsh(loader 按进程缓存模块);配置改动热生效。
  • patch.example.yml 中的 webserver 行监听所有接口(0.0.0.0),让局域网/ZeroTier 设备能访问 GUI;connection 行把主机名加入信任栅栏。
REPOSITORY SIGNALS

보안 및 설치 증거

이 점수는 공개 저장소 메타데이터와 이 사이트에 등록된 설치 증거에만 기반하며, 코드 보안 감사와 다릅니다.

출처 추적 가능

공개 플러그인 카탈로그에서 왔으며, 공개 GitHub 저장소로 연결됩니다.

라이선스

GitHub 메타데이터에서 라이선스가 감지되지 않았습니다.

유지보수 활동

최근 180일 내 코드 업데이트가 있습니다.

설치 증거

재현 가능한 정확한 설치 메타데이터가 아직 등록되지 않았습니다. 저장소 설명에 따라 직접 확인하세요.

설치 라이프사이클 스크립트

검사한 패키지 메타데이터에 설치 라이프사이클 스크립트가 선언되지 않았습니다.

주의 사항missing-license