Files
connectai/src/security.ts
T

66 lines
2.6 KiB
TypeScript

import * as vscode from 'vscode';
import * as path from 'path';
import * as fs from 'fs';
/**
* Validates that a path is strictly within the workspace.
* Prevents Path Traversal attacks by resolving real paths and checking boundaries.
*/
export function validatePath(workspaceRoot: string, targetPath: string): string {
if (!workspaceRoot) {
throw new Error("Security Violation: Workspace root not defined.");
}
const absolutePath = path.resolve(workspaceRoot, targetPath);
const normalizedRoot = path.normalize(workspaceRoot).toLowerCase();
const normalizedTarget = path.normalize(absolutePath).toLowerCase();
const normalizedAntigravity = "/Volumes/Data/project/Antigravity".toLowerCase();
if (!normalizedTarget.startsWith(normalizedRoot) && !normalizedTarget.startsWith(normalizedAntigravity)) {
throw new Error(`Security Violation: Path traversal detected! Attempted to access ${absolutePath} which is outside allowed boundaries.`);
}
return absolutePath;
}
/**
* Sanitizes terminal commands to prevent destructive actions.
* Uses a combination of blocklist for dangerous patterns and recommendation for allowed tools.
*/
export function sanitizeCommand(command: string): string {
const trimmedCmd = command.trim();
// 1. Dangerous Shell Characters/Patterns (Blocklist)
const dangerousPatterns = [
/rm\s+-rf\s+\//, // Root deletion
/mkfs/, // Filesystem formatting
/dd\s+if=/, // Low-level disk writing
/>\s*\/dev\/sd/, // Direct disk access
/:(){:|:&};:/, // Fork bomb
/shutdown/, // System shutdown
/reboot/, // System reboot
/mv\s+.*\/dev\/null/ // Moving to null
];
for (const pattern of dangerousPatterns) {
if (pattern.test(trimmedCmd)) {
throw new Error(`Security Violation: Destructive command pattern detected! Blocked: ${trimmedCmd}`);
}
}
// 2. Allowlist of safe base commands (Optional but recommended)
// For now, we allow common development tools
const safeBaseCommands = [
'npm', 'node', 'npx', 'git', 'python', 'python3', 'pip', 'pip3',
'cargo', 'rustc', 'go', 'gcc', 'g++', 'make', 'ls', 'cat', 'echo',
'mkdir', 'cp', 'mv', 'touch'
];
const baseCmd = trimmedCmd.split(/\s+/)[0];
if (baseCmd && !safeBaseCommands.includes(baseCmd)) {
console.warn(`[Security] Warning: Running uncommon command '${baseCmd}'. Ensure this is intended.`);
}
return trimmedCmd;
}