用过Frp的小伙伴都知道,Frp服务器经常会被人扫描和暴力破解,然后几年前用go简单的写了一个自动封禁异常IP的小程序。今天拿来测试一下混元Hy3-Preview的代码安全审计功能,顺便休休Bug。
项目逻辑
- Github:https://github.com/zngw/frptables
- 逻辑:时实监听frps日志,解析出哪个IP尝试连接了,然后解析ip地址国家、省、市,再根据规则是否禁用,禁用的话直接调用系统防火墙(iptable、firewall等)封禁IP。
测试环境
- 工具:OpenClaw v2026.4.29
- 大模型:Tencent: Hy3 preview (由OpenRouter提供)
- Go版本:go v1.26.2
二、第一次审计:HTTP Reload 的 P0 漏洞
问题描述
当前想的是想参考nginx -s reload方式现配置重载功能,是通过 HTTP 接口触发的,逻辑大概是:
// 原代码(已删除)
http.HandleFunc("/reload", func(w http.ResponseWriter, r *http.Request) {
key := r.URL.Query().Get("key")
if key == "1ba5d2dd59cc478e" { // 硬编码密钥
ReloadConfig()
}
})
三个致命问题:
| 问题 | 风险 |
|---|---|
| 硬编码密钥 | 密钥直接写在代码里,代码泄露 = 完全失控 |
| 时间戳验证失效 | 原本有时间戳校验逻辑,但实现有 bug,形同虚设 |
| 无访问控制 | 任何能访问该端口的人都能触发重载 |
修复方案
让AI自己改了,直接废弃 HTTP reload,改用 Unix 信号机制:
// 启动时写入 PID 文件
func SavePID(pidFile string) error {
f, err := os.OpenFile(pidFile, os.O_CREATE|os.O_WRONLY, 0644)
if err != nil { return err }
defer f.Close()
fmt.Fprintf(f, "%d", os.Getpid())
return nil
}
// signal handler 中接收 SIGUSR1 触发重载
signal.Notify(config.ReloadChan, syscall.SIGUSR1)
go func() {
for range config.ReloadChan {
config.ReloadConfig()
}
}()
这样重载逻辑完全不暴露网络接口,P0 漏洞消除。
三、第二次审计:新发现的问题
Signal reload 修复很干净,但二审又挖出几个需要关注的点。
3.1 命令注入风险(P1)
位置:rules/rules.go → refuse() 函数
cmd = fmt.Sprintf("iptables -I INPUT -s %s -j DROP", ip)
// ip 直接拼接进 shell 命令字符串
虽然 IP 通常来自 frp 日志格式合规,但如果:
- 日志被篡改
- IP 解析逻辑有漏洞
- 将来支持域名配置
都可能引入命令注入。
修复建议:
// 1. 先验证 IP 格式
if net.ParseIP(ip) == nil {
log.Error("invalid IP: %s", ip)
return
}
// 2. 避免 shell,直接传参
exec.Command("iptables", "-I", "INPUT", "-s", ip, "-j", "DROP")
当时写的时候ipv6还不流行,后面又让AI补全了ipv6和ipv4地址添加到防火墙禁用。
3.2 HTTP 客户端无超时(P1)
调用了http方法获取ip的具体地址,直接使用了
client := &http.Client{} // 无超时
resp, err := client.Get("https://ip.zengwu.com.cn")
外部服务响应慢时会 goroutine 堆积,甚至拖垮整个进程。
修复建议:
client := &http.Client{Timeout: 5 * time.Second}
四、中等问题(P2)
错误处理忽略
多个位置 filepath.Abs() 的错误被忽略,路径无效时静默失败:
filepath.Abs(path) // 错误被吞掉
日志不统一
主代码用 github.com/zngw/golib/log,但 config/reload_unix.go 里用 fmt.Println,日志收集会乱。
五、修复优先级汇总
| 优先级 | 问题 | 影响 | 建议 |
|---|---|---|---|
| P1 | 命令注入 | 高 | 验证 IP + 避免 shell |
| P1 | HTTP 无超时 | 中 | 加 Timeout |
| P2 | 错误处理忽略 | 低 | 补充日志 |
| P2 | 日志不统一 | 低 | 统一日志库 |
六、总结
Tencent: Hy3 preview在OpenClaw中代码审计实测简单工程中表现还不错,达到实用水平。代码编程方面,对于简单的代码生成、补全、调试方面能稳定自动完成。
评论区