TLS SNI 支持任意主机名,并可执行无限制的证书生成
严重程度: 高。未经过身份验证的客户端可以访问 TLS 监听器,并可以为每次握手发送唯一的 SNI 主机名。`packages/portless/src/certs.ts:791-887` 仅对 bare `localhost` 名称进行特殊处理,然后在不检查配置的 TLD、注册的路由或通配符策略的情况下接受其他所有服务器名称。在每次缓存未命中时,`packages/portless/src/certs.ts:681-771` 会调用 OpenSSL 三次,并将私钥和证书保存到 `host-certs` 中;内存缓存和磁盘文件没有大小、生命周期或速率限制。回调函数已绑定到活动的安全代理,位于 `packages/portless/src/cli.ts:3365-3372` 和 `packages/portless/src/proxy.ts:710-725`。重现: `pnpm dlx tsx /tmp/sni-repro.ts` 返回了两个未配置的名称,结果为 `{"arbitrarySniAccepted":true,"generatedFiles":["another-attacker_example-key.pem","another-attacker_example.pem","attacker_example-key.pem","attacker_example.pem"]}`。因此,重复的唯一名称会消耗 CPU 和 OpenSSL 子进程的容量,并增加持久状态,从而提供拒绝服务和磁盘耗尽路径。明确启用 LAN 模式的情况下,远程可达性已得到确认,因为 `packages/portless/src/cli-utils.ts:219-222` 绑定到 `0.0.0.0` 和 `::`;正常的非 LAN 模式仅支持回环,这限制了远程攻击者。建议的修复措施: 在任何文件系统或 OpenSSL 工作之前,拒绝验证配置的 TLD 和注册或明确通配符路由之外的 SNI 名称,并强制实施受限的证书缓存、清理和握手或生成速率限制。
内容来源: vercel-labs/portless