fix(security): add path validation to git tool handler
handleGit was missing checkPathAllowed validation on the working directory (cwd), allowing git operations to execute in any directory bypassing the security policy. Added validation for: - The cwd used by all git operations - The clone destination directory (write permission check)
This commit is contained in:
@@ -12,6 +12,10 @@ export async function handleGit(params: { action: string; path?: string; files?:
|
|||||||
try {
|
try {
|
||||||
const cwd = params.path ? path.resolve(params.path) : getWorkspaceDir();
|
const cwd = params.path ? path.resolve(params.path) : getWorkspaceDir();
|
||||||
|
|
||||||
|
// 安全检查:验证工作目录路径
|
||||||
|
const dirCheck = checkPathAllowed(cwd, 'read');
|
||||||
|
if (!dirCheck.ok) return { success: false, error: dirCheck.reason };
|
||||||
|
|
||||||
async function runGit(args: string[]): Promise<{ stdout: string; stderr: string; code: number }> {
|
async function runGit(args: string[]): Promise<{ stdout: string; stderr: string; code: number }> {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const git = spawn('git', args, { cwd, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, LANG: 'en_US.UTF-8' } });
|
const git = spawn('git', args, { cwd, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, LANG: 'en_US.UTF-8' } });
|
||||||
@@ -180,6 +184,8 @@ export async function handleGit(params: { action: string; path?: string; files?:
|
|||||||
case 'clone': {
|
case 'clone': {
|
||||||
if (!params.url) return { success: false, error: '请提供仓库 URL' };
|
if (!params.url) return { success: false, error: '请提供仓库 URL' };
|
||||||
const destDir = params.path ? path.resolve(params.path) : getWorkspaceDir();
|
const destDir = params.path ? path.resolve(params.path) : getWorkspaceDir();
|
||||||
|
const cloneDirCheck = checkPathAllowed(destDir, 'write');
|
||||||
|
if (!cloneDirCheck.ok) return { success: false, error: cloneDirCheck.reason };
|
||||||
const r = await runGit(['clone', params.url, destDir]);
|
const r = await runGit(['clone', params.url, destDir]);
|
||||||
if (r.code !== 0) return { success: false, error: r.stderr };
|
if (r.code !== 0) return { success: false, error: r.stderr };
|
||||||
return { success: true, action: 'clone', url: params.url, destination: destDir };
|
return { success: true, action: 'clone', url: params.url, destination: destDir };
|
||||||
|
|||||||
Reference in New Issue
Block a user