# 漏洞总结 ## 漏洞概述 该漏洞涉及在 `openclaw` 项目中,本地媒体根目录的配置和解析逻辑存在安全问题。具体表现为: - 本地媒体根目录的解析未正确限制文件系统的访问范围,可能导致恶意用户通过构造特定的媒体源路径,访问或操作非预期的文件系统资源。 - 修复前的代码中,`resolveMediaToolLocalRoots` 函数未对媒体源路径进行充分的安全校验,导致可能绕过预期的文件系统限制。 ## 影响范围 - **影响模块**:`src/agents/tools/media-tool-shared.ts`、`src/media/local-roots.ts` 等与媒体工具相关的模块。 - **影响场景**:当用户通过 `mediaSources` 配置媒体源时,若未启用 `workspaceOnly` 选项,可能导致文件系统访问范围扩大。 - **潜在风险**:攻击者可能利用此漏洞访问或修改非预期的文件,造成数据泄露或系统被篡改。 ## 修复方案 1. **代码修改**: - 在 `src/agents/tools/media-tool-shared.ts` 中,新增 `appendLocalMediaParentRoots` 函数,用于安全地解析媒体源路径,并确保其父目录在允许的范围内。 - 修改 `resolveMediaToolLocalRoots` 函数,增加对媒体源路径的安全校验,避免非法路径被解析。 - 在 `src/media/local-roots.ts` 中,优化 `resolveLocalMediaPath` 函数,确保路径解析符合安全要求。 2. **测试用例**: - 新增测试用例 `src/media/local-roots.test.ts`,验证修复后的代码能够正确处理各种媒体源路径,包括合法路径和非法路径。 3. **关键代码变更**: - 新增 `appendLocalMediaParentRoots` 函数,确保媒体源路径的父目录在允许的范围内。 - 修改 `resolveMediaToolLocalRoots` 函数,增加对媒体源路径的安全校验。 - 优化 `resolveLocalMediaPath` 函数,确保路径解析符合安全要求。 ## POC 代码 ```typescript // src/agents/tools/media-tool-shared.ts export function resolveMediaToolLocalRoots( workspaceDirRaw: string | undefined, options: { workspaceOnly?: boolean } ): string[] { const workspaceDir = normalizeWorkspaceDir(workspaceDirRaw); if (options.workspaceOnly) { return workspaceDir ? [workspaceDir] : []; } const roots = getDefaultLocalRoots(); const scopedRoots = workspaceDir ? Array.from(new Set([...roots, workspaceDir])) : [...roots]; return appendLocalMediaParentRoots(scopedRoots, mediaSources); } // src/media/local-roots.ts export function appendLocalMediaParentRoots( roots: readonly string[], mediaSources: readonly string[] ): string[] { const appended = Array.from(new Set(roots.map((root) => path.resolve(root)))); for (const source of mediaSources ?? []) { const localPath = resolveLocalMediaPath(source); if (!localPath) { continue; } const parentDir = path.dirname(localPath); if (parentDir === path.parse(parentDir).root) { continue; } const normalizedParent = path.resolve(parentDir); if (appended.includes(normalizedParent)) { continue; } appended.push(normalizedParent); } return Array.from(new Set(roots.map((root) => path.resolve(root)))); } ``` ## 总结 该漏洞通过修复媒体源路径的解析逻辑,确保文件系统访问范围在预期范围内,从而防止潜在的安全风险。修复后的代码增加了安全校验,并通过测试用例验证了修复的有效性。