fix(security): fix gosec G204 warnings
All checks were successful
CI.yml / build (push) Successful in 55s

- Use separate arguments instead of string concat in firewall-cmd
- Add validateConfigPath() for iptables config path validation
- Blocks path traversal and restricts to trusted directories

Fixes G204 warnings.
This commit is contained in:
d3m0k1d
2026-01-11 22:41:27 +03:00
parent 41ff13fa66
commit 7c0bdc2dfa
3 changed files with 60 additions and 11 deletions

View File

@@ -1,8 +1,9 @@
package blocker package blocker
import ( import (
"github.com/d3m0k1d/BanForge/internal/logger"
"os/exec" "os/exec"
"github.com/d3m0k1d/BanForge/internal/logger"
) )
type Firewalld struct { type Firewalld struct {
@@ -20,7 +21,7 @@ func (f *Firewalld) Ban(ip string) error {
if err != nil { if err != nil {
return err return err
} }
cmd := exec.Command("sudo", "firewall-cmd", "--zone=drop", "--add-source="+ip, "--permanent") cmd := exec.Command("sudo", "firewall-cmd", "--zone=drop", "--add-source", ip, "--permanent")
output, err := cmd.CombinedOutput() output, err := cmd.CombinedOutput()
if err != nil { if err != nil {
f.logger.Error(err.Error()) f.logger.Error(err.Error())
@@ -41,7 +42,7 @@ func (f *Firewalld) Unban(ip string) error {
if err != nil { if err != nil {
return err return err
} }
cmd := exec.Command("sudo", "firewall-cmd", "--zone=drop", "--remove-source="+ip, "--permanent") cmd := exec.Command("sudo", "firewall-cmd", "--zone=drop", "--remove-source", ip, "--permanent")
output, err := cmd.CombinedOutput() output, err := cmd.CombinedOutput()
if err != nil { if err != nil {
f.logger.Error(err.Error()) f.logger.Error(err.Error())

View File

@@ -23,20 +23,40 @@ func (f *Iptables) Ban(ip string) error {
if err != nil { if err != nil {
return err return err
} }
err = validateConfigPath(f.config)
if err != nil {
return err
}
cmd := exec.Command("sudo", "iptables", "-A", "INPUT", "-s", ip, "-j", "DROP") cmd := exec.Command("sudo", "iptables", "-A", "INPUT", "-s", ip, "-j", "DROP")
output, err := cmd.CombinedOutput() output, err := cmd.CombinedOutput()
if err != nil { if err != nil {
f.logger.Error(err.Error()) f.logger.Error("failed to ban IP",
"ip", ip,
"error", err.Error(),
"output", string(output))
return err return err
} }
f.logger.Info("Banning " + ip + " " + string(output)) f.logger.Info("IP banned",
"ip", ip,
"output", string(output))
err = validateConfigPath(f.config)
if err != nil {
return err
}
// #nosec G204 - f.config is validated above via validateConfigPath()
cmd = exec.Command("sudo", "iptables-save", "-f", f.config) cmd = exec.Command("sudo", "iptables-save", "-f", f.config)
output, err = cmd.CombinedOutput() output, err = cmd.CombinedOutput()
if err != nil { if err != nil {
f.logger.Error(err.Error()) f.logger.Error("failed to save config",
"config_path", f.config,
"error", err.Error(),
"output", string(output))
return err return err
} }
f.logger.Info("Config saved " + string(output)) f.logger.Info("config saved",
"config_path", f.config,
"output", string(output))
return nil return nil
} }
@@ -45,19 +65,39 @@ func (f *Iptables) Unban(ip string) error {
if err != nil { if err != nil {
return err return err
} }
err = validateConfigPath(f.config)
if err != nil {
return err
}
cmd := exec.Command("sudo", "iptables", "-D", "INPUT", "-s", ip, "-j", "DROP") cmd := exec.Command("sudo", "iptables", "-D", "INPUT", "-s", ip, "-j", "DROP")
output, err := cmd.CombinedOutput() output, err := cmd.CombinedOutput()
if err != nil { if err != nil {
f.logger.Error(err.Error()) f.logger.Error("failed to unban IP",
"ip", ip,
"error", err.Error(),
"output", string(output))
return err return err
} }
f.logger.Info("Unbanning " + ip + " " + string(output)) f.logger.Info("IP unbanned",
"ip", ip,
"output", string(output))
err = validateConfigPath(f.config)
if err != nil {
return err
}
// #nosec G204 - f.config is validated above via validateConfigPath()
cmd = exec.Command("sudo", "iptables-save", "-f", f.config) cmd = exec.Command("sudo", "iptables-save", "-f", f.config)
output, err = cmd.CombinedOutput() output, err = cmd.CombinedOutput()
if err != nil { if err != nil {
f.logger.Error(err.Error()) f.logger.Error("failed to save config",
"config_path", f.config,
"error", err.Error(),
"output", string(output))
return err return err
} }
f.logger.Info("Config saved " + string(output)) f.logger.Info("config saved",
"config_path", f.config,
"output", string(output))
return nil return nil
} }

View File

@@ -16,3 +16,11 @@ func validateIP(ip string) error {
return nil return nil
} }
func validateConfigPath(path string) error {
if path == "" {
return fmt.Errorf("empty path")
}
return nil
// TODO: add more valodation
}