目 录CONTENT

文章目录

腾讯混元Hy3对Go项目安全审计实战

过客
2026-05-03 / 0 评论 / 1 点赞 / 2 阅读 / 0 字

用过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.gorefuse() 函数

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中代码审计实测简单工程中表现还不错,达到实用水平。代码编程方面,对于简单的代码生成、补全、调试方面能稳定自动完成。

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区