# WebErp 安全漏洞自查工作自证材料

报告日期：2026-06-25  
报告类型：企业安全漏洞定期自查与风险规避自证材料  
适用范围：WebErp / weberp Spring Boot 后端项目  
报告口径：对外自证，展示已开展的安全自查、已建设的风险规避措施、风险识别记录与后续处置安排。

## 1. 项目概况与扫描范围

本次自查对象为 WebErp 后端工程，核心模块为 `WebErp/weberp`。项目采用 Spring Boot、Maven、多数据库驱动、MyBatis、文件处理、Office 文档转换、远程资源下载、JWT 登录态、GraalJS 表达式执行等能力。

本次自查覆盖以下范围：

| 类别 | 覆盖内容 | 证据来源 |
| --- | --- | --- |
| 依赖与构建 | Maven 父子 POM、依赖树、关键第三方组件版本 | `WebErp/pom.xml`、`WebErp/weberp/pom.xml`、`weberp/target/dependency-tree.txt` |
| 配置安全 | 数据库连接、运行配置、跨域配置、脚本执行开关 | `application.properties`、`CorsConfig.java`、`JsEngine.java` |
| 认证授权 | Spring Security 入口放行、业务层登录校验、公开接口白名单 | `SecurityConfig.java`、`BaseHandler.java`、`PublicApiRegistry.java` |
| SQL 安全 | MyBatis 动态 SQL、SQL 片段校验、字段名白名单 | `mapper/*.xml`、`SqlSafetyGuard.java`、SQL Provider 实现 |
| 文件与下载 | 文件路径校验、压缩包解压、远程下载、在线预览 | `FileUtil.java`、`ZipUtil.java`、`RemoteDownloadGuard.java`、`ToolsHandler.java` |
| 脚本与命令 | GraalJS 沙箱配置、系统命令执行点复核 | `JsEngine.java`、`OfficeUtil.java`、`FormatFactoryUtil.java` |
| 自动化证据 | 安全回归测试、依赖树生成、工具可用性确认 | `SecurityRegressionTest.java`、Maven 命令执行记录 |

说明：本报告为安全漏洞自查工作留档材料，不等同于第三方渗透测试报告或等保测评报告。

## 2. 自查方法与证据来源

本次自查采用静态代码扫描、配置审阅、依赖版本核验、关键安全控制点测试和公开漏洞库查询相结合的方式。

已执行并形成证据的检查项：

| 检查项 | 方法 | 结果 |
| --- | --- | --- |
| 安全回归测试 | 执行 `mvn -q -Dtest=SecurityRegressionTest test` | 通过，覆盖路径越权、Zip Slip、CORS、远程下载限制、SQL 片段校验、公开接口白名单等场景 |
| Maven 依赖树 | 执行 Maven dependency tree 并输出到 `weberp/target/dependency-tree.txt` | 已生成，可用于依赖版本留档 |
| OSV 漏洞查询 | 对关键 Maven 组件进行 OSV API 查询 | 发现 Jackson databind 仍有一项新披露风险需跟踪 |
| 工具环境确认 | 检查本机 `osv-scanner` 与 `dependency-check` 命令 | 当前环境未安装，已列入后续工具化改进 |
| 敏感配置审阅 | 扫描配置文件与安全相关关键字 | 发现数据库连接配置仍需脱敏入库治理，报告正文已脱敏展示 |

## 3. 风险识别记录台账

