优化自适应扫描系统 & 修复 POC 调度问题

自适应扫描优化:
- target/ceiling 分离,自适应池可向上探索而非锁死在 target
- assessHealth 阈值按网络环境区分(LAN 收紧 / Internet 放宽)
- RTT 漂移时动态压低 target,配合 AIMD 双重降速
- 去掉 semaphore 双层流控,由 ants pool 统一反压
- 探测端口从 3 个扩充到 8 个,减少 RTT 采样偏差
- computeRetries 按环境调整目标概率和上限

Bug 修复:
- AdaptivePool.Wait() 加 10 分钟超时,防止 goroutine 卡死时永久挂起
- CEL 环境初始化失败后允许重试(sync.Once → sync.Mutex + 标志位)
- CAS 自旋加 runtime.Gosched() 退避,减少高并发下 CPU 空转
- -full 模式下 web 插件跳过 IsMarkedWebService 检查 #588
- 不确定服务补做 HTTP 回退探测,覆盖自定义框架漏网场景
- POC sets 纯字面量值跳过 CEL 编译,消除大量误报错误日志
This commit is contained in:
ZacharyZcR
2026-06-14 22:23:48 +08:00
committed by ZacharyZcR
parent c49c23c7f0
commit 8402be98e3
15 changed files with 798 additions and 104 deletions
+26
View File
@@ -889,6 +889,12 @@ func evalset(env *cel.Env, variableMap map[string]interface{}, k string, express
// evalset1 执行CEL表达式的简化版本
func evalset1(env *cel.Env, variableMap map[string]interface{}, k string, expression string) (string, error) {
// 纯字面量字符串(无函数调用、运算符、变量引用)直接当值用,跳过 CEL 编译
// 避免 sets 中的 "sql"、"database" 等被当成 CEL 变量引用产生大量错误日志
if isPlainLiteral(expression, variableMap) {
variableMap[k] = expression
return expression, nil
}
out, err := Evaluate(env, expression, variableMap)
if err != nil {
variableMap[k] = expression
@@ -898,6 +904,26 @@ func evalset1(env *cel.Env, variableMap map[string]interface{}, k string, expres
return fmt.Sprintf("%v", variableMap[k]), err
}
// isPlainLiteral 判断表达式是否是纯字面量值(不需要 CEL 求值)
// 排除法:含 CEL 语法特征(括号、运算符、引号)的需要走 CEL,其余当字面量
func isPlainLiteral(expr string, variableMap map[string]interface{}) bool {
if expr == "" {
return false
}
// 如果是已声明的变量引用,必须走 CEL 求值
if _, exists := variableMap[expr]; exists {
return false
}
// 含 CEL 语法特征的需要走 CEL 编译
for _, c := range expr {
switch c {
case '(', ')', '[', ']', '+', '*', '%', '=', '!', '<', '>', '&', '|', '"', '\'', '?', ':':
return false
}
}
return true
}
// CheckInfoPoc 检查POC信息并返回别名
func CheckInfoPoc(infostr string) string {
for _, poc := range fingerprint.PocDatas {