# 漏洞总结 ## 漏洞概述 在 Langfuse 项目中,当 LLM 连接测试的 `baseUrl` 发生变化时,系统会错误地复用之前存储的敏感凭证(`secretKey` 和 `extraHeaders`)。这导致原本用于测试的加密敏感信息可能被发送到攻击者控制的端点,存在敏感信息泄露风险。 ## 影响范围 - **受影响包**:`web` - **触发条件**:更新或测试 LLM 连接时,使用相同的 `baseUrl` 但不同的 `secretKey`,或更改 `baseUrl` 时未提供新的 `secretKey`。 - **后果**:存储的 `extraHeaders` 可能被复用并发送到新的端点;项目成员若没有 `llm:apiKeys:create` 权限,其请求仍会被此测试路径拦截。 ## 修复方案 1. **阻止复用**:当 `baseUrl` 改变且未提供新的 `secretKey` 时,阻止复用存储的 `secretKey`。 2. **防止泄露**:当 `baseUrl` 改变时,除非显式提供新的 `extraHeaders`,否则阻止复用存储的 `extraHeaders`。 3. **增加测试覆盖**:添加针对上述场景的服务器测试,包括相同主机名重用和更改主机名时头部丢弃的情况。 4. **强制新密钥**:更改 `baseUrl` 时,`test/update` 操作现在要求提供非空的 `secretKey`。 5. **移除旧逻辑**:更改 `baseUrl` 时,`test/update` 不再存储旧的 `extraHeaders`;调用者必须显式提供要发送到新端点的任何头部。 ## POC/利用代码 页面中未提供可直接利用的 POC 代码,但提供了用于验证修复的测试命令: ```bash git diff --check attempted page --filter web run test --testPathPattern="src/.*tests/_server/llm-api-key-server.test.ts" ``` 以及相关的代码审查片段(来自 `chatgpt-codex-connector` 的评论),指出了测试中存在的权限问题: ```typescript // langfuse/web/src/_tests/_server/llm-api-key-server.test.ts // Lines 220 to 223 in ab9a888 220 const memberCaller = createCallerForProjectRole("MEMBER"); 221 await expect( 222 memberCaller.llmApiKeys.testUpdate({ ``` 该评论指出,尽管测试声称需要 `llm:apiKeys:create` 权限,但它使用的是 `MEMBER` 角色,而 `MEMBER` 角色同时缺乏 `llm:apiKeys:create` 和 `llm:apiKeys:update` 权限。这意味着如果 `test/update` 继续检查旧的 `llm:apiKeys:update` 作用域,测试将通过,即使它不再保护预期的授权更改,从而可能产生虚假信心。