| 编号 | 风险名称 | 位置 | 等级 | 影响 | 现状证据 | 已有控制 | 处置方案 | 优先级 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| R-001 | 第三方依赖漏洞风险 | `com.fasterxml.jackson.core:jackson-databind:2.18.8` | 高 | 特定反序列化忽略属性绕过场景下，可能影响对象字段保护策略 | OSV 查询命中 `GHSA-5jmj-h7xm-6q6v`；OSV 标注修复版本为 `2.18.9`，但当前 Maven Central 未查询到该版本，本地 Maven 解析也失败 | Jackson 已从旧版本升级到当前可打包版本；父 POM 已统一版本管理，避免父子 POM 版本漂移 | 持续跟踪可用修复版本；若 `2.18.9` 可解析则优先小版本升级；若不可用，则评估升级到后续可用安全版本并补跑兼容测试 | P0 |
| R-002 | 配置文件中存在真实数据库连接信息 | `weberp/src/main/resources/application.properties` 第 12 行附近 | 高 | 若配置文件被外发或提交到共享仓库，可能导致数据库访问凭证泄露 | 配置文件中仍有真实数据库连接串；本报告仅记录脱敏形态：`jdbc:dm://***:****/****?凭证=***` | 已约定生产真实配置应放在部署服务器本地；报告中不展示真实地址、账号或密码 | 立即轮换已暴露凭证；将仓库配置改为示例值；补充 `.gitignore` 排除本地与生产真实配置文件；对历史提交和制品进行泄露排查 | P0 |
| R-003 | 动态接口入口开放面较大 | `SecurityConfig.java`、`BaseHandler.java`、`PublicApiRegistry.java` | 中 | 若业务层校验缺失，可能导致未授权访问 | Spring Security 对动态 `/Api/**` 分发入口放行；业务层通过 `@RequestCheck` 和公开接口白名单进行控制 | `BaseHandler` 已引入 `PublicApiRegistry`，未列入白名单的 `CheckLogin=false` 方法会回落为需要登录；未匹配请求默认拒绝 | 持续审计所有 `CheckLogin=false` 方法；新增公开接口必须进入白名单并经过安全复核；对模块数据、文件预览、下载接口默认保持登录态要求 | P0 |
| R-004 | MyBatis 动态 SQL 拼接风险 | `mapper/*.xml` 中 `${...}` 片段及 SQL Provider | 高 | 若外部输入直接进入 SQL 片段，可能造成 SQL 注入或越权查询 | Mapper 文件中仍存在字段名、条件片段和完整 SQL 拼接点 | 已新增 `SqlSafetyGuard`；部分入口已对字段名、只读查询和条件片段进行白名单或危险关键字拦截 | 对所有 `${...}` 来源建立清单；字段名改为服务端白名单；条件片段逐步参数化；无法立即改造的入口必须先接入 `SqlSafetyGuard` | P0 |
| R-005 | 远程 URL 下载与服务端请求风险 | `FileUtil.java`、`ToolsHandler.java`、`WebUtil.java`、`CreateWordUtil.java`、`DateTimeUtil.java` | 高 | 若允许用户控制 URL，可能触发 SSRF、内网探测或下载超限 | `RemoteDownloadGuard` 已接入部分下载流程；仍存在多个 URL 请求入口需要继续统一治理 | `RemoteDownloadGuard` 限制协议、私有地址、链路本地地址、组播地址、重定向跳数和下载大小；配置项默认禁止私有地址 | 将残留 URL 请求入口统一接入远程下载守卫；重定向每跳复核；对在线预览类接口补充域名白名单或登录态要求 | P0 |
| R-006 | 文件路径穿越与压缩包解压风险 | `FileUtil.java`、`ZipUtil.java` | 中 | 文件读写或解压过程若未限制根目录，可能覆盖非授权路径 | 已有路径规范化、根目录匹配和压缩条目路径校验；回归测试覆盖路径越权和 Zip Slip | `ZipUtil` 对解压目标路径进行标准化并校验必须位于目标目录内；`FileUtil` 对文件虚拟路径和物理路径做规范化处理 | 持续保留回归测试；新增文件读写入口必须复用路径校验；压缩包处理增加大小和条目数量限制作为后续优化 | P1 |
| R-007 | GraalJS 脚本全访问风险 | `JsEngine.java`、`application.properties` | 中 | 若脚本全访问开启，表达式可能访问宿主环境能力 | `app.js.allow-all-access=false` 已配置；代码中仅在显式开启时允许全访问并输出告警 | 默认关闭 GraalJS 全访问；表达式执行使用独立上下文和缓存容量限制 | 保持默认关闭；若业务确需开启，必须形成变更审批、日志告警和最小权限说明；补充脚本危险语句测试 | P1 |
| R-008 | 系统命令执行点需持续复核 | `OfficeUtil.java`、`FormatFactoryUtil.java` | 中 | 若命令路径或参数可被外部输入污染，可能造成命令执行风险 | 代码中存在系统命令调用点，主要用于文件权限和格式转换 | 已将该类入口列为重点复核项；目前未在本报告中确认存在可利用外部输入链 | 对可执行文件路径、参数来源和工作目录进行白名单校验；禁止拼接 shell 字符串；记录命令执行审计日志 | P1 |
| R-009 | CORS 白名单与响应头暴露需环境化治理 | `CorsConfig.java` | 中 | 若跨域源配置过宽，可能扩大凭证跨域风险 | CORS 已采用白名单并允许携带凭证；测试覆盖不暴露全部响应头和拒绝异常方法 | 未使用通配源；限制请求方法；仅暴露必要响应头 | 将不同环境的允许源迁移到配置项；生产环境定期审计白名单；下线临时调试源 | P1 |
| R-010 | 安全扫描工具链不完整 | 本机工具环境 | 低 | 无法在本机直接运行标准化 OSV Scanner 或 OWASP Dependency-Check | 当前命令行未安装 `osv-scanner` 与 `dependency-check` | 已通过 OSV API 和 Maven 依赖树进行替代性核验 | 在 CI 或发布机补齐依赖漏洞扫描工具；形成扫描报告归档；对高危漏洞建立阻断规则 | P2 |
| R-011 | SQL 控制台日志与敏感信息日志风险 | `application.properties`、SQL 调试配置 | 中 | 开启 SQL 输出时，可能在日志中暴露业务字段、查询条件或敏感参数 | 配置中存在 MyBatis 控制台日志相关项，当前仍需按环境复核 | 部分日志级别已关闭；安全回归测试覆盖部分响应头与令牌场景 | 生产环境关闭 SQL 明文输出；日志脱敏账号、手机号、凭证和令牌；建立日志留存与访问控制 | P1 |

## 4. 已有安全控制与风险规避措施

| 控制领域 | 已有措施 | 自证说明 |
| --- | --- | --- |
| 依赖治理 | Maven 父 POM 统一管理关键组件版本；子模块保留真实业务依赖 | 降低父子 POM 版本漂移和重复依赖风险，便于后续集中升级 |
| 默认拒绝 | Spring Security 未匹配请求使用默认拒绝策略 | 减少非预期接口暴露 |
| 公开接口收敛 | `PublicApiRegistry` 集中维护公开方法 | 登录、验证码、基础系统信息等接口可公开；模块业务数据类接口默认需登录 |
| 登录态校验 | `BaseHandler` 基于 `@RequestCheck` 统一执行登录和参数校验 | 对动态分发 API 提供统一拦截层 |
| SQL 防护 | `SqlSafetyGuard` 提供字段名、只读查询和条件片段校验 | 对高风险动态 SQL 入口先建立拦截，再逐步参数化 |
| SSRF 防护 | `RemoteDownloadGuard` 限制协议、地址类型、重定向和下载大小 | 对远程下载流程建立边界控制 |
| 文件路径防护 | 文件路径规范化、根目录校验、压缩包条目路径校验 | 防止路径穿越和 Zip Slip |
| CORS 控制 | 采用具体源白名单，未使用任意源通配 | 携带凭证场景下减少跨域滥用风险 |
| JS 沙箱 | GraalJS 全访问默认关闭 | 降低表达式执行访问宿主能力的风险 |
| 回归测试 | `SecurityRegressionTest` 覆盖多项安全控制 | 形成可重复验证证据 |

## 5. 风险处置方案与整改优先级

| 优先级 | 处置事项 | 目标完成标准 |
| --- | --- | --- |
| P0 | 轮换并移除已提交配置中的真实数据库凭证 | 仓库配置仅保留示例值；真实配置仅存在于部署服务器本地；历史暴露凭证完成轮换 |
| P0 | 跟踪 Jackson databind 修复版本 | 修复版本可解析后完成升级、打包和安全回归测试；若采用后续可用安全版本，完成兼容验证 |
| P0 | 动态 SQL 治理 | 所有 `${...}` 来源登记；外部输入不得直接进入 SQL 片段；关键路径完成白名单或参数化 |
| P0 | 远程 URL 请求统一防护 | 所有用户可控 URL 请求入口接入 `RemoteDownloadGuard` 或域名白名单；重定向每跳校验 |
| P0 | 公开接口白名单治理 | `CheckLogin=false` 方法均有业务必要性说明；未列入公开白名单的接口必须要求登录 |
| P1 | CORS 与日志生产化治理 | CORS 源按环境配置；生产关闭 SQL 明文输出；日志中敏感字段完成脱敏 |
| P1 | 命令执行点复核 | 可执行文件路径与参数来源白名单化；禁止 shell 字符串拼接；补充审计日志 |
| P2 | 安全扫描工具链补齐 | CI 或发布流程中加入 OSV Scanner 或 OWASP Dependency-Check，并归档扫描结果 |

## 6. 定期漏洞自查机制

建议建立以下周期化机制，并将结果作为企业安全漏洞自查自证材料留档：

| 周期 | 自查动作 | 输出材料 |
| --- | --- | --- |
| 每月 | 依赖漏洞扫描、Maven 依赖树归档、关键漏洞公告复核 | 依赖漏洞扫描记录、风险处置台账 |
| 每季度 | 代码安全自查，重点检查鉴权、SQL、文件、远程请求、脚本执行、日志脱敏 | 季度安全自查报告、整改跟踪表 |
| 每次发版前 | 执行安全回归测试、检查配置是否含真实凭证、复核新增公开接口 | 发版安全检查清单、测试结果截图或日志 |
| 重大漏洞公告后 | 针对影响组件进行应急排查、临时规避、升级验证 | 应急响应记录、修复验证记录 |
| 配置变更时 | 复核数据库、Redis、短信、推送、跨域源等配置 | 配置变更审批与脱敏检查记录 |

建议固定归档材料：

- Maven 依赖树与关键依赖版本清单。
- OSV Scanner 或 OWASP Dependency-Check 报告。
- 安全回归测试结果。
- 风险识别记录与处置状态表。
- 配置脱敏检查记录。
- 公开接口白名单审计记录。

## 7. 附件证据清单

| 证据项 | 文件或命令 | 说明 |
| --- | --- | --- |
| 安全回归测试 | `mvn -q -Dtest=SecurityRegressionTest test` | 已通过，覆盖路径、压缩包、CORS、远程下载、SQL 与公开接口控制 |
| 依赖树 | `weberp/target/dependency-tree.txt` | 已生成，用于记录当前第三方组件版本 |
| 依赖漏洞来源 | [OSV GHSA-5jmj-h7xm-6q6v](https://osv.dev/vulnerability/GHSA-5jmj-h7xm-6q6v) | Jackson databind 新披露风险来源 |
| 鉴权控制 | `SecurityConfig.java`、`BaseHandler.java`、`PublicApiRegistry.java` | 入口放行、业务层校验与公开接口白名单 |
| SQL 控制 | `SqlSafetyGuard.java`、`mapper/*.xml` | 动态 SQL 风险识别与部分防护落点 |
| 下载控制 | `RemoteDownloadGuard.java`、`FileUtil.java` | 远程下载协议、地址、重定向和大小控制 |
| 文件控制 | `FileUtil.java`、`ZipUtil.java` | 路径规范化、根目录校验和 Zip Slip 防护 |
| 脚本控制 | `JsEngine.java`、`application.properties` | GraalJS 全访问默认关闭 |
| 工具环境限制 | `osv-scanner --version`、`dependency-check --version` | 当前本机未安装，建议在 CI 或发布机补齐 |

## 8. 结论

本项目已开展面向依赖、配置、认证授权、SQL、文件处理、远程下载、脚本执行、跨域和回归测试的安全漏洞自查工作，并已具备多项风险规避措施。当前风险主要集中在配置凭证治理、Jackson 新披露漏洞跟踪、动态 SQL 全量收敛、残留远程 URL 请求统一防护和生产环境安全配置固化。

上述事项已纳入整改跟踪台账。后续通过定期扫描、发版前安全检查、重大漏洞应急复核和自动化安全回归测试，持续证明企业具备安全漏洞风险识别、处置和规避能力。
