Skip to content

[Desktop/Chat][P1][Security] 工作区预览代理未验证调用方身份与目标授权 #79

Description

@jiayuqi7813

工作区浏览器预览的 Next 代理在获取目标之前没有验证请求者身份,也没有将目标端口/路径绑定到已授权的 workspace 或预览能力。其回环限制描述的是代理服务器能连接哪里,不能替代谁可以使用这项能力。未登录请求可以让 UI 代理宿主读取一个符合回环规则的 HTTP 目标,并取得响应正文。

2026-09-30 当前本地 macOS 开发服务的无害验证已确认:主线程在代理宿主创建一次性合成纯文本 fixture,未带 Authorization 的代理请求返回 HTTP200 和相同 SYNTHETIC 内容;非回环目标返回403,错误协议返回400。fixture 随后关闭。没有访问其他真实服务、用户资料、凭据、系统授权或工具;不公开 fixture端口、具体调用 URL 或私人截图。完整输入/响应和源文件 SHA 保存在本地 ignored artifact。

源码调用链:专用 Next GET route → parseWorkspaceBrowserProxyPath → loopback HTTP(S) 校验 → Node fetch(GET) → 直接返回文本/二进制或重写 HTML。route 不检查认证或 target grant。Next middleware 只匹配 terminal stream;FastAPI 的密码/Bearer gate保护其自己的 API,不能拦截这条直接由 Next 处理的预览请求。通用 API proxy 与此专用 handler 是不同路径。

现有保护仍有效:仅 HTTP(S) 与规定回环 hostname,只有 GET;上游 redirect 为 manual,非回环 redirect 不由 Node 自动跟随;只转发少量展示请求头,不把聊天 Cookie/Authorization 带给目标,响应 no-store,支持调用方 abort。未证明任意互联网、任意文件、受保护 API token 绕过、真实敏感内容泄露或 native IPC 越权。目标归属是 UI代理进程宿主;远程部署不能称为桌面客户端自身 localhost。

严重性:按 P1 条件性安全修复追踪——路由无身份/目标授权已证实;若未受外层网关保护的 UI 对不可信请求者可达,则它将宿主回环 HTTP 读取能力暴露出去。安装脚本默认 UI 绑定0.0.0.0、API绑定127.0.0.1,并配置 Web密码,这使缺口与默认部署相关,而非只能靠自定义误配置出现。本次只验证本地开发服务和合成内容,未实测公网/远程可达性、外层访问控制或任何真实严重损害,不能将所有部署或真实秘密泄露判为已证实。最终严重性需要维护者结合实际网络暴露和宿主服务评估。

与 #66 独立:#66 是不可信预览文档与可信聊天 renderer 的同源执行边界;本项无需 iframe、脚本或读取父页,只涉及调用代理的授权。仅改变 iframe sandbox、移到不同 origin 或去掉脚本,仍不会为这个 HTTP代理端点增加身份/目标校验。反过来只加代理认证,也不能隔离已授权预览的脚本与聊天父页。

后续桌面融合应让可信 desktop-owned preview broker 按当前连接、profile、workspace 与显式批准的目标提供受限读取能力;不可信预览不能自行取得任意宿主连接能力。若保留共享 Next gateway,应在发起 upstream 之前核验身份和精确 target scope;iframe取回可采用短期、受限预览能力,避免把长期 bearer放入 URL 或转发给目标。保留回环/协议/GET/redirect/header/cancellation限制。不能用原生任意 fetch IPC 代替现有问题。

本轮不修改源码。desktop-owned renderer/broker 为桌面方案范围;共享 Next handler 的认证/授权缺口属于必须明确登记的安全依赖,不能假装仅调整桌面 iframe 就已修复,也不据此扩大本轮到 Web/后端实现改造。

验收:未认证、过期或目标不匹配的预览能力在任何 upstream请求之前拒绝;获授权的合成预览仍可显示、刷新和受控导航。目标绑定到代理宿主及获批 workspace/端口/路径,不接受仅“是回环地址”的授权依据。验证非回环和错误协议仍拒绝,上游不接收聊天凭据,非回环重定向不自动获取。用可弃置 profile/一次性 SYNTHETIC 服务补验证默认部署与外层网关策略,不使用真实秘密作为测试证据。#66 的文档隔离回归另行保持。

关联: #31
去重:#66 是预览文档同源执行边界;#78 是聊天 SSE 服务端认证缺口;本条是 Next 专用代理获取目标前的调用方与目标授权。#51 处理预览连接错误呈现。
固定公开源码导航(用于定位,实际验证以本地源码 SHA 为准,不声称公开发行包已测试):
https://github.com/FishCodeTech/muteki/blob/ca65724c0e36dfa89d212b6d0d29430d87898c44/apps/web/ui/app/api/workspace-browser-proxy/%5B...path%5D/route.ts
https://github.com/FishCodeTech/muteki/blob/ca65724c0e36dfa89d212b6d0d29430d87898c44/apps/web/ui/lib/workspaceBrowserProxy.ts
https://github.com/FishCodeTech/muteki/blob/ca65724c0e36dfa89d212b6d0d29430d87898c44/apps/web/ui/middleware.ts
https://github.com/FishCodeTech/muteki/blob/ca65724c0e36dfa89d212b6d0d29430d87898c44/apps/web/server.py
https://github.com/FishCodeTech/muteki/blob/ca65724c0e36dfa89d212b6d0d29430d87898c44/scripts/install-ubuntu.sh

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions