工作区浏览器预览的 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
工作区浏览器预览的 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