diff --git a/internal/plugins/cmd/plugin.go b/internal/plugins/cmd/plugin.go index cfb2405..22d37dc 100644 --- a/internal/plugins/cmd/plugin.go +++ b/internal/plugins/cmd/plugin.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "fmt" + "os" "os/exec" "runtime" "strings" @@ -133,6 +134,10 @@ func (p *Plugin) Start(s *sdk.PluginSDK) error { return map[string]interface{}{"error": "command is required"}, nil } + if blocked, reason := isDangerousCommand(command); blocked { + return map[string]interface{}{"error": reason, "status": "denied"}, nil + } + timeoutStr, _ := args["timeout"].(string) if timeoutStr == "" { timeoutStr = p.defaultTimeout @@ -239,3 +244,39 @@ func (p *Plugin) truncateOutput(s string) string { } return strings.TrimRight(s, "\n") } + +func isDangerousCommand(command string) (bool, string) { + pid := os.Getpid() + pidStr := fmt.Sprintf("%d", pid) + lower := strings.ToLower(command) + + dangerousPatterns := []string{ + "homed", + pidStr, + "systemctl stop homeagent", + "systemctl restart homeagent", + "systemctl kill homeagent", + "service homeagent stop", + "service homeagent restart", + } + + killPatterns := []string{"kill ", "killall ", "pkill ", "kill -", "kill -9"} + + for _, kp := range killPatterns { + if strings.Contains(lower, kp) { + for _, target := range dangerousPatterns { + if strings.Contains(lower, strings.ToLower(target)) { + return true, fmt.Sprintf("命令被拦截:禁止向 homed 进程(pid=%s)发送信号", pidStr) + } + } + } + } + + for _, dp := range dangerousPatterns[2:] { + if strings.Contains(lower, dp) { + return true, fmt.Sprintf("命令被拦截:禁止操作 homed 服务进程(pid=%s)", pidStr) + } + } + + return false, "" +}