From 17ac5ebbd3cb34b3f0828eaf8080bd36623ff415 Mon Sep 17 00:00:00 2001 From: samwaf Date: Mon, 15 Jun 2026 17:00:35 +0800 Subject: [PATCH] feat:add light ai model #827 --- api/entrance.go | 4 + api/waf_ai_api.go | 423 ++++++++++ cmd/samwaf/main.go | 13 + global/config.go | 28 +- global/global.go | 2 + go.mod | 1 + go.sum | 2 + innerbean/web_log.go | 99 +-- model/hosts.go | 2 + model/request/waf_ai_req.go | 58 ++ model/response/waf_ai_resp.go | 48 ++ model/waf_log_label_mark.go | 25 + router/entrance.go | 1 + router/waf_ai_router.go | 32 + service/waf_service/waf_ai_label_service.go | 316 ++++++++ service/waf_service/waf_ai_service.go | 92 +++ wafai/engine.go | 14 + wafai/engine_gbdt.go | 38 + wafai/engine_onnx_stub.go | 11 + wafai/features.go | 394 +++++++++ wafai/features_test.go | 115 +++ wafai/labeling.go | 102 +++ wafai/manager.go | 120 +++ wafai/modelpack.go | 150 ++++ wafai/modelpack_test.go | 68 ++ wafai/testdata/feature_golden.json | 853 ++++++++++++++++++++ wafai/testdata/sample_model.swai | Bin 0 -> 265546 bytes wafai/testhelper_test.go | 33 + wafdb/migrations_core.go | 48 ++ wafdb/migrations_log.go | 40 + wafenginecore/checkai.go | 81 ++ wafenginecore/wafengine.go | 11 + wafmangeweb/localserver.go | 2 + waftask/task_config.go | 14 + 34 files changed, 3179 insertions(+), 61 deletions(-) create mode 100644 api/waf_ai_api.go create mode 100644 model/request/waf_ai_req.go create mode 100644 model/response/waf_ai_resp.go create mode 100644 model/waf_log_label_mark.go create mode 100644 router/waf_ai_router.go create mode 100644 service/waf_service/waf_ai_label_service.go create mode 100644 service/waf_service/waf_ai_service.go create mode 100644 wafai/engine.go create mode 100644 wafai/engine_gbdt.go create mode 100644 wafai/engine_onnx_stub.go create mode 100644 wafai/features.go create mode 100644 wafai/features_test.go create mode 100644 wafai/labeling.go create mode 100644 wafai/manager.go create mode 100644 wafai/modelpack.go create mode 100644 wafai/modelpack_test.go create mode 100644 wafai/testdata/feature_golden.json create mode 100644 wafai/testdata/sample_model.swai create mode 100644 wafai/testhelper_test.go create mode 100644 wafenginecore/checkai.go diff --git a/api/entrance.go b/api/entrance.go index 9bf5d0f..7e856a1 100644 --- a/api/entrance.go +++ b/api/entrance.go @@ -61,6 +61,7 @@ type APIGroup struct { WafOwaspApi WafHostPathRuleApi WafAppApi + WafAIApi } var APIGroupAPP = new(APIGroup) @@ -113,6 +114,9 @@ var ( wafAnalysisService = waf_service.WafAnalysisServiceApp + wafAIService = waf_service.WafAIServiceApp + wafAILabelService = waf_service.WafAILabelServiceApp + wafPrivateInfoService = waf_service.WafPrivateInfoServiceApp wafPrivateGroupService = waf_service.WafPrivateGroupServiceApp wafCacheRuleService = waf_service.WafCacheRuleServiceApp diff --git a/api/waf_ai_api.go b/api/waf_ai_api.go new file mode 100644 index 0000000..153aa41 --- /dev/null +++ b/api/waf_ai_api.go @@ -0,0 +1,423 @@ +package api + +import ( + "SamWaf/global" + "SamWaf/innerbean" + "SamWaf/model/common/response" + "SamWaf/model/request" + "SamWaf/utils" + "SamWaf/wafai" + "encoding/json" + "fmt" + "io" + "net/url" + "os" + "path/filepath" + "strings" + "sync/atomic" + "time" + + "github.com/gin-gonic/gin" +) + +type WafAIApi struct { +} + +const ( + aiModelDir = "ai_model" + aiModelFile = "current.swai" + aiExportDir = "ai_export" + maxAIModelUpload = 64 * 1024 * 1024 // 模型包上传上限 64MB + defaultExportMax = 200000 // 默认最多导出条数 +) + +// aiStatusResp AI 检测状态响应 +type aiStatusResp struct { + GlobalEnable int64 `json:"global_enable"` // 全局总开关 + Mode string `json:"mode"` // observe / block + ModelLoaded bool `json:"model_loaded"` // 当前是否已加载模型 + FeatureVersion string `json:"feature_version"` // 引擎特征版本 + Manifest *wafai.Manifest `json:"manifest"` // 当前模型元数据(未加载为 null) +} + +// GetAIStatusApi 获取 AI 检测状态与当前模型信息 +func (w *WafAIApi) GetAIStatusApi(c *gin.Context) { + resp := aiStatusResp{ + GlobalEnable: global.GCONFIG_AI_ENABLE, + Mode: global.GCONFIG_AI_MODE, + FeatureVersion: wafai.FeatureVersion, + } + if global.GWAF_AI_DETECTOR != nil { + if m, ok := global.GWAF_AI_DETECTOR.CurrentManifest(); ok { + resp.ModelLoaded = true + resp.Manifest = &m + } + } + response.OkWithData(resp, c) +} + +// UploadAIModelApi 上传 .swai 模型包:校验 -> 热加载 -> 持久化 +func (w *WafAIApi) UploadAIModelApi(c *gin.Context) { + if global.GWAF_AI_DETECTOR == nil { + response.FailWithMessage("AI检测器未初始化", c) + return + } + file, err := c.FormFile("file") + if err != nil { + response.FailWithMessage("文件上传失败: "+err.Error(), c) + return + } + if strings.ToLower(filepath.Ext(file.Filename)) != ".swai" { + response.FailWithMessage("不支持的文件类型,仅支持 .swai 模型包", c) + return + } + if file.Size > maxAIModelUpload { + response.FailWithMessage("模型包过大(上限 64MB)", c) + return + } + + src, err := file.Open() + if err != nil { + response.FailWithMessage("打开上传文件失败: "+err.Error(), c) + return + } + defer src.Close() + data, err := io.ReadAll(io.LimitReader(src, maxAIModelUpload+1)) + if err != nil { + response.FailWithMessage("读取上传文件失败: "+err.Error(), c) + return + } + if int64(len(data)) > maxAIModelUpload { + response.FailWithMessage("模型包过大(上限 64MB)", c) + return + } + + // 先校验+热加载到内存(含特征版本/sha256/zip 安全校验),通过后再落盘 + manifest, err := global.GWAF_AI_DETECTOR.LoadFromBytes(data) + if err != nil { + response.FailWithMessage("模型校验失败: "+err.Error(), c) + return + } + + // 持久化到 data/ai_model/current.swai(原子替换),供下次启动加载 + dir := filepath.Join(utils.GetCurrentDir(), "data", aiModelDir) + if err = os.MkdirAll(dir, 0750); err != nil { + response.FailWithMessage("创建模型目录失败: "+err.Error(), c) + return + } + finalPath := filepath.Join(dir, aiModelFile) + tmpPath := finalPath + ".tmp" + if err = os.WriteFile(tmpPath, data, 0640); err != nil { + response.FailWithMessage("保存模型文件失败: "+err.Error(), c) + return + } + if err = os.Rename(tmpPath, finalPath); err != nil { + _ = os.Remove(tmpPath) + response.FailWithMessage("替换模型文件失败: "+err.Error(), c) + return + } + + response.OkWithDetailed(manifest, "模型上传并加载成功", c) +} + +// ReloadAIModelApi 从磁盘重新加载当前模型 +func (w *WafAIApi) ReloadAIModelApi(c *gin.Context) { + if global.GWAF_AI_DETECTOR == nil { + response.FailWithMessage("AI检测器未初始化", c) + return + } + path := filepath.Join(utils.GetCurrentDir(), "data", aiModelDir, aiModelFile) + if _, err := os.Stat(path); err != nil { + response.FailWithMessage("没有可加载的模型文件,请先上传", c) + return + } + manifest, err := global.GWAF_AI_DETECTOR.LoadFromFile(path) + if err != nil { + response.FailWithMessage("模型加载失败: "+err.Error(), c) + return + } + response.OkWithDetailed(manifest, "模型重新加载成功", c) +} + +// UnloadAIModelApi 卸载当前模型(不删除磁盘文件) +func (w *WafAIApi) UnloadAIModelApi(c *gin.Context) { + if global.GWAF_AI_DETECTOR != nil { + global.GWAF_AI_DETECTOR.Unload() + } + response.OkWithMessage("模型已卸载", c) +} + +// GetAIDashboardApi AI检测看板:按类别汇总 + 分数分布 + observe/block 趋势 +func (w *WafAIApi) GetAIDashboardApi(c *gin.Context) { + var req request.WafAIDashboardReq + _ = c.ShouldBindJSON(&req) + response.OkWithData(wafAIService.DashboardApi(req), c) +} + +// MarkLabelApi 标记某条日志的训练标签修正(误报→正常 / 确认攻击 / 忽略) +func (w *WafAIApi) MarkLabelApi(c *gin.Context) { + var req request.WafAILabelMarkReq + if err := c.ShouldBindJSON(&req); err != nil { + response.FailWithMessage("参数错误: "+err.Error(), c) + return + } + if err := wafAILabelService.MarkApi(req); err != nil { + response.FailWithMessage("标记失败: "+err.Error(), c) + return + } + response.OkWithMessage("标记成功", c) +} + +// UnmarkLabelApi 取消某条日志的标记 +func (w *WafAIApi) UnmarkLabelApi(c *gin.Context) { + var req request.WafAILabelUnmarkReq + if err := c.ShouldBindJSON(&req); err != nil { + response.FailWithMessage("参数错误: "+err.Error(), c) + return + } + if err := wafAILabelService.UnmarkApi(req.ReqUuid); err != nil { + response.FailWithMessage("取消标记失败: "+err.Error(), c) + return + } + response.OkWithMessage("已取消标记", c) +} + +// LabelByUuidsApi 按 req_uuid 批量查询标记状态(日志列表回显用) +func (w *WafAIApi) LabelByUuidsApi(c *gin.Context) { + var req request.WafAILabelByUuidsReq + _ = c.ShouldBindJSON(&req) + response.OkWithData(wafAILabelService.GetMapByUuidsApi(req.ReqUuids), c) +} + +// LabelListApi 标注工作台列表:AI 命中分页 + 标记状态过滤/回显 +func (w *WafAIApi) LabelListApi(c *gin.Context) { + var req request.WafAILabelListReq + _ = c.ShouldBindJSON(&req) + response.OkWithData(wafAILabelService.ListApi(req), c) +} + +// BatchMarkLabelApi 批量标记训练标签(误报→正常 / 确认攻击 / 忽略) +func (w *WafAIApi) BatchMarkLabelApi(c *gin.Context) { + var req request.WafAILabelBatchMarkReq + if err := c.ShouldBindJSON(&req); err != nil { + response.FailWithMessage("参数错误: "+err.Error(), c) + return + } + n, err := wafAILabelService.BatchMarkApi(req) + if err != nil { + response.FailWithMessage(fmt.Sprintf("批量标记失败(已处理%d条): %s", n, err.Error()), c) + return + } + response.OkWithMessage(fmt.Sprintf("已标记 %d 条", n), c) +} + +// BatchUnmarkLabelApi 批量取消标记 +func (w *WafAIApi) BatchUnmarkLabelApi(c *gin.Context) { + var req request.WafAILabelBatchUnmarkReq + if err := c.ShouldBindJSON(&req); err != nil { + response.FailWithMessage("参数错误: "+err.Error(), c) + return + } + n, err := wafAILabelService.BatchUnmarkApi(req.ReqUuids) + if err != nil { + response.FailWithMessage("批量取消标记失败: "+err.Error(), c) + return + } + response.OkWithMessage(fmt.Sprintf("已取消 %d 条标记", n), c) +} + +// trainSample 导出的训练样本(字段名与 SamWafAI samwafai/data/sample.py 对齐) +type trainSample struct { + Method string `json:"method"` + Path string `json:"path"` + Query string `json:"query"` + Body string `json:"body"` + UserAgent string `json:"user_agent"` + Label int `json:"label"` + AttackType string `json:"attack_type"` + Source string `json:"source"` +} + +// ExportTrainDataApi 导出脱敏训练数据为 JSONL,落到 data/ai_export/ 供本地训练 +// aiExportRunning 导出任务并发保护:同一时刻只允许一个导出在跑 +var aiExportRunning int32 + +func (w *WafAIApi) ExportTrainDataApi(c *gin.Context) { + var req request.WafAIExportReq + _ = c.ShouldBindJSON(&req) + maxCount := req.MaxCount + if maxCount <= 0 || maxCount > defaultExportMax { + maxCount = defaultExportMax + } + + if global.GWAF_LOCAL_LOG_DB == nil { + response.FailWithMessage("日志库未初始化", c) + return + } + + // 导出是耗时操作(大表查询 + 逐行脱敏写盘),异步执行避免请求超时; + // 完成/失败通过 OpResultMessageInfo 推送到管理端通知中心。 + if !atomic.CompareAndSwapInt32(&aiExportRunning, 0, 1) { + response.FailWithMessage("已有导出任务正在进行,请等待完成", c) + return + } + + go func() { + defer atomic.StoreInt32(&aiExportRunning, 0) + outPath, nAttack, nNormal, nDrop, _, err := runAIExport(req, maxCount) + serverName := global.GWAF_CUSTOM_SERVER_NAME + if err != nil { + global.GQEQUE_MESSAGE_DB.Enqueue(innerbean.OpResultMessageInfo{ + BaseMessageInfo: innerbean.BaseMessageInfo{OperaType: "AI训练数据导出", Server: serverName}, + Msg: "AI训练数据导出失败:" + err.Error(), + Success: "false", + }) + return + } + global.GQEQUE_MESSAGE_DB.Enqueue(innerbean.OpResultMessageInfo{ + BaseMessageInfo: innerbean.BaseMessageInfo{OperaType: "AI训练数据导出", Server: serverName}, + Msg: fmt.Sprintf("AI训练数据导出完毕:%s(写入%d条,攻击%d/正常%d,已忽略%d)", + outPath, nAttack+nNormal, nAttack, nNormal, nDrop), + Success: "true", + }) + }() + + response.OkWithMessage("导出任务已开始,完成后会在通知中心提示,文件生成在服务器 data/ai_export/ 目录", c) +} + +// runAIExport 实际执行训练数据导出,返回文件路径与各类计数。 +func runAIExport(req request.WafAIExportReq, maxCount int) (outPath string, nAttack, nNormal, nDrop, total int, err error) { + query := global.GWAF_LOCAL_LOG_DB.Model(&innerbean.WebLog{}). + Select("REQ_UUID", "METHOD", "URL", "RawQuery", "BODY", "POST_FORM", "USER_AGENT", "ACTION", "RULE", "LogOnlyMode") + if req.Days > 0 { + cutoff := time.Now().AddDate(0, 0, -req.Days).Format("2006-01-02 15:04:05") + query = query.Where("create_time >= ?", cutoff) + } + + var rows []innerbean.WebLog + if err = query.Order("unix_add_time desc").Limit(maxCount).Find(&rows).Error; err != nil { + return "", 0, 0, 0, 0, fmt.Errorf("查询日志失败: %w", err) + } + total = len(rows) + + dir := filepath.Join(utils.GetCurrentDir(), "data", aiExportDir) + if err = os.MkdirAll(dir, 0750); err != nil { + return "", 0, 0, 0, total, fmt.Errorf("创建导出目录失败: %w", err) + } + outPath = filepath.Join(dir, fmt.Sprintf("train_%s.jsonl", time.Now().Format("20060102_150405"))) + fh, ferr := os.OpenFile(outPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0640) + if ferr != nil { + return "", 0, 0, 0, total, fmt.Errorf("创建导出文件失败: %w", ferr) + } + defer fh.Close() + enc := json.NewEncoder(fh) + + // 一次性加载人工标记(含请求快照),人工修正优先于规则弱标签 + marks := wafAILabelService.GetAllFull() + + // 1) 过滤窗口内的日志:仅处理"未人工标记"的(已标记的统一在第2步从快照产出, + // 确保人工修正不会被时间/条数条件漏掉) + for i := range rows { + r := &rows[i] + if _, marked := marks[r.REQ_UUID]; marked { + continue + } + verdict, at := wafai.WeakLabel(r.ACTION, r.RULE, r.LogOnlyMode) + if verdict == wafai.VerdictDrop { + nDrop++ + continue + } + label := 0 + attackType := "" + if verdict == wafai.VerdictAttack { + // 仅信任高置信检测器(libinjection/OWASP)的攻击标签; + // 低置信(scan/rce/traversal 等)未经人工确认则丢弃,避免规则误报污染训练 + if !wafai.IsHighConfidenceAttackType(at) { + nDrop++ + continue + } + label = 1 + attackType = at + } + path, rawQuery := splitURL(r.URL, r.RawQuery) + body := r.BODY + if body == "" { + body = r.POST_FORM + } + if label == 1 { + nAttack++ + } else { + nNormal++ + } + s := trainSample{ + Method: strings.ToUpper(r.METHOD), + Path: path, + Query: desensitizeForExport(rawQuery), + Body: desensitizeForExport(body), + UserAgent: r.USER_AGENT, + Label: label, + AttackType: attackType, + Source: "samwaf_log", + } + if err = enc.Encode(&s); err != nil { + return outPath, nAttack, nNormal, nDrop, total, fmt.Errorf("写入导出文件失败: %w", err) + } + } + + // 2) 全部人工标记从快照产出,不受时间/条数条件限制(连原始日志被清理也能产出) + for _, m := range marks { + if m.Mark == "ignore" { + nDrop++ + continue + } + label := 0 + if m.Mark == "attack" { + label = 1 + } + path, rawQuery := splitURL(m.URL, m.RAW_QUERY) + if label == 1 { + nAttack++ + } else { + nNormal++ + } + s := trainSample{ + Method: strings.ToUpper(m.METHOD), + Path: path, + Query: desensitizeForExport(rawQuery), + Body: desensitizeForExport(m.BODY), + UserAgent: m.USER_AGENT, + Label: label, + AttackType: m.AttackType, + Source: "manual", + } + if err = enc.Encode(&s); err != nil { + return outPath, nAttack, nNormal, nDrop, total, fmt.Errorf("写入导出文件失败: %w", err) + } + } + return outPath, nAttack, nNormal, nDrop, total, nil +} + +// splitURL 将 URL 拆为 path 与 query;优先用已有的 RawQuery +func splitURL(rawURL, rawQuery string) (string, string) { + path := rawURL + if rawQuery == "" { + if u, err := url.Parse(rawURL); err == nil { + path = u.Path + rawQuery = u.RawQuery + } + } else if idx := strings.IndexByte(rawURL, '?'); idx >= 0 { + path = rawURL[:idx] + } + if path == "" { + path = "/" + } + return path, rawQuery +} + +// desensitizeForExport 导出前再做一次脱敏(复用 godlp 引擎),避免敏感参数值随训练数据外泄 +func desensitizeForExport(s string) string { + if s == "" || global.GWAF_DLP == nil { + return s + } + return utils.DeSenText(s) +} diff --git a/cmd/samwaf/main.go b/cmd/samwaf/main.go index 8d7c214..c07b2f4 100644 --- a/cmd/samwaf/main.go +++ b/cmd/samwaf/main.go @@ -14,6 +14,7 @@ import ( "SamWaf/model/wafenginmodel" "SamWaf/plugin" "SamWaf/utils" + "SamWaf/wafai" "SamWaf/wafappengine" "SamWaf/wafconfig" "SamWaf/wafdb" @@ -263,6 +264,18 @@ func (m *wafSystenService) run() { global.GWAF_DLP_CONFIG = ldpConfig global.GWAF_REG_PUBLIC_KEY = publicKey + //初始化AI智能检测器,若存在已上传的模型包则加载(失败安全,不影响启动) + global.GWAF_AI_DETECTOR = wafai.NewDetector() + aiModelPath := filepath.Join(utils.GetCurrentDir(), "data", "ai_model", "current.swai") + if _, err := os.Stat(aiModelPath); err == nil { + if manifest, err := global.GWAF_AI_DETECTOR.LoadFromFile(aiModelPath); err != nil { + zlog.Warn("AI模型加载失败,AI检测将不可用: ", err.Error()) + } else { + zlog.Info(fmt.Sprintf("AI模型加载成功: version=%s feature=%s type=%s", + manifest.ModelVersion, manifest.FeatureVersion, manifest.ModelType)) + } + } + //owasp资源 释放 err = wafinit.CheckAndReleaseDataset(owaspAssets, utils.GetCurrentDir()+"/data/owasp", "owasp") if err != nil { diff --git a/global/config.go b/global/config.go index 10967b7..13c575a 100644 --- a/global/config.go +++ b/global/config.go @@ -28,18 +28,22 @@ var ( GCONFIG_ENABLE_STRICT_IP_BINDING int64 = 1 // 是否启用严格IP绑定 1启用 0禁用 GCONFIG_ENABLE_REPLAY_PROTECT int64 = 1 // 防重放攻击开关 1启用 0禁用 - GCONFIG_RECORD_ENABLE_OWASP int64 = 0 //启动OWASP数据检测 - GCONFIG_OWASP_MODE string = "DetectionOnly" //OWASP 检测引擎工作模式: On(拦截) / DetectionOnly(观察/仅记录) / Off(关闭) - GCONFIG_OWASP_BLOCK_THRESHOLD int64 = 7 //OWASP 入站 anomaly score 阈值(官方默认 5,我们宽松到 7) - GCONFIG_RECORD_ENABLE_HTTP_80 int64 = 0 //启动80端口服务(为自动申请证书使用 HTTP文件验证类型,DNS验证不需要) - GCONFIG_RECORD_SSLOrder_EXPIRE_DAY int64 = 30 // 提前多少天进行自动申请 - GCONFIG_RECORD_SSL_IP_CERT_IP string = "" // 获取IP证书时的IP地址 - GCONFIG_RECORD_SSL_IP_EXPIRE_DAY int64 = 3 // IP证书提前多少天进行自动申请 - GCONFIG_RECORD_SSLHTTP_CHECK int64 = 0 // ssl申请文件验证类型 是否校验原始路径HTTP响应代码 1 校验 0 不校验 - GCONFIG_RECORD_SSLMinVerson string = "TLS 1.2" // ssl最低版本 - GCONFIG_RECORD_SSLMaxVerson string = "TLS 1.3" // ssl最大版本 - GCONFIG_RECORD_CONNECT_TIME_OUT int64 = 30 // 连接超时 默认30s - GCONFIG_RECORD_KEEPALIVE_TIME_OUT int64 = 30 // 保持活动超时 默认30s + GCONFIG_RECORD_ENABLE_OWASP int64 = 0 //启动OWASP数据检测 + GCONFIG_OWASP_MODE string = "DetectionOnly" //OWASP 检测引擎工作模式: On(拦截) / DetectionOnly(观察/仅记录) / Off(关闭) + + GCONFIG_AI_ENABLE int64 = 0 //AI智能检测总开关 1启用 0关闭(需先在AI模型管理上传模型包) + GCONFIG_AI_MODE string = "observe" //AI检测工作模式: observe(仅记录/观察) / block(达到拦截阈值则拦截) + + GCONFIG_OWASP_BLOCK_THRESHOLD int64 = 7 //OWASP 入站 anomaly score 阈值(官方默认 5,我们宽松到 7) + GCONFIG_RECORD_ENABLE_HTTP_80 int64 = 0 //启动80端口服务(为自动申请证书使用 HTTP文件验证类型,DNS验证不需要) + GCONFIG_RECORD_SSLOrder_EXPIRE_DAY int64 = 30 // 提前多少天进行自动申请 + GCONFIG_RECORD_SSL_IP_CERT_IP string = "" // 获取IP证书时的IP地址 + GCONFIG_RECORD_SSL_IP_EXPIRE_DAY int64 = 3 // IP证书提前多少天进行自动申请 + GCONFIG_RECORD_SSLHTTP_CHECK int64 = 0 // ssl申请文件验证类型 是否校验原始路径HTTP响应代码 1 校验 0 不校验 + GCONFIG_RECORD_SSLMinVerson string = "TLS 1.2" // ssl最低版本 + GCONFIG_RECORD_SSLMaxVerson string = "TLS 1.3" // ssl最大版本 + GCONFIG_RECORD_CONNECT_TIME_OUT int64 = 30 // 连接超时 默认30s + GCONFIG_RECORD_KEEPALIVE_TIME_OUT int64 = 30 // 保持活动超时 默认30s //GCONFIG_RECORD_PATCH_VERSION_CORE int64 = 20250106 // 核心数据库补丁日期 //GCONFIG_RECORD_PATCH_VERSION_LOG int64 = 20250106 // 日志数据库补丁日期 GCONFIG_RECORD_ALL_SRC_BYTE_INFO int64 = 0 //记录原始信息(默认不开启) diff --git a/global/global.go b/global/global.go index 78c5ef5..617bd0f 100644 --- a/global/global.go +++ b/global/global.go @@ -7,6 +7,7 @@ import ( "SamWaf/iplocation" "SamWaf/model" "SamWaf/model/spec" + "SamWaf/wafai" "SamWaf/wafnotify" "SamWaf/wafowasp" "SamWaf/wafsnowflake" @@ -99,6 +100,7 @@ var ( GWAF_APP_OP_PASSWORD string //应用操作密码(高危操作二次确认,自动生成存 config.yml) GWAF_DLP dlpheader.EngineAPI // 脱敏引擎 GWAF_DLP_CONFIG string // 脱敏引擎配置数据 + GWAF_AI_DETECTOR *wafai.Detector // AI智能检测器(持有当前模型,失败安全) GWAF_OWASP *wafowasp.WafOWASP //owasp引擎(兼容保留:由 GWAF_OWASP_MANAGER.Current() 更新;请勿直接赋值新实例,否则热重载会失效) GWAF_OWASP_MANAGER *wafowasp.OwaspManager //owasp 管理器(支持热重载) diff --git a/go.mod b/go.mod index 9d63ffa..9c3316f 100644 --- a/go.mod +++ b/go.mod @@ -80,6 +80,7 @@ require ( github.com/cloudwego/base64x v0.1.6 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dmitryikh/leaves v0.0.0-20230708180554-25d19a787328 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.16.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect diff --git a/go.sum b/go.sum index 3e54055..b0c0d17 100644 --- a/go.sum +++ b/go.sum @@ -111,6 +111,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= +github.com/dmitryikh/leaves v0.0.0-20230708180554-25d19a787328 h1:ht/zhLOAy9iiEKTKGkXvpw92Z7O6NK0bIVZVREy0kIE= +github.com/dmitryikh/leaves v0.0.0-20230708180554-25d19a787328/go.mod h1:wzMig9tMIJB8HsxXHppa9yRPo8BpO0eBM/Z4xnaohCQ= github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= diff --git a/innerbean/web_log.go b/innerbean/web_log.go index 00f5d13..9386ff8 100644 --- a/innerbean/web_log.go +++ b/innerbean/web_log.go @@ -3,55 +3,56 @@ package innerbean import "strings" type WebLog struct { - WafInnerDFlag string `gorm:"size:10" json:"waf_inner_dflag"` //日志队列处理方式 - HOST string `gorm:"size:255" json:"host"` - URL string `gorm:"type:text" json:"url"` - RawQuery string `gorm:"type:text" json:"raw_query"` //原始URL查询 - REFERER string `gorm:"type:text" json:"referer"` - USER_AGENT string `gorm:"size:500" json:"user_agent"` - METHOD string `gorm:"size:20" json:"method"` - HEADER string `gorm:"type:text" json:"header"` - SRC_IP string `gorm:"size:64" json:"src_ip"` - SRC_PORT string `gorm:"size:10" json:"src_port"` - COUNTRY string `gorm:"size:100" json:"country"` - PROVINCE string `gorm:"size:100" json:"province"` - CITY string `gorm:"size:100" json:"city"` - CREATE_TIME string `gorm:"size:32;index:idx_weblog_time" json:"create_time"` - CONTENT_LENGTH int64 `json:"content_length"` - RES_CONTENT_LENGTH int64 `json:"res_content_length"` //响应内容大小(字节) - COOKIES string `gorm:"type:text" json:"cookies"` - BODY string `gorm:"type:text" json:"body"` - REQ_UUID string `gorm:"size:64" json:"req_uuid"` - USER_CODE string `gorm:"size:64;index" json:"user_code"` - TenantId string `gorm:"size:64;index" json:"tenant_id"` //租户ID(主要键) - HOST_CODE string `gorm:"size:64" json:"host_code"` //主机ID (主要键) - Day int `json:"day"` //日 (主要键) - ACTION string `gorm:"size:100" json:"action"` - RULE string `gorm:"type:text" json:"rule"` - STATUS string `gorm:"size:50" json:"status"` //状态 - STATUS_CODE int `json:"status_code"` //状态编码 - RES_BODY string `gorm:"type:text" json:"res_body"` //返回信息 - POST_FORM string `gorm:"type:text" json:"post_form"` //提交的表单数据 - TASK_FLAG int `json:"task_flag" gorm:"default:-1;index"` //任务处理标记 -1 等待处理;1 可以进行处理;2 处理完毕 - UNIX_ADD_TIME int64 `json:"unix_add_time" gorm:"index"` //添加日期unix - RISK_LEVEL int `json:"risk_level"` //危险等级 0:正常 1:轻微 2:有害 3:严重 4:特别严重 - GUEST_IDENTIFICATION string `gorm:"column:guest_id_entification;size:191" json:"guest_identification"` //访客身份识别 - IsBot int `json:"is_bot"` //是否是机器人 0 不是机器人 1 机器人 - TimeSpent int64 `json:"time_spent"` //用时 - NetSrcIp string `gorm:"size:64" json:"net_src_ip"` //获取的原始IP - SrcByteBody []byte `json:"src_byte_body"` //原始body信息 - SrcByteResBody []byte `json:"src_byte_res_body"` //返回body bytes信息 - WebLogVersion int `json:"web_log_version"` //日志版本信息早期的是空和0,后期实时增加 - Scheme string `gorm:"size:20" json:"scheme"` //HTTP 协议 - SrcURL []byte `json:"src_url"` //原始url信息 - PreCheckCost int64 `json:"pre_check_cost"` // 前置检查耗时(ms) - ForwardCost int64 `json:"forward_cost"` // 转发耗时(ms) - BackendCheckCost int64 `json:"backend_check_cost"` // 后端处理耗时(ms) - ResHeader string `gorm:"type:text" json:"res_header"` // 返回header情况 - BodyHash string `gorm:"size:100" json:"body_hash"` // body hash值 - LogOnlyMode int `json:"log_only_mode"` //是否只记录日志 1 是 0 不是 - IsBalance int `json:"is_balance"` //是否是负载均衡 1 是 0 不是 - BalanceInfo string `gorm:"size:255" json:"balance_info"` //负载均衡IP端口信息 + WafInnerDFlag string `gorm:"size:10" json:"waf_inner_dflag"` //日志队列处理方式 + HOST string `gorm:"size:255" json:"host"` + URL string `gorm:"type:text" json:"url"` + RawQuery string `gorm:"type:text" json:"raw_query"` //原始URL查询 + REFERER string `gorm:"type:text" json:"referer"` + USER_AGENT string `gorm:"size:500" json:"user_agent"` + METHOD string `gorm:"size:20" json:"method"` + HEADER string `gorm:"type:text" json:"header"` + SRC_IP string `gorm:"size:64" json:"src_ip"` + SRC_PORT string `gorm:"size:10" json:"src_port"` + COUNTRY string `gorm:"size:100" json:"country"` + PROVINCE string `gorm:"size:100" json:"province"` + CITY string `gorm:"size:100" json:"city"` + CREATE_TIME string `gorm:"size:32;index:idx_weblog_time" json:"create_time"` + CONTENT_LENGTH int64 `json:"content_length"` + RES_CONTENT_LENGTH int64 `json:"res_content_length"` //响应内容大小(字节) + COOKIES string `gorm:"type:text" json:"cookies"` + BODY string `gorm:"type:text" json:"body"` + REQ_UUID string `gorm:"size:64" json:"req_uuid"` + USER_CODE string `gorm:"size:64;index" json:"user_code"` + TenantId string `gorm:"size:64;index" json:"tenant_id"` //租户ID(主要键) + HOST_CODE string `gorm:"size:64" json:"host_code"` //主机ID (主要键) + Day int `json:"day"` //日 (主要键) + ACTION string `gorm:"size:100" json:"action"` + RULE string `gorm:"type:text" json:"rule"` + STATUS string `gorm:"size:50" json:"status"` //状态 + STATUS_CODE int `json:"status_code"` //状态编码 + RES_BODY string `gorm:"type:text" json:"res_body"` //返回信息 + POST_FORM string `gorm:"type:text" json:"post_form"` //提交的表单数据 + TASK_FLAG int `json:"task_flag" gorm:"default:-1;index"` //任务处理标记 -1 等待处理;1 可以进行处理;2 处理完毕 + UNIX_ADD_TIME int64 `json:"unix_add_time" gorm:"index"` //添加日期unix + RISK_LEVEL int `json:"risk_level"` //危险等级 0:正常 1:轻微 2:有害 3:严重 4:特别严重 + GUEST_IDENTIFICATION string `gorm:"column:guest_id_entification;size:191" json:"guest_identification"` //访客身份识别 + IsBot int `json:"is_bot"` //是否是机器人 0 不是机器人 1 机器人 + TimeSpent int64 `json:"time_spent"` //用时 + NetSrcIp string `gorm:"size:64" json:"net_src_ip"` //获取的原始IP + SrcByteBody []byte `json:"src_byte_body"` //原始body信息 + SrcByteResBody []byte `json:"src_byte_res_body"` //返回body bytes信息 + WebLogVersion int `json:"web_log_version"` //日志版本信息早期的是空和0,后期实时增加 + Scheme string `gorm:"size:20" json:"scheme"` //HTTP 协议 + SrcURL []byte `json:"src_url"` //原始url信息 + PreCheckCost int64 `json:"pre_check_cost"` // 前置检查耗时(ms) + ForwardCost int64 `json:"forward_cost"` // 转发耗时(ms) + BackendCheckCost int64 `json:"backend_check_cost"` // 后端处理耗时(ms) + ResHeader string `gorm:"type:text" json:"res_header"` // 返回header情况 + BodyHash string `gorm:"size:100" json:"body_hash"` // body hash值 + LogOnlyMode int `json:"log_only_mode"` //是否只记录日志 1 是 0 不是 + IsBalance int `json:"is_balance"` //是否是负载均衡 1 是 0 不是 + BalanceInfo string `gorm:"size:255" json:"balance_info"` //负载均衡IP端口信息 + AI_SCORE float64 `json:"ai_score"` //AI检测得分[0,1],0表示未经AI检测或未命中;命中(观察/拦截)时记录实际分数 } // GetHeaderValue 从HEADER字段中提取指定header的值 diff --git a/model/hosts.go b/model/hosts.go index 43e7ff3..065b77c 100644 --- a/model/hosts.go +++ b/model/hosts.go @@ -61,6 +61,7 @@ type HostsDefense struct { DEFENSE_SENSITIVE int `json:"sensitive"` //敏感词检测 DEFENSE_DIR_TRAVERSAL int `json:"traversal"` //目录穿越检测 DEFENSE_OWASP_SET int `json:"owaspset"` //OWASP集检测 + DEFENSE_AI int `json:"ai"` //AI智能检测(默认关闭,需先上传模型包并开启全局AI开关) } // HealthyConfig 健康度检测 @@ -307,6 +308,7 @@ func ParseHostsDefense(defenseJSON string) HostsDefense { defense.DEFENSE_SENSITIVE = 1 defense.DEFENSE_DIR_TRAVERSAL = 1 defense.DEFENSE_OWASP_SET = 0 + defense.DEFENSE_AI = 0 // 如果JSON不为空,则解析覆盖默认值 if defenseJSON != "" { diff --git a/model/request/waf_ai_req.go b/model/request/waf_ai_req.go new file mode 100644 index 0000000..b3bd983 --- /dev/null +++ b/model/request/waf_ai_req.go @@ -0,0 +1,58 @@ +package request + +// WafAIExportReq 训练数据导出入参 +type WafAIExportReq struct { + Days int `json:"days"` // 导出最近多少天的日志(<=0 表示不限) + MaxCount int `json:"max_count"` // 最多导出多少条(<=0 表示用默认上限) +} + +// WafAIDashboardReq AI检测看板入参 +type WafAIDashboardReq struct { + StartDay int `json:"start_day"` // 起始日 YYYYMMDD(<=0 表示不限) + EndDay int `json:"end_day"` // 结束日 YYYYMMDD(<=0 表示不限) + HostCode string `json:"host_code"` // 站点编码,空表示全部站点 +} + +// WafAILabelMarkReq 训练标签人工修正入参 +type WafAILabelMarkReq struct { + ReqUuid string `json:"req_uuid" binding:"required"` // 关联请求日志 + HostCode string `json:"host_code"` + Mark string `json:"mark" binding:"required"` // normal / attack / ignore + AttackType string `json:"attack_type"` // mark=attack 时的人工分类,空=自动判定 + Rule string `json:"rule"` // 原始触发规则(快照) + SrcIp string `json:"src_ip"` + Url string `json:"url"` +} + +// WafAILabelUnmarkReq 取消标记入参 +type WafAILabelUnmarkReq struct { + ReqUuid string `json:"req_uuid" binding:"required"` +} + +// WafAILabelByUuidsReq 按 req_uuid 批量查询标记状态(用于日志列表回显) +type WafAILabelByUuidsReq struct { + ReqUuids []string `json:"req_uuids"` +} + +// WafAILabelListReq 标注工作台列表入参:在 AI 命中(ai_score>0)子集上分页 + 过滤 +type WafAILabelListReq struct { + HostCode string `json:"host_code"` // 站点编码,空=全部 + StartDay int `json:"start_day"` // 起始日 YYYYMMDD(<=0 不限) + EndDay int `json:"end_day"` // 结束日 YYYYMMDD(<=0 不限) + MarkStatus string `json:"mark_status"` // ""=全部 / unmarked / marked / normal / attack / ignore + MinScore float64 `json:"min_score"` // 最小分数(<=0 不限) + PageIndex int `json:"page_index"` // 页码,从 1 开始 + PageSize int `json:"page_size"` // 每页条数 +} + +// WafAILabelBatchMarkReq 批量标记入参 +type WafAILabelBatchMarkReq struct { + ReqUuids []string `json:"req_uuids" binding:"required"` // 待标记的请求列表 + Mark string `json:"mark" binding:"required"` // normal / attack / ignore + AttackType string `json:"attack_type"` // mark=attack 时的人工分类,空=每条按原始日志自动判定 +} + +// WafAILabelBatchUnmarkReq 批量取消标记入参 +type WafAILabelBatchUnmarkReq struct { + ReqUuids []string `json:"req_uuids" binding:"required"` +} diff --git a/model/response/waf_ai_resp.go b/model/response/waf_ai_resp.go new file mode 100644 index 0000000..577f6ba --- /dev/null +++ b/model/response/waf_ai_resp.go @@ -0,0 +1,48 @@ +package response + +// WafAINameValue 通用名称-数值对(类别汇总/分数分布用) +type WafAINameValue struct { + Name string `json:"name"` + Value int64 `json:"value"` +} + +// WafAITrendPoint AI命中按天趋势点 +type WafAITrendPoint struct { + Day int `json:"day"` // YYYYMMDD + Observe int64 `json:"observe"` // 观察命中数(log_only_mode=1) + Block int64 `json:"block"` // 拦截命中数(log_only_mode=0) +} + +// WafAIDashboard AI检测看板聚合结果 +type WafAIDashboard struct { + Total int64 `json:"total"` // AI命中总数 + ObserveCnt int64 `json:"observe_cnt"` // 观察命中数 + BlockCnt int64 `json:"block_cnt"` // 拦截命中数 + Categories []WafAINameValue `json:"categories"` // 按类别汇总 + ScoreHist []WafAINameValue `json:"score_hist"` // 分数分布直方图(10桶) + Trend []WafAITrendPoint `json:"trend"` // 按天 observe/block 趋势 +} + +// WafAILabelItem 标注工作台列表项(AI命中 + 当前标记状态 + 请求详情) +type WafAILabelItem struct { + ReqUuid string `json:"req_uuid"` + CreateTime string `json:"create_time"` + HostCode string `json:"host_code"` + SrcIp string `json:"src_ip"` + Method string `json:"method"` + Url string `json:"url"` + RawQuery string `json:"raw_query"` + Body string `json:"body"` + UserAgent string `json:"user_agent"` + AiScore float64 `json:"ai_score"` + Rule string `json:"rule"` // 命中规则文本(AI检测:<类别>) + LogOnlyMode int `json:"log_only_mode"` // 1 观察 0 拦截 + Mark string `json:"mark"` // 当前人工标记 normal/attack/ignore,空=未标记 + AttackType string `json:"attack_type"` // 人工分类 +} + +// WafAILabelList 标注工作台分页结果 +type WafAILabelList struct { + Total int64 `json:"total"` + Rows []WafAILabelItem `json:"rows"` +} diff --git a/model/waf_log_label_mark.go b/model/waf_log_label_mark.go new file mode 100644 index 0000000..f0f28f6 --- /dev/null +++ b/model/waf_log_label_mark.go @@ -0,0 +1,25 @@ +package model + +import "SamWaf/model/baseorm" + +/* +* +训练标签人工修正 +针对单条访问日志(按 req_uuid)修正其训练标签,用于纠正规则误报导致的错误弱标签。 +导出训练数据时优先采用此处的人工修正结果。 +*/ +type WafLogLabelMark struct { + baseorm.BaseOrm + REQ_UUID string `gorm:"size:64;index" json:"req_uuid"` // 关联的请求日志 + HOST_CODE string `gorm:"size:64" json:"host_code"` // 主机码 + Mark string `gorm:"size:20" json:"mark"` // normal=实际正常 / attack=确认攻击 / ignore=不参与训练 + AttackType string `gorm:"size:32" json:"attack_type"` // 当 mark=attack 时的人工分类(sqli/xss/rce/traversal/inject/scan/other),空=用自动判定 + RULE string `gorm:"type:text" json:"rule"` // 原始触发规则(快照,便于审阅) + SRC_IP string `gorm:"size:64" json:"src_ip"` // 来源IP(快照) + URL string `gorm:"type:text" json:"url"` // 访问URL(快照) + // 训练字段快照:标记时即固化,导出不受时间/条数条件影响,日志被清理也不丢 + METHOD string `gorm:"size:20" json:"method"` // 请求方法(快照) + RAW_QUERY string `gorm:"type:text" json:"raw_query"` // 查询串(快照) + BODY string `gorm:"type:text" json:"body"` // 请求体(快照,body 或 post_form) + USER_AGENT string `gorm:"size:500" json:"user_agent"` // UA(快照) +} diff --git a/router/entrance.go b/router/entrance.go index 0afc709..be97a3b 100644 --- a/router/entrance.go +++ b/router/entrance.go @@ -59,6 +59,7 @@ type ApiGroup struct { WafOwaspRouter WafHostPathRuleRouter WafAppRouter + WafAIRouter } type PublicApiGroup struct { LoginRouter diff --git a/router/waf_ai_router.go b/router/waf_ai_router.go new file mode 100644 index 0000000..3208c49 --- /dev/null +++ b/router/waf_ai_router.go @@ -0,0 +1,32 @@ +package router + +import ( + "SamWaf/api" + + "github.com/gin-gonic/gin" +) + +type WafAIRouter struct { +} + +// InitWafAIRouter AI智能检测:模型管理与训练数据导出。 +// 涉及模型上传(会被引擎加载)与数据导出(数据出库),属安全敏感接口, +// 应挂在仅 Token 登录可访问的路由组上。 +func (receiver *WafAIRouter) InitWafAIRouter(group *gin.RouterGroup) { + apiInstance := api.APIGroupAPP.WafAIApi + router := group.Group("/api/v1/ai") + { + router.GET("/status", apiInstance.GetAIStatusApi) + router.POST("/dashboard", apiInstance.GetAIDashboardApi) + router.POST("/model/upload", apiInstance.UploadAIModelApi) + router.POST("/model/reload", apiInstance.ReloadAIModelApi) + router.POST("/model/unload", apiInstance.UnloadAIModelApi) + router.POST("/export", apiInstance.ExportTrainDataApi) + router.POST("/label/mark", apiInstance.MarkLabelApi) + router.POST("/label/unmark", apiInstance.UnmarkLabelApi) + router.POST("/label/by_uuids", apiInstance.LabelByUuidsApi) + router.POST("/label/list", apiInstance.LabelListApi) + router.POST("/label/batch_mark", apiInstance.BatchMarkLabelApi) + router.POST("/label/batch_unmark", apiInstance.BatchUnmarkLabelApi) + } +} diff --git a/service/waf_service/waf_ai_label_service.go b/service/waf_service/waf_ai_label_service.go new file mode 100644 index 0000000..99a3a7b --- /dev/null +++ b/service/waf_service/waf_ai_label_service.go @@ -0,0 +1,316 @@ +package waf_service + +import ( + "SamWaf/common/uuid" + "SamWaf/customtype" + "SamWaf/global" + "SamWaf/innerbean" + "SamWaf/model" + "SamWaf/model/baseorm" + "SamWaf/model/request" + response2 "SamWaf/model/response" + "SamWaf/wafai" + "errors" + "strings" + "time" + + "gorm.io/gorm" +) + +type WafAILabelService struct{} + +var WafAILabelServiceApp = new(WafAILabelService) + +// 合法的标记取值 +var validMarks = map[string]bool{"normal": true, "attack": true, "ignore": true} + +// LabelMarkInfo 标记回显/导出用的精简信息 +type LabelMarkInfo struct { + Mark string `json:"mark"` + AttackType string `json:"attack_type"` +} + +// MarkApi 新增/更新某条日志的训练标签修正(按 req_uuid 幂等 upsert)。 +// 标记时即从日志库读取该请求的训练字段做快照,导出不再受时间/条数条件限制, +// 即使原始日志后续被清理也能产出该样本。 +func (receiver *WafAILabelService) MarkApi(req request.WafAILabelMarkReq) error { + if !validMarks[req.Mark] { + return errors.New("非法的标记类型") + } + + // 读取原始日志做快照(标记时日志通常仍存在) + var wl innerbean.WebLog + global.GWAF_LOCAL_LOG_DB. + Select("METHOD", "URL", "RawQuery", "BODY", "POST_FORM", "USER_AGENT", "ACTION", "RULE", "SRC_IP", "HOST_CODE", "LogOnlyMode"). + Where("REQ_UUID = ?", req.ReqUuid).Limit(1).Find(&wl) + + body := wl.BODY + if body == "" { + body = wl.POST_FORM + } + hostCode := wl.HOST_CODE + if hostCode == "" { + hostCode = req.HostCode + } + rule := wl.RULE + if rule == "" { + rule = req.Rule + } + srcIp := wl.SRC_IP + if srcIp == "" { + srcIp = req.SrcIp + } + url := wl.URL + if url == "" { + url = req.Url + } + + // 解析攻击分类:优先人工指定;为空且标记为攻击时按原始日志自动判定 + attackType := req.AttackType + if req.Mark == "attack" && attackType == "" { + if _, at := wafai.WeakLabel(wl.ACTION, wl.RULE, wl.LogOnlyMode); at != "" { + attackType = at + } else { + attackType = "other" + } + } + + fields := map[string]interface{}{ + "mark": req.Mark, + "attack_type": attackType, + "rule": rule, + "host_code": hostCode, + "src_ip": srcIp, + "url": url, + "method": strings.ToUpper(wl.METHOD), + "raw_query": wl.RawQuery, + "body": body, + "user_agent": wl.USER_AGENT, + "update_time": customtype.JsonTime(time.Now()), + } + + var existing model.WafLogLabelMark + global.GWAF_LOCAL_DB.Where("req_uuid = ? and tenant_id = ? and user_code = ?", + req.ReqUuid, global.GWAF_TENANT_ID, global.GWAF_USER_CODE).First(&existing) + + if existing.Id != "" { + return global.GWAF_LOCAL_DB.Model(&model.WafLogLabelMark{}).Where("id = ?", existing.Id). + Updates(fields).Error + } + + bean := &model.WafLogLabelMark{ + BaseOrm: baseorm.BaseOrm{ + Id: uuid.GenUUID(), + USER_CODE: global.GWAF_USER_CODE, + Tenant_ID: global.GWAF_TENANT_ID, + CREATE_TIME: customtype.JsonTime(time.Now()), + UPDATE_TIME: customtype.JsonTime(time.Now()), + }, + REQ_UUID: req.ReqUuid, + HOST_CODE: hostCode, + Mark: req.Mark, + AttackType: attackType, + RULE: rule, + SRC_IP: srcIp, + URL: url, + METHOD: strings.ToUpper(wl.METHOD), + RAW_QUERY: wl.RawQuery, + BODY: body, + USER_AGENT: wl.USER_AGENT, + } + return global.GWAF_LOCAL_DB.Create(bean).Error +} + +// UnmarkApi 取消某条日志的标记 +func (receiver *WafAILabelService) UnmarkApi(reqUuid string) error { + return global.GWAF_LOCAL_DB.Where("req_uuid = ? and tenant_id = ? and user_code = ?", + reqUuid, global.GWAF_TENANT_ID, global.GWAF_USER_CODE).Delete(&model.WafLogLabelMark{}).Error +} + +// GetMapByUuidsApi 按 req_uuid 批量返回标记(用于日志列表回显) +func (receiver *WafAILabelService) GetMapByUuidsApi(uuids []string) map[string]LabelMarkInfo { + result := map[string]LabelMarkInfo{} + if len(uuids) == 0 { + return result + } + var rows []model.WafLogLabelMark + global.GWAF_LOCAL_DB.Where("tenant_id = ? and user_code = ? and req_uuid in ?", + global.GWAF_TENANT_ID, global.GWAF_USER_CODE, uuids).Find(&rows) + for _, r := range rows { + result[r.REQ_UUID] = LabelMarkInfo{Mark: r.Mark, AttackType: r.AttackType} + } + return result +} + +// GetAllFull 返回当前租户/用户的全部标记(含请求快照),导出时一次性加载,按 req_uuid 索引。 +func (receiver *WafAILabelService) GetAllFull() map[string]model.WafLogLabelMark { + result := map[string]model.WafLogLabelMark{} + var rows []model.WafLogLabelMark + global.GWAF_LOCAL_DB.Where("tenant_id = ? and user_code = ?", + global.GWAF_TENANT_ID, global.GWAF_USER_CODE).Find(&rows) + for _, r := range rows { + result[r.REQ_UUID] = r + } + return result +} + +// GetMarkStatusMap 轻量返回当前租户/用户全部标记的状态(mark+attack_type),不含请求快照。 +// 供标注工作台列表回显与按标记状态过滤使用。 +func (receiver *WafAILabelService) GetMarkStatusMap() map[string]LabelMarkInfo { + result := map[string]LabelMarkInfo{} + var rows []model.WafLogLabelMark + global.GWAF_LOCAL_DB.Select("req_uuid", "mark", "attack_type"). + Where("tenant_id = ? and user_code = ?", global.GWAF_TENANT_ID, global.GWAF_USER_CODE).Find(&rows) + for _, r := range rows { + result[r.REQ_UUID] = LabelMarkInfo{Mark: r.Mark, AttackType: r.AttackType} + } + return result +} + +// ListApi 标注工作台列表:在 AI 命中(ai_score>0)子集上分页查询,并合并人工标记状态。 +// 标记数据在 core 库、日志在 log 库(跨库无法 JOIN),故先取本租户标记集合, +// 在内存中做"按标记状态过滤"与逐行回显。 +func (receiver *WafAILabelService) ListApi(req request.WafAILabelListReq) response2.WafAILabelList { + res := response2.WafAILabelList{Rows: []response2.WafAILabelItem{}} + if global.GWAF_LOCAL_LOG_DB == nil { + return res + } + + pageIndex := req.PageIndex + if pageIndex <= 0 { + pageIndex = 1 + } + pageSize := req.PageSize + if pageSize <= 0 || pageSize > 200 { + pageSize = 20 + } + + markMap := receiver.GetMarkStatusMap() + + // 按标记状态预先算出 IN / NOT IN 的 uuid 集合 + var inUuids []string // 命中即纳入 + useNotIn := false // true 时改用 NOT IN + emptyResult := false // 过滤后必然为空,直接返回 + switch req.MarkStatus { + case "unmarked": + for u := range markMap { + inUuids = append(inUuids, u) + } + useNotIn = true // 排除全部已标记 + case "marked": + for u := range markMap { + inUuids = append(inUuids, u) + } + if len(inUuids) == 0 { + emptyResult = true + } + case "normal", "attack", "ignore": + for u, info := range markMap { + if info.Mark == req.MarkStatus { + inUuids = append(inUuids, u) + } + } + if len(inUuids) == 0 { + emptyResult = true + } + } + if emptyResult { + return res + } + + buildQ := func() *gorm.DB { + q := global.GWAF_LOCAL_LOG_DB.Model(&innerbean.WebLog{}).Where("ai_score > 0") + if req.StartDay > 0 && req.EndDay > 0 { + q = q.Where("day between ? and ?", req.StartDay, req.EndDay) + } + if req.HostCode != "" { + q = q.Where("host_code = ?", req.HostCode) + } + if req.MinScore > 0 { + q = q.Where("ai_score >= ?", req.MinScore) + } + if len(inUuids) > 0 { + if useNotIn { + q = q.Where("req_uuid not in ?", inUuids) + } else { + q = q.Where("req_uuid in ?", inUuids) + } + } + return q + } + + buildQ().Count(&res.Total) + + var rows []innerbean.WebLog + buildQ().Select("REQ_UUID", "CREATE_TIME", "HOST_CODE", "SRC_IP", "METHOD", "URL", + "RawQuery", "BODY", "POST_FORM", "USER_AGENT", "AI_SCORE", "RULE", "LogOnlyMode"). + Order("ai_score desc").Order("unix_add_time desc"). + Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&rows) + + for i := range rows { + r := &rows[i] + body := r.BODY + if body == "" { + body = r.POST_FORM + } + item := response2.WafAILabelItem{ + ReqUuid: r.REQ_UUID, + CreateTime: r.CREATE_TIME, + HostCode: r.HOST_CODE, + SrcIp: r.SRC_IP, + Method: strings.ToUpper(r.METHOD), + Url: r.URL, + RawQuery: r.RawQuery, + Body: body, + UserAgent: r.USER_AGENT, + AiScore: r.AI_SCORE, + Rule: r.RULE, + LogOnlyMode: r.LogOnlyMode, + } + if info, ok := markMap[r.REQ_UUID]; ok { + item.Mark = info.Mark + item.AttackType = info.AttackType + } + res.Rows = append(res.Rows, item) + } + return res +} + +// BatchMarkApi 批量标记:逐条复用 MarkApi(每条独立读取请求快照、按需自动判定分类)。 +// 返回成功标记条数。 +func (receiver *WafAILabelService) BatchMarkApi(req request.WafAILabelBatchMarkReq) (int, error) { + if !validMarks[req.Mark] { + return 0, errors.New("非法的标记类型") + } + n := 0 + for _, u := range req.ReqUuids { + if strings.TrimSpace(u) == "" { + continue + } + if err := receiver.MarkApi(request.WafAILabelMarkReq{ + ReqUuid: u, + Mark: req.Mark, + AttackType: req.AttackType, + }); err != nil { + return n, err + } + n++ + } + return n, nil +} + +// BatchUnmarkApi 批量取消标记,返回删除条数。 +func (receiver *WafAILabelService) BatchUnmarkApi(uuids []string) (int, error) { + var clean []string + for _, u := range uuids { + if strings.TrimSpace(u) != "" { + clean = append(clean, u) + } + } + if len(clean) == 0 { + return 0, nil + } + res := global.GWAF_LOCAL_DB.Where("tenant_id = ? and user_code = ? and req_uuid in ?", + global.GWAF_TENANT_ID, global.GWAF_USER_CODE, clean).Delete(&model.WafLogLabelMark{}) + return int(res.RowsAffected), res.Error +} diff --git a/service/waf_service/waf_ai_service.go b/service/waf_service/waf_ai_service.go new file mode 100644 index 0000000..a80a536 --- /dev/null +++ b/service/waf_service/waf_ai_service.go @@ -0,0 +1,92 @@ +package waf_service + +import ( + "SamWaf/global" + "SamWaf/innerbean" + "SamWaf/model/request" + response2 "SamWaf/model/response" + "fmt" + + "gorm.io/gorm" +) + +type WafAIService struct{} + +var WafAIServiceApp = new(WafAIService) + +// DashboardApi 聚合 AI 检测看板数据:按类别汇总、分数分布、observe/block 趋势。 +// 数据源为 web_logs 中 ai_score>0 的命中子集(相对较小),按 day 范围/站点过滤。 +func (receiver *WafAIService) DashboardApi(req request.WafAIDashboardReq) response2.WafAIDashboard { + var res response2.WafAIDashboard + res.Categories = []response2.WafAINameValue{} + res.Trend = []response2.WafAITrendPoint{} + + if global.GWAF_LOCAL_LOG_DB == nil { + res.ScoreHist = buildEmptyScoreHist() + return res + } + + // 每次查询都用全新的 where 链,避免 GORM 条件被复用污染 + base := func() *gorm.DB { + q := global.GWAF_LOCAL_LOG_DB.Model(&innerbean.WebLog{}).Where("ai_score > 0") + if req.StartDay > 0 && req.EndDay > 0 { + q = q.Where("day between ? and ?", req.StartDay, req.EndDay) + } + if req.HostCode != "" { + q = q.Where("host_code = ?", req.HostCode) + } + return q + } + + // 1) 按类别(rule)汇总 + base().Select("rule as name, count(*) as value"). + Group("rule").Order("value desc").Scan(&res.Categories) + + // 2) 分数分布直方图(10 桶:0.0-0.1 ... 0.9-1.0;score==1.0 归入最后一桶) + type bucketRow struct { + Bucket int + Cnt int64 + } + var brows []bucketRow + base().Select("cast(ai_score*10 as int) as bucket, count(*) as cnt"). + Group("bucket").Scan(&brows) + counts := make([]int64, 10) + for _, b := range brows { + idx := b.Bucket + if idx >= 10 { + idx = 9 // score==1.0 归入 0.9-1.0 + } + if idx < 0 { + idx = 0 + } + counts[idx] += b.Cnt + } + res.ScoreHist = make([]response2.WafAINameValue, 10) + for i := 0; i < 10; i++ { + res.ScoreHist[i] = response2.WafAINameValue{ + Name: fmt.Sprintf("%.1f-%.1f", float64(i)/10, float64(i+1)/10), + Value: counts[i], + } + } + + // 3) 按天 observe/block 趋势 + base().Select("day, sum(case when log_only_mode=1 then 1 else 0 end) as observe, sum(case when log_only_mode=0 then 1 else 0 end) as block"). + Group("day").Order("day asc").Scan(&res.Trend) + + // 4) 汇总总数 + for _, t := range res.Trend { + res.ObserveCnt += t.Observe + res.BlockCnt += t.Block + } + res.Total = res.ObserveCnt + res.BlockCnt + + return res +} + +func buildEmptyScoreHist() []response2.WafAINameValue { + hist := make([]response2.WafAINameValue, 10) + for i := 0; i < 10; i++ { + hist[i] = response2.WafAINameValue{Name: fmt.Sprintf("%.1f-%.1f", float64(i)/10, float64(i+1)/10)} + } + return hist +} diff --git a/wafai/engine.go b/wafai/engine.go new file mode 100644 index 0000000..0d55361 --- /dev/null +++ b/wafai/engine.go @@ -0,0 +1,14 @@ +package wafai + +// InferenceEngine 推理引擎抽象。 +// +// 一期实现为纯 Go GBDT(engine_gbdt.go,dmitryikh/leaves 加载 LightGBM)。 +// 二期可选 ONNX 深度模型增强档(engine_onnx.go,build tag 隔离)。 +type InferenceEngine interface { + // Score 输入特征向量,返回 [0,1] 的攻击概率。 + Score(features []float64) float64 + // FeatureVersion 模型训练时使用的特征版本,用于与 Go 侧特征版本校验。 + FeatureVersion() string + // Type 引擎类型标识:"gbdt" / "onnx"。 + Type() string +} diff --git a/wafai/engine_gbdt.go b/wafai/engine_gbdt.go new file mode 100644 index 0000000..d44f6d8 --- /dev/null +++ b/wafai/engine_gbdt.go @@ -0,0 +1,38 @@ +package wafai + +import ( + "bufio" + "bytes" + "fmt" + + "github.com/dmitryikh/leaves" +) + +// gbdtEngine 基于 dmitryikh/leaves 的纯 Go LightGBM 推理引擎(一期)。 +type gbdtEngine struct { + model *leaves.Ensemble + featureVersion string +} + +// newGBDTEngine 从 LightGBM 文本模型字节构建引擎。 +// loadTransformation=true 让 leaves 加载 sigmoid 变换,PredictSingle 直接输出概率。 +func newGBDTEngine(modelBytes []byte, featureVersion string) (*gbdtEngine, error) { + br := bufio.NewReader(bytes.NewReader(modelBytes)) + model, err := leaves.LGEnsembleFromReader(br, true) + if err != nil { + return nil, fmt.Errorf("加载 LightGBM 模型失败: %w", err) + } + if nf := model.NFeatures(); nf != FeatureCount { + return nil, fmt.Errorf("模型特征维度=%d 与引擎=%d 不一致", nf, FeatureCount) + } + return &gbdtEngine{model: model, featureVersion: featureVersion}, nil +} + +func (e *gbdtEngine) Score(features []float64) float64 { + // nIterations=0 表示使用全部树 + return e.model.PredictSingle(features, 0) +} + +func (e *gbdtEngine) FeatureVersion() string { return e.featureVersion } + +func (e *gbdtEngine) Type() string { return "gbdt" } diff --git a/wafai/engine_onnx_stub.go b/wafai/engine_onnx_stub.go new file mode 100644 index 0000000..32342a7 --- /dev/null +++ b/wafai/engine_onnx_stub.go @@ -0,0 +1,11 @@ +//go:build !samwaf_onnx + +package wafai + +import "errors" + +// newONNXEngine 默认构建不含 ONNX 运行时(保持主分支零新增 CGO/外部依赖)。 +// 需要 ONNX 深度模型增强档时,用 `-tags samwaf_onnx` 编译并提供 engine_onnx.go 实现。 +func newONNXEngine(modelBytes []byte, featureVersion string) (InferenceEngine, error) { + return nil, errors.New("当前构建未启用 ONNX 引擎(需使用 -tags samwaf_onnx 编译)") +} diff --git a/wafai/features.go b/wafai/features.go new file mode 100644 index 0000000..3964f44 --- /dev/null +++ b/wafai/features.go @@ -0,0 +1,394 @@ +package wafai + +import ( + "bytes" + "math" +) + +// 特征规范 v1 +// +// !!! 重要 !!! +// 本文件与 SamWafAI 仓库 samwafai/features/lexical.py 是同一份规范 +// (SamWafTechDoc 特征规范 v1)的双语言实现,二者必须逐字节对齐。 +// 任何改动(常量/词表/顺序/算法)必须同步修改 Python 侧并升级 FeatureVersion, +// 且重新生成 wafai/testdata/feature_golden.json(uv run samwafai gen-golden)。 +const ( + FeatureVersion = "v1" + maxComponentBytes = 4096 // 每个分量截断长度 + decodeMax = 3 // 百分号解码最大迭代次数 + ngramN = 3 // 字节 n-gram 长度 + ngramBuckets = 64 // n-gram 哈希桶数量 + + scalarFeatureCount = 22 + FeatureCount = scalarFeatureCount + ngramBuckets // 86 +) + +// methodIdx HTTP 方法编码(大写比较;未知方法 -> 7) +var methodIdx = map[string]float64{ + "GET": 0, "POST": 1, "PUT": 2, "DELETE": 3, + "HEAD": 4, "OPTIONS": 5, "PATCH": 6, +} + +const methodIdxOther = 7 + +// 关键词表(小写;与 Python 侧严格一致) +var ( + kwSQL = [][]byte{ + []byte("select"), []byte("union"), []byte("insert into"), []byte("update "), + []byte("delete from"), []byte("drop table"), []byte("information_schema"), + []byte("sleep("), []byte("benchmark("), []byte("load_file"), []byte("group by"), + []byte("order by"), []byte("or 1=1"), []byte("' or '"), []byte("\" or \""), + []byte("concat("), []byte("char("), []byte("0x"), []byte("xp_"), []byte("exec("), + []byte("waitfor delay"), []byte("/*"), []byte("*/"), []byte("--"), []byte("@@"), + } + kwXSS = [][]byte{ + []byte(" best { // 严格大于:并列时保留更高优先级(靠前)的类别 + best = features[c.idx] + bestName = c.name + } + } + if bestName == "" { + return "异常请求" + } + return bestName +} + +func itoa(i int) string { + if i == 0 { + return "0" + } + var buf [4]byte + pos := len(buf) + for i > 0 { + pos-- + buf[pos] = byte('0' + i%10) + i /= 10 + } + return string(buf[pos:]) +} + +func truncate(s string) []byte { + b := []byte(s) + if len(b) > maxComponentBytes { + b = b[:maxComponentBytes] + } + return b +} + +func isHex(c byte) bool { + return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f') +} + +func hexVal(c byte) byte { + switch { + case c >= '0' && c <= '9': + return c - '0' + case c >= 'A' && c <= 'F': + return c - 'A' + 10 + default: + return c - 'a' + 10 + } +} + +// percentDecodeOnce 单次百分号解码:%XX -> 字节;'+' -> 空格;非法 % 序列原样保留。 +func percentDecodeOnce(b []byte) []byte { + out := make([]byte, 0, len(b)) + n := len(b) + for i := 0; i < n; { + c := b[i] + if c == '%' && i+2 < n && isHex(b[i+1]) && isHex(b[i+2]) { + out = append(out, hexVal(b[i+1])<<4|hexVal(b[i+2])) + i += 3 + } else if c == '+' { + out = append(out, ' ') + i++ + } else { + out = append(out, c) + i++ + } + } + return out +} + +// iterDecode 迭代解码至多 decodeMax 次,返回 (解码结果, 实际生效的解码层数)。 +func iterDecode(b []byte) ([]byte, int) { + layers := 0 + cur := b + for k := 0; k < decodeMax; k++ { + dec := percentDecodeOnce(cur) + if bytes.Equal(dec, cur) { + break + } + cur = dec + layers++ + } + return cur, layers +} + +// asciiLower 仅对 ASCII 'A'-'Z' 转小写(不处理多字节字符)。 +func asciiLower(b []byte) []byte { + out := make([]byte, len(b)) + for i, c := range b { + if c >= 'A' && c <= 'Z' { + out[i] = c + 32 + } else { + out[i] = c + } + } + return out +} + +func fnv1a32(b []byte) uint32 { + var h uint32 = 2166136261 + for _, c := range b { + h ^= uint32(c) + h *= 16777619 + } + return h +} + +func entropy(b []byte) float64 { + if len(b) == 0 { + return 0 + } + var counts [256]int + for _, c := range b { + counts[c]++ + } + n := float64(len(b)) + ent := 0.0 + for _, cnt := range counts { + if cnt > 0 { + p := float64(cnt) / n + ent -= p * math.Log2(p) + } + } + return ent +} + +func isPunct(c byte) bool { + return (c >= 0x21 && c <= 0x2F) || (c >= 0x3A && c <= 0x40) || + (c >= 0x5B && c <= 0x60) || (c >= 0x7B && c <= 0x7E) +} + +func countKeywords(haystack []byte, kws [][]byte) float64 { + total := 0 + for _, kw := range kws { + total += bytes.Count(haystack, kw) + } + return float64(total) +} + +// ExtractFeatures 提取特征向量(FeatureCount 维,顺序固定,与 Python 一致)。 +// +// 入参均为原始字符串(path/query/body 未解码;query 不含 '?';method 任意大小写)。 +func ExtractFeatures(method, path, query, body, userAgent string) []float64 { + pathB := truncate(path) + queryB := truncate(query) + bodyB := truncate(body) + uaB := truncate(userAgent) + + pathD, l1 := iterDecode(pathB) + queryD, l2 := iterDecode(queryB) + bodyD, l3 := iterDecode(bodyB) + decodeLayers := l1 + if l2 > decodeLayers { + decodeLayers = l2 + } + if l3 > decodeLayers { + decodeLayers = l3 + } + + combined := make([]byte, 0, len(pathD)+len(queryD)+len(bodyD)+2) + combined = append(combined, pathD...) + combined = append(combined, '\n') + combined = append(combined, queryD...) + combined = append(combined, '\n') + combined = append(combined, bodyD...) + combinedLower := asciiLower(combined) + uaLower := asciiLower(uaB) + + f := make([]float64, FeatureCount) + + // --- 长度/结构类 --- + f[0] = float64(len(pathB)) + f[1] = float64(len(queryB)) + f[2] = float64(len(bodyB)) + f[3] = float64(len(uaB)) + + paramCount := 0 + maxParamLen := 0 + for _, seg := range bytes.Split(queryD, []byte("&")) { + if len(seg) == 0 { + continue + } + paramCount++ + eq := bytes.IndexByte(seg, '=') + vlen := 0 + if eq >= 0 { + vlen = len(seg) - eq - 1 + } + if vlen > maxParamLen { + maxParamLen = vlen + } + } + f[4] = float64(paramCount) + f[5] = float64(maxParamLen) + f[6] = float64(bytes.Count(pathD, []byte("/"))) + if v, ok := methodIdx[upperASCII(method)]; ok { + f[7] = v + } else { + f[7] = methodIdxOther + } + + // --- 字符分布类(在 combined 上统计)--- + n := len(combined) + if n > 0 { + var punct, digit, letter, upper, nonascii int + for _, c := range combined { + if isPunct(c) { + punct++ + } + if c >= '0' && c <= '9' { + digit++ + } + if (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') { + letter++ + } + if c >= 'A' && c <= 'Z' { + upper++ + } + if c >= 0x80 { + nonascii++ + } + } + fn := float64(n) + f[8] = float64(punct) / fn + f[9] = float64(digit) / fn + f[10] = float64(letter) / fn + f[11] = float64(upper) / fn + f[12] = float64(nonascii) / fn + } + f[13] = entropy(combined) + f[14] = float64(decodeLayers) + f[15] = float64(bytes.Count(queryD, []byte("="))) + + // --- 关键词类 --- + f[16] = countKeywords(combinedLower, kwSQL) + f[17] = countKeywords(combinedLower, kwXSS) + f[18] = countKeywords(combinedLower, kwCMD) + f[19] = countKeywords(combinedLower, kwTraversal) + f[20] = countKeywords(combinedLower, kwProto) + f[21] = countKeywords(uaLower, kwScannerUA) + + // --- 字节 3-gram 哈希桶频率 --- + ln := len(combinedLower) + if ln >= ngramN { + var counts [ngramBuckets]int + totalNgrams := ln - ngramN + 1 + for i := 0; i < totalNgrams; i++ { + h := fnv1a32(combinedLower[i : i+ngramN]) + counts[h%ngramBuckets]++ + } + for bi := 0; bi < ngramBuckets; bi++ { + f[scalarFeatureCount+bi] = float64(counts[bi]) / float64(totalNgrams) + } + } + + return f +} + +func upperASCII(s string) string { + b := []byte(s) + changed := false + for i, c := range b { + if c >= 'a' && c <= 'z' { + b[i] = c - 32 + changed = true + } + } + if !changed { + return s + } + return string(b) +} diff --git a/wafai/features_test.go b/wafai/features_test.go new file mode 100644 index 0000000..6791457 --- /dev/null +++ b/wafai/features_test.go @@ -0,0 +1,115 @@ +package wafai + +import ( + "encoding/json" + "math" + "os" + "path/filepath" + "testing" +) + +// goldenFile 由 SamWafAI 生成:uv run samwafai gen-golden --out wafai/testdata/feature_golden.json +type goldenFile struct { + FeatureVersion string `json:"feature_version"` + FeatureNames []string `json:"feature_names"` + Cases []struct { + Method string `json:"method"` + Path string `json:"path"` + Query string `json:"query"` + Body string `json:"body"` + UserAgent string `json:"user_agent"` + Features []float64 `json:"features"` + } `json:"cases"` +} + +// TestFeatureParity 校验 Go 特征提取与 Python(golden 文件)逐项一致。 +// 这是 AI 检测正确性的基石:特征不对齐 -> 模型打分错乱。 +func TestFeatureParity(t *testing.T) { + raw, err := os.ReadFile(filepath.Join("testdata", "feature_golden.json")) + if err != nil { + t.Fatalf("读取 golden 文件失败(请先运行 uv run samwafai gen-golden): %v", err) + } + var g goldenFile + if err := json.Unmarshal(raw, &g); err != nil { + t.Fatalf("解析 golden 文件失败: %v", err) + } + + if g.FeatureVersion != FeatureVersion { + t.Fatalf("特征版本不一致: golden=%s go=%s", g.FeatureVersion, FeatureVersion) + } + if len(g.FeatureNames) != FeatureCount { + t.Fatalf("特征维度不一致: golden=%d go=%d", len(g.FeatureNames), FeatureCount) + } + goNames := FeatureNames() + for i, name := range g.FeatureNames { + if goNames[i] != name { + t.Fatalf("特征名[%d]不一致: golden=%s go=%s", i, name, goNames[i]) + } + } + + const eps = 1e-9 + for ci, c := range g.Cases { + got := ExtractFeatures(c.Method, c.Path, c.Query, c.Body, c.UserAgent) + if len(got) != len(c.Features) { + t.Fatalf("case[%d] 维度不一致: got=%d want=%d", ci, len(got), len(c.Features)) + } + for fi := range got { + if math.Abs(got[fi]-c.Features[fi]) > eps { + t.Errorf("case[%d] 特征[%d:%s] 不一致: go=%.12f py=%.12f (path=%q query=%q)", + ci, fi, goNames[fi], got[fi], c.Features[fi], c.Path, c.Query) + } + } + } +} + +func TestPercentDecode(t *testing.T) { + cases := []struct { + in string + want string + }{ + {"%2e%2e", ".."}, + {"a+b", "a b"}, + {"%zz", "%zz"}, + {"%2", "%2"}, + } + for _, c := range cases { + if got := string(percentDecodeOnce([]byte(c.in))); got != c.want { + t.Errorf("percentDecodeOnce(%q)=%q want %q", c.in, got, c.want) + } + } +} + +func TestIterDecodeLayers(t *testing.T) { + dec, layers := iterDecode([]byte("%252e%252e")) + if string(dec) != ".." || layers != 2 { + t.Errorf("iterDecode 双层解码失败: got=%q layers=%d", string(dec), layers) + } +} + +func TestCategoryHint(t *testing.T) { + cases := []struct { + method, path, query, body, ua string + want string + }{ + {"GET", "/p", "id=1' or '1'='1 union select", "", "", "SQL注入"}, + {"GET", "/c", "q=", "", "", "XSS"}, + {"GET", "/d", "file=../../../../etc/passwd", "", "", "目录穿越"}, + {"GET", "/x", "host=127.0.0.1;cat /etc/passwd", "", "", "命令执行"}, + {"GET", "/", "page=1&sort=asc", "", "Mozilla/5.0", "异常请求"}, + } + for _, c := range cases { + f := ExtractFeatures(c.method, c.path, c.query, c.body, c.ua) + if got := CategoryHint(f); got != c.want { + t.Errorf("CategoryHint(query=%q)=%q want %q", c.query, got, c.want) + } + } +} + +func TestFNV1a(t *testing.T) { + if fnv1a32([]byte("")) != 2166136261 { + t.Error("fnv1a32 空串错误") + } + if fnv1a32([]byte("a")) != 0xE40C292C { + t.Errorf("fnv1a32('a')=%#x", fnv1a32([]byte("a"))) + } +} diff --git a/wafai/labeling.go b/wafai/labeling.go new file mode 100644 index 0000000..5c82dd4 --- /dev/null +++ b/wafai/labeling.go @@ -0,0 +1,102 @@ +package wafai + +import "strings" + +// 规则弱标签:把 SamWaf 日志里的规则命中转换为训练标签。 +// 与 SamWafAI samwafai/data/labeling.py 保持一致的判定逻辑。 +// +// 只把"载荷型"攻击规则的命中当作正样本;CC/IP黑白名单/防盗链/验证码等 +// 行为型或策略型拦截与请求载荷内容无关,全部丢弃,避免污染训练。 + +// payloadRuleKeywords RULE 标题包含这些关键字 -> 载荷型攻击(正样本) +var payloadRuleKeywords = []struct { + kw string + attackType string +}{ + {"sql", "sqli"}, {"注入", "sqli"}, + {"xss", "xss"}, {"跨站", "xss"}, + {"rce", "rce"}, {"命令执行", "rce"}, {"代码执行", "rce"}, + {"扫描", "scan"}, {"scan", "scan"}, + {"穿越", "traversal"}, {"traversal", "traversal"}, + {"owasp", "owasp"}, +} + +// excludeRuleKeywords RULE 标题包含这些关键字 -> 非载荷型,直接丢弃 +var excludeRuleKeywords = []string{ + "cc", "频次", "rate limit", + "ip", "黑名单", "白名单", + "防盗链", "盗链", + "验证码", "captcha", + "敏感词", + "bot", "爬虫", "蜘蛛", + "url黑", "url白", "禁止url", "路径禁止", + "应用", + "ai检测", // AI 自己产生的命中不能再回灌当弱标签,避免自我强化 +} + +var blockActions = []string{"禁止", "阻止"} + +// highConfidenceAttackTypes 高置信攻击类型:命中即基本可判定为真攻击(误报率低), +// 未经人工确认也可作为训练正样本。 +// - sqli/xss:libinjection 词法分析,精度高。 +// - owasp:OWASP CRS 规则集。 +// - rce:检测仅匹配 phpinfo()/call_user_func_array/invokefunction 等极具体签名,正常流量几乎不出现,误报极低。 +// - traversal:匹配 ../、..\、%2e%2e 等穿越特征,正常流量很少出现,误报低。 +// +// scan 由 User-Agent 判定(curl/python-requests 等合法工具也会命中),误报高,仍排除在高置信外, +// 未经人工确认不当攻击;自定义规则同理。 +var highConfidenceAttackTypes = map[string]bool{ + "sqli": true, + "xss": true, + "owasp": true, + "rce": true, + "traversal": true, +} + +// IsHighConfidenceAttackType 该攻击类型是否高置信(可在无人工确认时信任为正样本)。 +func IsHighConfidenceAttackType(attackType string) bool { + return highConfidenceAttackTypes[attackType] +} + +// WeakLabelVerdict 弱标签判定结果。 +type WeakLabelVerdict int + +const ( + VerdictDrop WeakLabelVerdict = iota // 丢弃(不用于训练) + VerdictAttack // 载荷型攻击正样本 + VerdictNormal // 正常负样本 +) + +// WeakLabel 根据日志的 action/rule/logOnlyMode 给出弱标签。 +func WeakLabel(action, rule string, logOnlyMode int) (WeakLabelVerdict, string) { + ruleL := strings.ToLower(strings.TrimSpace(rule)) + blocked := false + for _, a := range blockActions { + if strings.TrimSpace(action) == a { + blocked = true + break + } + } + if logOnlyMode == 1 && ruleL != "" { + blocked = true + } + + if !blocked { + if ruleL == "" { + return VerdictNormal, "" + } + return VerdictDrop, "" + } + + for _, p := range payloadRuleKeywords { + if strings.Contains(ruleL, p.kw) { + return VerdictAttack, p.attackType + } + } + for _, kw := range excludeRuleKeywords { + if strings.Contains(ruleL, kw) { + return VerdictDrop, "" + } + } + return VerdictDrop, "" +} diff --git a/wafai/manager.go b/wafai/manager.go new file mode 100644 index 0000000..aaaf1c8 --- /dev/null +++ b/wafai/manager.go @@ -0,0 +1,120 @@ +package wafai + +import ( + "fmt" + "sync" + "sync/atomic" +) + +// Detector AI 检测器:持有当前模型,提供线程安全的打分与热加载。 +// +// 失败安全:模型未加载/打分 panic 时,Predict 返回非命中结果,绝不影响业务转发。 +type Detector struct { + mu sync.RWMutex + current atomic.Pointer[loadedModel] +} + +type loadedModel struct { + engine InferenceEngine + manifest Manifest +} + +// PredictResult 单次推理结果。 +type PredictResult struct { + Loaded bool // 当前是否有可用模型 + Score float64 // 攻击概率 [0,1] + Category string // 粗粒度类别提示(SQL注入/XSS/.../异常请求),用于日志展示与按规则汇总 + BlockThreshold float64 // 模型建议的拦截阈值 + ObserveThreshold float64 // 模型建议的观察阈值 + ModelVersion string +} + +// NewDetector 创建空检测器(尚未加载模型)。 +func NewDetector() *Detector { + return &Detector{} +} + +// LoadFromFile 从 .swai 文件加载模型并原子热替换。 +func (d *Detector) LoadFromFile(swaiPath string) (Manifest, error) { + pkg, err := loadPackageFile(swaiPath) + if err != nil { + return Manifest{}, err + } + return d.loadPackage(pkg) +} + +// LoadFromBytes 从内存字节加载模型并原子热替换。 +func (d *Detector) LoadFromBytes(data []byte) (Manifest, error) { + pkg, err := loadPackageBytes(data) + if err != nil { + return Manifest{}, err + } + return d.loadPackage(pkg) +} + +func (d *Detector) loadPackage(pkg *loadedPackage) (Manifest, error) { + d.mu.Lock() + defer d.mu.Unlock() + + var engine InferenceEngine + var err error + switch pkg.Manifest.ModelType { + case "gbdt", "": + engine, err = newGBDTEngine(pkg.ModelBytes, pkg.Manifest.FeatureVersion) + case "onnx": + engine, err = newONNXEngine(pkg.ModelBytes, pkg.Manifest.FeatureVersion) + default: + return Manifest{}, fmt.Errorf("不支持的模型类型: %q", pkg.Manifest.ModelType) + } + if err != nil { + return Manifest{}, err + } + + d.current.Store(&loadedModel{engine: engine, manifest: pkg.Manifest}) + return pkg.Manifest, nil +} + +// Unload 卸载当前模型。 +func (d *Detector) Unload() { + d.current.Store(nil) +} + +// IsLoaded 当前是否已加载模型。 +func (d *Detector) IsLoaded() bool { + return d.current.Load() != nil +} + +// CurrentManifest 返回当前模型 manifest(未加载时第二个返回值为 false)。 +func (d *Detector) CurrentManifest() (Manifest, bool) { + m := d.current.Load() + if m == nil { + return Manifest{}, false + } + return m.manifest, true +} + +// PredictRequest 对一次请求的关键字段打分。失败安全:任何异常返回 Loaded=false。 +func (d *Detector) PredictRequest(method, path, query, body, userAgent string) (res PredictResult) { + lm := d.current.Load() + if lm == nil { + return PredictResult{Loaded: false} + } + + defer func() { + if r := recover(); r != nil { + // 推理 panic 时降级为未命中,绝不阻断业务 + res = PredictResult{Loaded: false} + } + }() + + features := ExtractFeatures(method, path, query, body, userAgent) + score := lm.engine.Score(features) + return PredictResult{ + Loaded: true, + Score: score, + Category: CategoryHint(features), + BlockThreshold: lm.manifest.BlockThreshold, + ObserveThreshold: lm.manifest.ObserveThreshold, + ModelVersion: lm.manifest.ModelVersion, + } +} diff --git a/wafai/modelpack.go b/wafai/modelpack.go new file mode 100644 index 0000000..6d757b4 --- /dev/null +++ b/wafai/modelpack.go @@ -0,0 +1,150 @@ +package wafai + +import ( + "archive/zip" + "bytes" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io" + "path" +) + +const ( + swaiFormatVersion = 1 + manifestName = "manifest.json" + maxModelBytes = 64 * 1024 * 1024 // 单个模型文件解压上限 64MB(防 zip 炸弹) + maxManifestBytes = 1 * 1024 * 1024 // manifest 上限 1MB + maxPackageEntries = 16 // 包内条目数上限 +) + +// Manifest .swai 模型包元数据(与 SamWafAI export/package.py 对齐)。 +type Manifest struct { + SwaiFormatVersion int `json:"swai_format_version"` + ModelVersion string `json:"model_version"` + ModelType string `json:"model_type"` + FeatureVersion string `json:"feature_version"` + FeatureCount int `json:"feature_count"` + ModelFile string `json:"model_file"` + ModelSha256 string `json:"model_sha256"` + BlockThreshold float64 `json:"block_threshold"` + ObserveThreshold float64 `json:"observe_threshold"` + DataFingerprint string `json:"data_fingerprint"` + CreatedAt string `json:"created_at"` +} + +// loadedPackage 解析后的模型包内容。 +type loadedPackage struct { + Manifest Manifest + ModelBytes []byte +} + +// loadPackageFile 从磁盘加载并校验 .swai 模型包。 +func loadPackageFile(swaiPath string) (*loadedPackage, error) { + zr, err := zip.OpenReader(swaiPath) + if err != nil { + return nil, fmt.Errorf("打开模型包失败: %w", err) + } + defer zr.Close() + return parsePackage(&zr.Reader) +} + +// loadPackageBytes 从内存字节加载并校验 .swai 模型包。 +func loadPackageBytes(data []byte) (*loadedPackage, error) { + zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data))) + if err != nil { + return nil, fmt.Errorf("解析模型包失败: %w", err) + } + return parsePackage(zr) +} + +func parsePackage(zr *zip.Reader) (*loadedPackage, error) { + if len(zr.File) > maxPackageEntries { + return nil, fmt.Errorf("模型包条目过多: %d", len(zr.File)) + } + + var manifestRaw []byte + files := map[string][]byte{} + for _, zf := range zr.File { + // 防路径穿越:条目名必须是简单文件名 + name := zf.Name + if path.IsAbs(name) || name != path.Clean(name) || containsDotDot(name) { + return nil, fmt.Errorf("非法的模型包条目名: %q", name) + } + limit := int64(maxModelBytes) + if name == manifestName { + limit = maxManifestBytes + } + data, err := readZipEntry(zf, limit) + if err != nil { + return nil, fmt.Errorf("读取条目 %q 失败: %w", name, err) + } + if name == manifestName { + manifestRaw = data + } else { + files[name] = data + } + } + + if manifestRaw == nil { + return nil, errors.New("模型包缺少 manifest.json") + } + + var m Manifest + if err := json.Unmarshal(manifestRaw, &m); err != nil { + return nil, fmt.Errorf("解析 manifest 失败: %w", err) + } + + if m.SwaiFormatVersion != swaiFormatVersion { + return nil, fmt.Errorf("不支持的模型包格式版本: %d(当前支持 %d)", m.SwaiFormatVersion, swaiFormatVersion) + } + // 特征版本硬约束:与 Go 侧不一致则拒绝加载 + if m.FeatureVersion != FeatureVersion { + return nil, fmt.Errorf("特征版本不匹配: 模型=%s, 引擎=%s(请用匹配版本的 SamWafAI 重新训练)", m.FeatureVersion, FeatureVersion) + } + if m.FeatureCount != 0 && m.FeatureCount != FeatureCount { + return nil, fmt.Errorf("特征维度不匹配: 模型=%d, 引擎=%d", m.FeatureCount, FeatureCount) + } + + modelBytes, ok := files[m.ModelFile] + if !ok { + return nil, fmt.Errorf("模型包缺少模型文件: %q", m.ModelFile) + } + // sha256 完整性校验 + if m.ModelSha256 != "" { + sum := sha256.Sum256(modelBytes) + if got := hex.EncodeToString(sum[:]); got != m.ModelSha256 { + return nil, fmt.Errorf("模型文件 sha256 校验失败: 期望 %s 实际 %s", m.ModelSha256, got) + } + } + + return &loadedPackage{Manifest: m, ModelBytes: modelBytes}, nil +} + +func readZipEntry(zf *zip.File, limit int64) ([]byte, error) { + rc, err := zf.Open() + if err != nil { + return nil, err + } + defer rc.Close() + // 限制读取量防 zip 炸弹:多读 1 字节用于判断是否超限 + data, err := io.ReadAll(io.LimitReader(rc, limit+1)) + if err != nil { + return nil, err + } + if int64(len(data)) > limit { + return nil, fmt.Errorf("条目解压大小超过上限 %d 字节", limit) + } + return data, nil +} + +func containsDotDot(p string) bool { + for i := 0; i+1 < len(p); i++ { + if p[i] == '.' && p[i+1] == '.' { + return true + } + } + return false +} diff --git a/wafai/modelpack_test.go b/wafai/modelpack_test.go new file mode 100644 index 0000000..9ab0c1b --- /dev/null +++ b/wafai/modelpack_test.go @@ -0,0 +1,68 @@ +package wafai + +import ( + "os" + "path/filepath" + "testing" +) + +// TestLoadAndScore 端到端:加载 SamWafAI 产出的 .swai 模型,对正常/攻击请求打分。 +// 模型由合成数据训练(examples/gen_synthetic.py),攻击样本应显著高于正常样本。 +func TestLoadAndScore(t *testing.T) { + swaiPath := filepath.Join("testdata", "sample_model.swai") + if _, err := os.Stat(swaiPath); err != nil { + t.Skip("无 sample_model.swai,跳过(由 SamWafAI pipeline 生成)") + } + + d := NewDetector() + if d.IsLoaded() { + t.Fatal("新建检测器不应已加载") + } + // 未加载时打分应失败安全 + if res := d.PredictRequest("GET", "/", "id=1", "", ""); res.Loaded { + t.Fatal("未加载模型时 Loaded 应为 false") + } + + manifest, err := d.LoadFromFile(swaiPath) + if err != nil { + t.Fatalf("加载模型失败: %v", err) + } + if manifest.FeatureVersion != FeatureVersion { + t.Fatalf("特征版本不一致: %s", manifest.FeatureVersion) + } + if !d.IsLoaded() { + t.Fatal("加载后 IsLoaded 应为 true") + } + + normal := d.PredictRequest("GET", "/products", "page=1&sort=asc", "", "Mozilla/5.0") + attack := d.PredictRequest("GET", "/index.php", "id=1' or '1'='1 union select null,null--", "", "sqlmap/1.5") + if !normal.Loaded || !attack.Loaded { + t.Fatal("加载后打分应成功") + } + t.Logf("normal score=%.4f attack score=%.4f block_thr=%.4f", normal.Score, attack.Score, manifest.BlockThreshold) + if attack.Score <= normal.Score { + t.Errorf("攻击样本分数(%.4f)应高于正常样本(%.4f)", attack.Score, normal.Score) + } + + d.Unload() + if d.IsLoaded() { + t.Fatal("卸载后 IsLoaded 应为 false") + } +} + +func TestRejectBadFeatureVersion(t *testing.T) { + // 篡改 manifest 的特征版本应被拒绝(构造最小 zip) + bad := buildTestPackage(t, `{"swai_format_version":1,"feature_version":"v999","model_type":"gbdt","model_file":"model_lgbm.txt","model_sha256":""}`, "dummy") + d := NewDetector() + if _, err := d.LoadFromBytes(bad); err == nil { + t.Fatal("特征版本不匹配应加载失败") + } +} + +func TestRejectPathTraversalEntry(t *testing.T) { + bad := buildTestPackageNamed(t, manifestName, `{"swai_format_version":1,"feature_version":"v1"}`, "../evil.txt", "x") + d := NewDetector() + if _, err := d.LoadFromBytes(bad); err == nil { + t.Fatal("含路径穿越条目应加载失败") + } +} diff --git a/wafai/testdata/feature_golden.json b/wafai/testdata/feature_golden.json new file mode 100644 index 0000000..6f2f3c8 --- /dev/null +++ b/wafai/testdata/feature_golden.json @@ -0,0 +1,853 @@ +{ + "feature_version": "v1", + "feature_names": [ + "path_len", + "query_len", + "body_len", + "ua_len", + "param_count", + "max_param_len", + "path_depth", + "method_idx", + "special_ratio", + "digit_ratio", + "letter_ratio", + "upper_ratio", + "nonascii_ratio", + "entropy", + "decode_layers", + "query_eq_count", + "kw_sql", + "kw_xss", + "kw_cmd", + "kw_traversal", + "kw_proto", + "kw_scanner_ua", + "ngram_0", + "ngram_1", + "ngram_2", + "ngram_3", + "ngram_4", + "ngram_5", + "ngram_6", + "ngram_7", + "ngram_8", + "ngram_9", + "ngram_10", + "ngram_11", + "ngram_12", + "ngram_13", + "ngram_14", + "ngram_15", + "ngram_16", + "ngram_17", + "ngram_18", + "ngram_19", + "ngram_20", + "ngram_21", + "ngram_22", + "ngram_23", + "ngram_24", + "ngram_25", + "ngram_26", + "ngram_27", + "ngram_28", + "ngram_29", + "ngram_30", + "ngram_31", + "ngram_32", + "ngram_33", + "ngram_34", + "ngram_35", + "ngram_36", + "ngram_37", + "ngram_38", + "ngram_39", + "ngram_40", + "ngram_41", + "ngram_42", + "ngram_43", + "ngram_44", + "ngram_45", + "ngram_46", + "ngram_47", + "ngram_48", + "ngram_49", + "ngram_50", + "ngram_51", + "ngram_52", + "ngram_53", + "ngram_54", + "ngram_55", + "ngram_56", + "ngram_57", + "ngram_58", + "ngram_59", + "ngram_60", + "ngram_61", + "ngram_62", + "ngram_63" + ], + "cases": [ + { + "method": "GET", + "path": "/", + "query": "", + "body": "", + "user_agent": "", + "features": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.3333333333333333, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9182958340544896, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "method": "GET", + "path": "/index.php", + "query": "id=1' or '1'='1", + "body": "", + "user_agent": "Mozilla/5.0", + "features": [ + 10.0, + 15.0, + 0.0, + 11.0, + 1.0, + 12.0, + 1.0, + 0.0, + 0.2962962962962963, + 0.1111111111111111, + 0.4444444444444444, + 0.0, + 0.0, + 3.838039816898156, + 0.0, + 2.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.04, + 0.0, + 0.0, + 0.04, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.04, + 0.04, + 0.0, + 0.0, + 0.0, + 0.04, + 0.04, + 0.04, + 0.0, + 0.0, + 0.0, + 0.04, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.04, + 0.0, + 0.0, + 0.16, + 0.04, + 0.0, + 0.0, + 0.0, + 0.04, + 0.04, + 0.04, + 0.0, + 0.0, + 0.0, + 0.04, + 0.0, + 0.04, + 0.04, + 0.0, + 0.0, + 0.04, + 0.0, + 0.04, + 0.0, + 0.04, + 0.0, + 0.0, + 0.0, + 0.0, + 0.04, + 0.0, + 0.04, + 0.0, + 0.0 + ] + }, + { + "method": "POST", + "path": "/login", + "query": "", + "body": "user=admin&pwd=123", + "user_agent": "sqlmap/1.5", + "features": [ + 6.0, + 0.0, + 18.0, + 10.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.15384615384615385, + 0.11538461538461539, + 0.6538461538461539, + 0.0, + 0.0, + 4.315824333525707, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.041666666666666664, + 0.0, + 0.0, + 0.0, + 0.041666666666666664, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.041666666666666664, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.08333333333333333, + 0.0, + 0.0, + 0.0, + 0.0, + 0.041666666666666664, + 0.041666666666666664, + 0.0, + 0.0, + 0.0, + 0.125, + 0.0, + 0.041666666666666664, + 0.0, + 0.041666666666666664, + 0.0, + 0.041666666666666664, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.041666666666666664, + 0.08333333333333333, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.041666666666666664, + 0.0, + 0.125, + 0.0, + 0.0, + 0.08333333333333333, + 0.041666666666666664, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.041666666666666664, + 0.0, + 0.0, + 0.0 + ] + }, + { + "method": "GET", + "path": "/a/b/c", + "query": "q=%3Cscript%3Ealert(1)%3C%2Fscript%3E", + "body": "", + "user_agent": "curl/7.0", + "features": [ + 6.0, + 37.0, + 0.0, + 8.0, + 1.0, + 25.0, + 3.0, + 0.0, + 0.3142857142857143, + 0.02857142857142857, + 0.6, + 0.0, + 0.0, + 4.09314980247381, + 1.0, + 1.0, + 0.0, + 3.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.09090909090909091, + 0.0, + 0.0, + 0.030303030303030304, + 0.030303030303030304, + 0.030303030303030304, + 0.0, + 0.030303030303030304, + 0.0, + 0.0, + 0.0, + 0.06060606060606061, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06060606060606061, + 0.0, + 0.0, + 0.0, + 0.030303030303030304, + 0.0, + 0.0, + 0.0, + 0.0, + 0.030303030303030304, + 0.09090909090909091, + 0.0, + 0.0, + 0.030303030303030304, + 0.06060606060606061, + 0.0, + 0.0, + 0.0, + 0.0, + 0.030303030303030304, + 0.030303030303030304, + 0.0, + 0.030303030303030304, + 0.0, + 0.06060606060606061, + 0.0, + 0.06060606060606061, + 0.0, + 0.0, + 0.0, + 0.0, + 0.030303030303030304, + 0.0, + 0.0, + 0.0, + 0.0, + 0.030303030303030304, + 0.06060606060606061, + 0.0, + 0.0, + 0.06060606060606061, + 0.0, + 0.0, + 0.0, + 0.030303030303030304 + ] + }, + { + "method": "GET", + "path": "/download", + "query": "file=../../../../etc/passwd", + "body": "", + "user_agent": "", + "features": [ + 9.0, + 27.0, + 0.0, + 0.0, + 1.0, + 22.0, + 1.0, + 0.0, + 0.39473684210526316, + 0.0, + 0.5526315789473685, + 0.0, + 0.0, + 3.7146469211675206, + 0.0, + 1.0, + 0.0, + 0.0, + 1.0, + 5.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1111111111111111, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05555555555555555, + 0.0, + 0.027777777777777776, + 0.0, + 0.05555555555555555, + 0.0, + 0.0, + 0.05555555555555555, + 0.027777777777777776, + 0.027777777777777776, + 0.0, + 0.05555555555555555, + 0.027777777777777776, + 0.1111111111111111, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05555555555555555, + 0.0, + 0.0, + 0.0, + 0.05555555555555555, + 0.027777777777777776, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.027777777777777776, + 0.027777777777777776, + 0.027777777777777776, + 0.0, + 0.027777777777777776, + 0.0, + 0.0, + 0.0, + 0.027777777777777776, + 0.1111111111111111, + 0.027777777777777776, + 0.0, + 0.027777777777777776 + ] + }, + { + "method": "GET", + "path": "/cmd", + "query": "x=%2e%2e%252fetc%252fpasswd", + "body": "", + "user_agent": "", + "features": [ + 4.0, + 27.0, + 0.0, + 0.0, + 1.0, + 13.0, + 1.0, + 0.0, + 0.2857142857142857, + 0.0, + 0.6190476190476191, + 0.0, + 0.0, + 3.689703732199547, + 2.0, + 1.0, + 0.0, + 0.0, + 1.0, + 2.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05263157894736842, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10526315789473684, + 0.0, + 0.05263157894736842, + 0.0, + 0.10526315789473684, + 0.0, + 0.0, + 0.10526315789473684, + 0.05263157894736842, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05263157894736842, + 0.0, + 0.0, + 0.0, + 0.05263157894736842, + 0.0, + 0.05263157894736842, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05263157894736842, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05263157894736842, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05263157894736842, + 0.05263157894736842, + 0.05263157894736842, + 0.05263157894736842, + 0.05263157894736842, + 0.0, + 0.0 + ] + }, + { + "method": "PUT", + "path": "/upload/中文路径", + "query": "name=测试&v=1", + "body": "数据body", + "user_agent": "Go-http-client/1.1", + "features": [ + 20.0, + 15.0, + 10.0, + 18.0, + 2.0, + 6.0, + 2.0, + 2.0, + 0.10638297872340426, + 0.02127659574468085, + 0.3191489361702128, + 0.0, + 0.5106382978723404, + 5.001397362315936, + 0.0, + 2.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.022222222222222223, + 0.0, + 0.044444444444444446, + 0.022222222222222223, + 0.022222222222222223, + 0.0, + 0.0, + 0.044444444444444446, + 0.0, + 0.0, + 0.0, + 0.044444444444444446, + 0.022222222222222223, + 0.022222222222222223, + 0.0, + 0.0, + 0.022222222222222223, + 0.0, + 0.044444444444444446, + 0.044444444444444446, + 0.0, + 0.06666666666666667, + 0.022222222222222223, + 0.022222222222222223, + 0.0, + 0.0, + 0.044444444444444446, + 0.0, + 0.022222222222222223, + 0.044444444444444446, + 0.0, + 0.0, + 0.022222222222222223, + 0.0, + 0.022222222222222223, + 0.0, + 0.022222222222222223, + 0.0, + 0.022222222222222223, + 0.022222222222222223, + 0.022222222222222223, + 0.0, + 0.0, + 0.022222222222222223, + 0.0, + 0.022222222222222223, + 0.06666666666666667, + 0.044444444444444446, + 0.0, + 0.0, + 0.022222222222222223, + 0.0, + 0.022222222222222223, + 0.0, + 0.0, + 0.022222222222222223, + 0.022222222222222223, + 0.0, + 0.0, + 0.0, + 0.044444444444444446, + 0.0, + 0.0, + 0.0 + ] + }, + { + "method": "POST", + "path": "/api", + "query": "", + "body": "{\"q\":\"union select null,null--\"}", + "user_agent": "python-requests/2.0", + "features": [ + 4.0, + 0.0, + 32.0, + 19.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.2894736842105263, + 0.0, + 0.6052631578947368, + 0.0, + 0.0, + 4.133071514059368, + 0.0, + 0.0, + 3.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.027777777777777776, + 0.0, + 0.027777777777777776, + 0.0, + 0.0, + 0.0, + 0.0, + 0.027777777777777776, + 0.05555555555555555, + 0.027777777777777776, + 0.027777777777777776, + 0.0, + 0.0, + 0.027777777777777776, + 0.0, + 0.0, + 0.08333333333333333, + 0.027777777777777776, + 0.0, + 0.05555555555555555, + 0.0, + 0.0, + 0.0, + 0.027777777777777776, + 0.027777777777777776, + 0.0, + 0.0, + 0.027777777777777776, + 0.0, + 0.0, + 0.0, + 0.0, + 0.08333333333333333, + 0.0, + 0.0, + 0.0, + 0.0, + 0.027777777777777776, + 0.0, + 0.027777777777777776, + 0.027777777777777776, + 0.027777777777777776, + 0.0, + 0.08333333333333333, + 0.0, + 0.027777777777777776, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.027777777777777776, + 0.027777777777777776, + 0.027777777777777776, + 0.027777777777777776, + 0.0, + 0.05555555555555555, + 0.0, + 0.0, + 0.027777777777777776, + 0.027777777777777776, + 0.0 + ] + } + ] +} \ No newline at end of file diff --git a/wafai/testdata/sample_model.swai b/wafai/testdata/sample_model.swai new file mode 100644 index 0000000000000000000000000000000000000000..04077bbc81b60c7022239567baa743011a844545 GIT binary patch literal 265546 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

