mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-26 05:01:53 +08:00
fix: 修复 Hub 广播 data race 和端口扫描潜在死锁,清理死代码
- hub.go: broadcast 路径 RLock 改 Lock,修复并发 delete/close 竞争 - port_scan.go: pool.Invoke 失败时释放 wg 和 semaphore,防止死锁 - web_scanner.go: 删除只写不读的 fingerprintCache - webtitle.go: 移除对已删除 SetFingerprints 的调用 - keylogger.go: 删除未使用的 stopChan 和 isRunning 字段
This commit is contained in:
+4
-1
@@ -252,7 +252,10 @@ func slidingWindowSchedule(iter *SocketIterator, pool *AdaptivePool, wg *sync.Wa
|
|||||||
port: port,
|
port: port,
|
||||||
semaphore: semaphore,
|
semaphore: semaphore,
|
||||||
}
|
}
|
||||||
_ = pool.Invoke(task)
|
if err := pool.Invoke(task); err != nil {
|
||||||
|
<-semaphore
|
||||||
|
wg.Done()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 等待所有任务完成
|
// 等待所有任务完成
|
||||||
|
|||||||
@@ -276,30 +276,6 @@ func IsMarkedWebService(host string, port int) bool {
|
|||||||
return exists
|
return exists
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===============================
|
|
||||||
// 指纹缓存
|
|
||||||
// ===============================
|
|
||||||
|
|
||||||
// 指纹缓存 - 存储 host:port → 指纹列表的映射
|
|
||||||
var (
|
|
||||||
fingerprintCache = make(map[string][]string)
|
|
||||||
fingerprintCacheMutex sync.RWMutex
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetFingerprints 存储目标的指纹信息
|
|
||||||
func SetFingerprints(host string, port int, fingerprints []string) {
|
|
||||||
if len(fingerprints) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
cacheKey := fmt.Sprintf("%s:%d", host, port)
|
|
||||||
|
|
||||||
fingerprintCacheMutex.Lock()
|
|
||||||
defer fingerprintCacheMutex.Unlock()
|
|
||||||
|
|
||||||
fingerprintCache[cacheKey] = fingerprints
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===============================
|
// ===============================
|
||||||
// Web扫描策略
|
// Web扫描策略
|
||||||
// ===============================
|
// ===============================
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ import (
|
|||||||
// - 保持原有功能逻辑
|
// - 保持原有功能逻辑
|
||||||
type KeyloggerPlugin struct {
|
type KeyloggerPlugin struct {
|
||||||
plugins.BasePlugin
|
plugins.BasePlugin
|
||||||
isRunning bool
|
|
||||||
stopChan chan struct{}
|
|
||||||
keyBuffer []string
|
keyBuffer []string
|
||||||
bufferMutex sync.RWMutex
|
bufferMutex sync.RWMutex
|
||||||
}
|
}
|
||||||
@@ -33,7 +31,6 @@ type KeyloggerPlugin struct {
|
|||||||
func NewKeyloggerPlugin() *KeyloggerPlugin {
|
func NewKeyloggerPlugin() *KeyloggerPlugin {
|
||||||
return &KeyloggerPlugin{
|
return &KeyloggerPlugin{
|
||||||
BasePlugin: plugins.NewBasePlugin("keylogger"),
|
BasePlugin: plugins.NewBasePlugin("keylogger"),
|
||||||
stopChan: make(chan struct{}),
|
|
||||||
keyBuffer: make([]string, 0),
|
keyBuffer: make([]string, 0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,10 +97,6 @@ func (p *KeyloggerPlugin) Scan(ctx context.Context, info *common.HostInfo, confi
|
|||||||
|
|
||||||
// startKeylogging 启动键盘记录
|
// startKeylogging 启动键盘记录
|
||||||
func (p *KeyloggerPlugin) startKeylogging(ctx context.Context, outputFile string) error {
|
func (p *KeyloggerPlugin) startKeylogging(ctx context.Context, outputFile string) error {
|
||||||
p.isRunning = true
|
|
||||||
defer func() {
|
|
||||||
p.isRunning = false
|
|
||||||
}()
|
|
||||||
|
|
||||||
// 根据平台启动相应的键盘记录
|
// 根据平台启动相应的键盘记录
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
@@ -192,11 +192,6 @@ func (p *WebTitlePlugin) identifyFingerprintsMulti(info *common.HostInfo, baseUR
|
|||||||
// 调用指纹识别
|
// 调用指纹识别
|
||||||
fingerprints := WebScan.InfoCheck(baseURL, &checkDataList)
|
fingerprints := WebScan.InfoCheck(baseURL, &checkDataList)
|
||||||
|
|
||||||
// 存入缓存
|
|
||||||
if len(fingerprints) > 0 {
|
|
||||||
core.SetFingerprints(info.Host, info.Port, fingerprints)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 非全量模式下,基于指纹触发POC扫描
|
// 非全量模式下,基于指纹触发POC扫描
|
||||||
if !config.POC.Full && !config.POC.Disabled {
|
if !config.POC.Full && !config.POC.Disabled {
|
||||||
p.triggerPocScan(info, fingerprints, config)
|
p.triggerPocScan(info, fingerprints, config)
|
||||||
|
|||||||
+2
-2
@@ -97,7 +97,7 @@ func (h *Hub) Run() {
|
|||||||
h.mu.Unlock()
|
h.mu.Unlock()
|
||||||
|
|
||||||
case message := <-h.broadcast:
|
case message := <-h.broadcast:
|
||||||
h.mu.RLock()
|
h.mu.Lock()
|
||||||
for client := range h.clients {
|
for client := range h.clients {
|
||||||
select {
|
select {
|
||||||
case client.send <- message:
|
case client.send <- message:
|
||||||
@@ -106,7 +106,7 @@ func (h *Hub) Run() {
|
|||||||
delete(h.clients, client)
|
delete(h.clients, client)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
h.mu.RUnlock()
|
h.mu.Unlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user