84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
package sandbox
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
// DangerousFiles lists files that should be protected from writes.
|
|
// These files can be used for code execution or data exfiltration.
|
|
var DangerousFiles = []string{
|
|
".gitconfig",
|
|
".gitmodules",
|
|
".bashrc",
|
|
".bash_profile",
|
|
".zshrc",
|
|
".zprofile",
|
|
".profile",
|
|
".ripgreprc",
|
|
".mcp.json",
|
|
}
|
|
|
|
// DangerousDirectories lists directories that should be protected from writes.
|
|
// Excludes .git since we need it writable for git operations.
|
|
var DangerousDirectories = []string{
|
|
".vscode",
|
|
".idea",
|
|
".claude/commands",
|
|
".claude/agents",
|
|
}
|
|
|
|
// GetDefaultWritePaths returns system paths that should be writable for commands to work.
|
|
func GetDefaultWritePaths() []string {
|
|
home, _ := os.UserHomeDir()
|
|
|
|
paths := []string{
|
|
"/dev/stdout",
|
|
"/dev/stderr",
|
|
"/dev/null",
|
|
"/dev/tty",
|
|
"/dev/dtracehelper",
|
|
"/dev/autofs_nowait",
|
|
"/tmp/fence",
|
|
"/private/tmp/fence",
|
|
}
|
|
|
|
if home != "" {
|
|
paths = append(paths,
|
|
filepath.Join(home, ".npm/_logs"),
|
|
filepath.Join(home, ".fence/debug"),
|
|
)
|
|
}
|
|
|
|
return paths
|
|
}
|
|
|
|
// GetMandatoryDenyPatterns returns glob patterns for paths that must always be protected.
|
|
func GetMandatoryDenyPatterns(cwd string, allowGitConfig bool) []string {
|
|
var patterns []string
|
|
|
|
// Dangerous files - in CWD and all subdirectories
|
|
for _, f := range DangerousFiles {
|
|
patterns = append(patterns, filepath.Join(cwd, f))
|
|
patterns = append(patterns, "**/"+f)
|
|
}
|
|
|
|
// Dangerous directories
|
|
for _, d := range DangerousDirectories {
|
|
patterns = append(patterns, filepath.Join(cwd, d))
|
|
patterns = append(patterns, "**/"+d+"/**")
|
|
}
|
|
|
|
// Git hooks are always blocked
|
|
patterns = append(patterns, filepath.Join(cwd, ".git/hooks"))
|
|
patterns = append(patterns, "**/.git/hooks/**")
|
|
|
|
// Git config is conditionally blocked
|
|
if !allowGitConfig {
|
|
patterns = append(patterns, filepath.Join(cwd, ".git/config"))
|
|
patterns = append(patterns, "**/.git/config")
|
|
}
|
|
|
|
return patterns
|
|
}
|