i 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 literal 0 HcmV?d00001 diff --git a/wafai/testhelper_test.go b/wafai/testhelper_test.go new file mode 100644 index 0000000..d8fa11d --- /dev/null +++ b/wafai/testhelper_test.go @@ -0,0 +1,33 @@ +package wafai + +import ( + "archive/zip" + "bytes" + "testing" +) + +// buildTestPackage 构造一个含 manifest + 单模型文件的内存 zip(仅供测试)。 +func buildTestPackage(t *testing.T, manifestJSON, modelContent string) []byte { + t.Helper() + return buildTestPackageNamed(t, manifestName, manifestJSON, "model_lgbm.txt", modelContent) +} + +func buildTestPackageNamed(t *testing.T, manifestEntry, manifestJSON, modelEntry, modelContent string) []byte { + t.Helper() + var buf bytes.Buffer + zw := zip.NewWriter(&buf) + if w, err := zw.Create(manifestEntry); err == nil { + _, _ = w.Write([]byte(manifestJSON)) + } else { + t.Fatal(err) + } + if w, err := zw.Create(modelEntry); err == nil { + _, _ = w.Write([]byte(modelContent)) + } else { + t.Fatal(err) + } + if err := zw.Close(); err != nil { + t.Fatal(err) + } + return buf.Bytes() +} diff --git a/wafdb/migrations_core.go b/wafdb/migrations_core.go index 8f53e11..188c14c 100644 --- a/wafdb/migrations_core.go +++ b/wafdb/migrations_core.go @@ -989,6 +989,54 @@ func RunCoreDBMigrations(db *gorm.DB) error { return tx.Migrator().DropTable(&model.WafAppChangeLog{}) }, }, + { + ID: "202606120003_add_waf_log_label_marks_table", + Migrate: func(tx *gorm.DB) error { + zlog.Info("迁移 202606120003: 创建 waf_log_label_marks 表(AI训练标签人工修正)") + if err := tx.AutoMigrate(&model.WafLogLabelMark{}); err != nil { + return fmt.Errorf("创建 waf_log_label_marks 表失败: %w", err) + } + zlog.Info("waf_log_label_marks 表创建成功") + return nil + }, + Rollback: func(tx *gorm.DB) error { + zlog.Info("回滚 202606120003: 删除 waf_log_label_marks 表") + return tx.Migrator().DropTable(&model.WafLogLabelMark{}) + }, + }, + { + ID: "202606120004_add_label_mark_attack_type", + Migrate: func(tx *gorm.DB) error { + zlog.Info("迁移 202606120004: 为 waf_log_label_marks 添加 attack_type 字段") + if tx.Migrator().HasColumn(&model.WafLogLabelMark{}, "attack_type") { + return nil + } + if err := tx.Migrator().AddColumn(&model.WafLogLabelMark{}, "AttackType"); err != nil { + return fmt.Errorf("添加 attack_type 字段失败: %w", err) + } + return nil + }, + Rollback: func(tx *gorm.DB) error { + if tx.Migrator().HasColumn(&model.WafLogLabelMark{}, "attack_type") { + return tx.Migrator().DropColumn(&model.WafLogLabelMark{}, "AttackType") + } + return nil + }, + }, + { + ID: "202606120005_add_label_mark_snapshot_fields", + Migrate: func(tx *gorm.DB) error { + zlog.Info("迁移 202606120005: 为 waf_log_label_marks 添加请求快照字段") + // AutoMigrate 仅新增缺失列,幂等安全 + if err := tx.AutoMigrate(&model.WafLogLabelMark{}); err != nil { + return fmt.Errorf("同步 waf_log_label_marks 快照字段失败: %w", err) + } + return nil + }, + Rollback: func(tx *gorm.DB) error { + return nil + }, + }, }) // 执行迁移 diff --git a/wafdb/migrations_log.go b/wafdb/migrations_log.go index dd75ff2..ab729c3 100644 --- a/wafdb/migrations_log.go +++ b/wafdb/migrations_log.go @@ -188,6 +188,46 @@ func RunLogDBMigrations(db *gorm.DB) error { return nil }, }, + // 迁移6: 为 web_logs 表添加 ai_score 字段(AI智能检测得分,支持集中查看观察/拦截) + { + ID: "202606120001_add_web_logs_ai_score", + Migrate: func(tx *gorm.DB) error { + zlog.Info("迁移 202606120001: 为 web_logs 表添加 ai_score 字段") + + if tx.Migrator().HasColumn(&innerbean.WebLog{}, "ai_score") { + zlog.Info("ai_score 字段已存在,跳过添加") + return nil + } + + if err := tx.Migrator().AddColumn(&innerbean.WebLog{}, "AI_SCORE"); err != nil { + return fmt.Errorf("添加 ai_score 字段失败: %w", err) + } + + zlog.Info("ai_score 字段添加成功(用于记录AI检测得分,支持观察/拦截集中查看)") + return nil + }, + Rollback: func(tx *gorm.DB) error { + zlog.Info("回滚 202606120001: 删除 web_logs 表的 ai_score 字段") + if tx.Migrator().HasColumn(&innerbean.WebLog{}, "ai_score") { + return tx.Migrator().DropColumn(&innerbean.WebLog{}, "AI_SCORE") + } + return nil + }, + }, + // 迁移7: 为 web_logs 表的 ai_score 建索引(AI看板按 ai_score>0 过滤,命中是极小子集, + // 走索引可避免全表扫描;复合 day 兼顾按天范围过滤与趋势排序) + { + ID: "202606120002_add_web_logs_ai_score_index", + Migrate: func(tx *gorm.DB) error { + zlog.Info("迁移 202606120002: 为 web_logs.ai_score 创建索引") + return safeCreateIndex(tx, "web_logs", "idx_web_logs_ai_score_day", + "CREATE INDEX IF NOT EXISTS idx_web_logs_ai_score_day ON web_logs (ai_score, day)") + }, + Rollback: func(tx *gorm.DB) error { + zlog.Info("回滚 202606120002: 删除 web_logs.ai_score 索引") + return safeDropIndex(tx, "web_logs", "idx_web_logs_ai_score_day") + }, + }, }) // 执行迁移 diff --git a/wafenginecore/checkai.go b/wafenginecore/checkai.go new file mode 100644 index 0000000..642de2a --- /dev/null +++ b/wafenginecore/checkai.go @@ -0,0 +1,81 @@ +package wafenginecore + +import ( + "SamWaf/global" + "SamWaf/innerbean" + "SamWaf/model/detection" + "SamWaf/model/wafenginmodel" + "net/http" + "net/url" +) + +/* +* +AI智能检测 + +补现有规则引擎(正则 / libinjection / OWASP CRS)的盲区:变形绕过、混淆、未知 payload。 +推理走纯 Go 内嵌 GBDT(wafai.Detector + dmitryikh/leaves),失败安全: +模型未加载/打分异常一律放行,绝不影响业务转发。 + +进入条件(在 wafengine 检测链中由调用方判断): + - 全局开关 global.GCONFIG_AI_ENABLE == 1 + - 站点开关 hostDefense.DEFENSE_AI == 1 + +工作模式 global.GCONFIG_AI_MODE: + - "observe":仅记录命中(达到观察阈值即在日志标注 AI 分数),不拦截 + - "block" :达到模型建议拦截阈值则拦截,介于观察/拦截阈值之间则仅记录 +*/ +func (waf *WafEngine) CheckAI(r *http.Request, weblogbean *innerbean.WebLog, formValue url.Values, hostTarget *wafenginmodel.HostSafe, globalHostTarget *wafenginmodel.HostSafe) detection.Result { + result := detection.Result{ + JumpGuardResult: false, + IsBlock: false, + Title: "", + Content: "", + } + + detector := global.GWAF_AI_DETECTOR + if detector == nil || !detector.IsLoaded() { + return result + } + + // 取请求关键字段做特征:path 与 query 分离,body 用解密后的明文 + path := "" + if r != nil && r.URL != nil { + path = r.URL.Path + } + body := weblogbean.BODY + if body == "" { + body = weblogbean.POST_FORM + } + + pred := detector.PredictRequest(weblogbean.METHOD, path, weblogbean.RawQuery, body, weblogbean.USER_AGENT) + if !pred.Loaded { + // 失败安全:未命中 + return result + } + + // 低于观察阈值:忽略(不记录分数,避免污染正常日志) + if pred.Score < pred.ObserveThreshold { + return result + } + + // RULE 用稳定的类别标签(不含分数),便于"按规则汇总"统计;分数单独存 AI_SCORE 列 + title := "AI检测:" + pred.Category + weblogbean.RISK_LEVEL = 2 + weblogbean.AI_SCORE = pred.Score + + // block 模式且达到拦截阈值 -> 拦截(由 handleBlock 走 EchoErrorInfo 记录为"阻止") + if global.GCONFIG_AI_MODE == "block" && pred.Score >= pred.BlockThreshold { + result.IsBlock = true + result.Title = title + result.Content = "请正确访问" + return result + } + + // 观察命中(observe 模式,或 block 模式下分数在[观察,拦截)之间): + // 标记为"仅记录",让请求照常放行,但在访问日志里可按 log_only_mode 筛出、 + // 并通过 ai_score 列排序/查看——对标 AWS WAF Count / Cloudflare log 动作。 + weblogbean.RULE = title + weblogbean.LogOnlyMode = 1 + return result +} diff --git a/wafenginecore/wafengine.go b/wafenginecore/wafengine.go index 19e3771..d7cccd2 100644 --- a/wafenginecore/wafengine.go +++ b/wafenginecore/wafengine.go @@ -89,6 +89,11 @@ func inferAttackType(ruleTitle string) string { return "owasp_attack" } + // AI 智能检测:Title 格式为 "AI检测:score=x.xx",需在 SQL/RCE 等关键词匹配之前优先处理 + if strings.HasPrefix(ruleTitle, "ai检测") { + return "ai_attack" + } + // CC攻击 if strings.Contains(ruleTitle, "cc") || strings.Contains(ruleTitle, "频次") || strings.Contains(ruleTitle, "rate limit") { return "cc_attack" @@ -556,6 +561,12 @@ func (waf *WafEngine) ServeHTTP(w http.ResponseWriter, r *http.Request) { if handleBlock(waf.CheckRule) { return } + //AI智能检测(全局开关开启且站点开启,规则抓确定的,AI 抓漏网的) + if global.GCONFIG_AI_ENABLE == 1 && hostDefense.DEFENSE_AI == 1 { + if handleBlock(waf.CheckAI) { + return + } + } //检测敏感词 if hostDefense.DEFENSE_SENSITIVE == 1 { if handleBlock(waf.CheckSensitive) { diff --git a/wafmangeweb/localserver.go b/wafmangeweb/localserver.go index 310514e..6af83dc 100644 --- a/wafmangeweb/localserver.go +++ b/wafmangeweb/localserver.go @@ -173,6 +173,8 @@ func (web *WafWebManager) initRouter(r *gin.Engine) { router.ApiGroupApp.InitSqlQueryRouter(TokenOnlyRouterGroup) // 应用管理:可执行任意命令,拒绝 API Key,功能默认关闭 router.ApiGroupApp.InitWafAppRouter(TokenOnlyRouterGroup) + // AI模型管理与训练数据导出:模型会被引擎加载、数据出库,拒绝 API Key + router.ApiGroupApp.InitWafAIRouter(TokenOnlyRouterGroup) } // 保存 gin.Engine 引用供 API 文档生成使用 diff --git a/waftask/task_config.go b/waftask/task_config.go index 21e7934..3da7b2d 100644 --- a/waftask/task_config.go +++ b/waftask/task_config.go @@ -77,6 +77,9 @@ func setConfigIntValue(name string, value int64, change int) { case "enable_owasp": global.GCONFIG_RECORD_ENABLE_OWASP = value break + case "ai_enable": + global.GCONFIG_AI_ENABLE = value + break case "owasp_block_threshold": if value <= 0 { value = 7 @@ -228,6 +231,15 @@ func setConfigStringValue(name string, value string, change int) { // 同步到 wafowasp 热路径,使 DetectionOnly "本该拦截" 的 INFO 日志能按当前模式生效 wafowasp.SetEngineMode(global.GCONFIG_OWASP_MODE) break + case "ai_mode": + switch value { + case "observe", "block": + global.GCONFIG_AI_MODE = value + default: + zlog.Warn("invalid ai_mode value, fallback to observe", value) + global.GCONFIG_AI_MODE = "observe" + } + break case "kafka_url": global.GCONFIG_RECORD_KAFKA_URL = value break @@ -394,6 +406,8 @@ func TaskLoadSetting(initLoad bool) { updateConfigIntItem(initLoad, "system", "login_max_error_time", global.GCONFIG_RECORD_LOGIN_MAX_ERROR_TIME, "登录周期里错误最大次数 请大于0 ", "int", "", configMap) updateConfigIntItem(initLoad, "system", "login_limit_mintutes", global.GCONFIG_RECORD_LOGIN_LIMIT_MINTUTES, "登录错误记录周期 单位分钟数,默认1分钟", "int", "", configMap) updateConfigIntItem(initLoad, "system", "enable_owasp", global.GCONFIG_RECORD_ENABLE_OWASP, "启动OWASP数据检测(1启动 0关闭)", "int", "", configMap) + updateConfigIntItem(initLoad, "system", "ai_enable", global.GCONFIG_AI_ENABLE, "启动AI智能检测总开关(1启动 0关闭,需先在AI模型管理上传模型包并在站点开启)", "int", "", configMap) + updateConfigStringItem(initLoad, "system", "ai_mode", global.GCONFIG_AI_MODE, "AI检测工作模式:observe(仅记录/观察) block(达拦截阈值则拦截)", "options", "observe|仅记录,block|拦截", configMap) updateConfigIntItem(initLoad, "ssl", "enable_http_80", global.GCONFIG_RECORD_ENABLE_HTTP_80, "启动80端口服务(为自动申请证书使用 HTTP文件验证类型需要,DNS验证不需要)", "int", "", configMap) updateConfigIntItem(initLoad, "ssl", "sslorder_expire_day", global.GCONFIG_RECORD_SSLOrder_EXPIRE_DAY, "自动续期检测小于多少天开始发起自动申请 默认30天", "int", "", configMap)