fix: 彻底解决UDP插件阻塞导致扫描无法结束的问题

根因分析(通过 goroutine dump 定位):
1. UDP conn.Write 在 WSL2 上可能永久阻塞(SetDeadline 对 Write 不生效)
2. SNMP community 爆破混入通用密码字典(57个),串行 × 10s超时 = 10分钟

修复:
- 提取 udpProbe() 公共函数,用 context timeout + conn.Close 双保险
  超时后强制关闭连接,中断阻塞的 Write/Read
- BACnet/DNS/IPMI/TFTP 统一使用 udpProbe()
- SNMP probe 使用 goroutine + context select 保护
- SNMP community 列表不再混入通用密码字典(8个专用 community 足够)
- SNMP 后续 community 爆破用 3s 短超时 + 连续失败 3 次快速退出

效果: 同样的扫描从无限卡死 → 9秒完成
This commit is contained in:
ZacharyZcR
2026-06-14 22:23:50 +08:00
parent 4169eb6ee0
commit 04cae2e42d
7 changed files with 113 additions and 118 deletions
+3 -4
View File
@@ -95,13 +95,12 @@ func TestSNMPBuildersAndCommunityList(t *testing.T) {
}
cfg := common.NewConfig()
cfg.Credentials.Passwords = []string{"private", "custom", "public"}
communities := NewSNMPPlugin().buildCommunityList(cfg)
if !containsString(communities, "public") || !containsString(communities, "private") || !containsString(communities, "custom") {
if !containsString(communities, "public") || !containsString(communities, "private") {
t.Fatalf("community list missing expected entries: %v", communities)
}
if countString(communities, "public") != 1 || countString(communities, "private") != 1 {
t.Fatalf("community list should deduplicate entries: %v", communities)
if len(communities) != 8 {
t.Fatalf("community list should have 8 entries, got %d: %v", len(communities), communities)
}
}