Files
Java_Dm/docs/security-vulnerability-self-check-report-2026-06-24.md
T
2026-07-03 16:23:51 +08:00

178 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 安全漏洞自查工作自证材料
报告日期:2026-06-24
项目名称:LSERP-MES / WebErp Java 后端
报告用途:企业定期安全漏洞自查、风险识别记录、风险规避与处置方案留档
报告性质:代码与配置层面的自查材料,不替代第三方渗透测试、等保测评或生产环境安全审计。
## 1. 项目概况与扫描范围
本次自查覆盖当前工作区 `E:\JavaBackend\Java_DmK` 下的 Java 后端项目,重点模块为:
| 范围 | 说明 |
| --- | --- |
| `WebErp/pom.xml` | Maven 父模块、依赖管理、仓库配置 |
| `WebErp/weberp/pom.xml` | Spring Boot 子模块、运行依赖、构建配置 |
| `WebErp/weberp/src/main/resources/application.properties` | 应用端口、数据源、Redis、JWT、连接池及资源治理配置 |
| `WebErp/weberp/src/main/java/org/example` | 认证授权、接口分发、文件上传下载、SQL、脚本、XML、资源管理等业务代码 |
| `WebErp/weberp/src/main/resources/mapper` | MyBatis XML 映射与动态 SQL |
| `WebErp/weberp/src/test/java/org/example` | 安全与资源治理回归测试 |
本次自查重点覆盖以下风险域:
- 第三方组件与依赖漏洞。
- 明文敏感配置与凭证泄露风险。
- 认证授权、CSRF、CORS、接口开放面。
- SQL 注入与动态 SQL 拼接。
- 文件上传、下载、路径穿越、压缩包解压。
- 脚本执行、XML 反序列化、系统命令调用。
- 资源泄漏、缓存与线程池治理。
## 2. 自查方法与证据来源
| 方法 | 证据说明 |
| --- | --- |
| 静态文件扫描 | 使用 `rg` 对认证、文件、SQL、脚本、XML、敏感配置等关键字进行扫描。 |
| 依赖清单抽取 | 从 `WebErp/pom.xml``WebErp/weberp/pom.xml` 提取直接声明的 Maven 依赖版本。 |
| OSV 漏洞库核验 | 使用 OSV API 对已声明依赖版本进行公开漏洞匹配。 |
| 代码证据复核 | 抽查 Spring Security、CORS、文件工具、Zip 工具、JWT、脚本执行、测试用例等关键文件。 |
| 回归测试证据核对 | 识别已有安全回归测试覆盖点,包括路径穿越、Zip Slip、CORS、JWT、资源治理等。 |
环境限制:
- 当前扫描环境未发现可用 `mvn` 命令,因此未执行 `mvn test`、Maven 依赖树生成或 OWASP Dependency-Check。
- Git 状态读取触发 safe.directory 所有权保护,本次报告不依赖 Git 状态作为证据。
- OSV 查询基于 POM 中直接声明或可解析的依赖,不代表完整运行时传递依赖的最终结论;后续应补充完整依赖树扫描。
## 3. 风险识别记录台账
| 编号 | 风险名称 | 位置 | 等级 | 影响 | 现状证据 | 处置方案 | 优先级 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| R-001 | Jackson 组件存在公开漏洞 | `WebErp/pom.xml``WebErp/weberp/pom.xml` 中 Jackson 2.18.3 | 高 | 可能导致反序列化绕过、SSRF、拒绝服务等风险,取决于业务是否启用相关 Jackson 特性和输入面。 | OSV 命中 `jackson-core``jackson-databind` 多条风险:GHSA-72hv-8253-57qq、GHSA-5jmj-h7xm-6q6v、GHSA-hgj6-7826-r7m5、GHSA-j3rv-43j4-c7qm、GHSA-rmj7-2vxq-3g9f。 | 将 Jackson 统一升级到已修复版本,建议优先评估 2.18.9 或与 Spring Boot 版本兼容的更高补丁版本;升级后回归 JSON 序列化、接口响应、文件预览和鉴权流程。 | P0,建议 2026-07-01 前完成 |
| R-002 | SQL Server JDBC 驱动存在公开漏洞 | `WebErp/pom.xml``WebErp/weberp/pom.xml``mssql-jdbc` 12.8.1.jre11 | 高 | 可能受不当输入校验问题影响;若系统连接 SQL Server 或保留相关驱动运行时可用,则存在组件风险。 | OSV 命中 GHSA-m494-w24q-6f7w / CVE-2025-59250,修复版本包含 12.8.2.jre11、12.10.2.jre11 等。 | 若仍需 SQL Server 支持,升级到至少 12.8.2.jre11,建议评估 12.10.2.jre11;若不再使用,移除依赖和相关配置。 | P0,建议 2026-07-01 前完成 |
| R-003 | 数据库连接串包含明文账号密码 | `WebErp/weberp/src/main/resources/application.properties:16` 及注释历史连接串 | 高 | 代码仓库、构建包或日志泄露时可能造成数据库凭证泄露和横向访问风险。 | 配置文件中存在形如 `jdbc:dm://***:****/***?user=***&password=***&host={hostname}` 的连接串;报告已脱敏,不展示真实 IP、账号和密码。 | 迁移到环境变量、启动参数、KMS/密钥管理服务或配置中心;清理注释中的历史账号密码;轮换已暴露账号密码;限制数据库账号权限和来源 IP。 | P0,建议 2026-07-01 前完成 |
| R-004 | 认证入口开放面较大,依赖业务层二次校验 | `SecurityConfig.java:14-44`、各 Controller 的 `@RequestCheck` | 高 | Spring Security 对多组 `/Api/**` 路径 `permitAll`,若业务层注解或反射分发漏配,可能形成未授权访问。 | `SecurityConfig` 仅对未匹配请求 `denyAll`;业务方法依赖 `@RequestCheck(CheckLogin = true/false)` 控制登录态。 | 梳理免登录白名单,仅保留登录、验证码、公开配置等必要接口;对反射分发方法建立默认强制登录策略;为高风险操作增加服务端权限校验测试。 | P0,建议 2026-07-05 前完成 |
| R-005 | CSRF 对核心 API 路径豁免 | `SecurityConfig.java:14-22` | 中 | 如浏览器 Cookie 或会话凭证可跨站携带,写操作接口可能被跨站请求利用。 | 多个 `/Api/**` 路径被配置为 CSRF 忽略;系统同时配置 CORS 凭证支持。 | 对 Cookie 会话场景启用 CSRF Token;若完全使用 Bearer Token,确保 Token 不存放于可被跨站自动携带的 Cookie;对写操作要求 `Authorization` 并校验 Origin/Referer。 | P1,建议 2026-07-10 前完成 |
| R-006 | CORS 允许携带凭证且允许请求头通配 | `CorsConfig.java:15-41` | 中 | 跨域来源若配置过宽,可能扩大凭证使用面和数据读取面。 | CORS 配置指定多个来源、`setAllowCredentials(true)``addAllowedHeader("*")`,已有测试覆盖拒绝 TRACE 方法和不暴露所有响应头。 | 将来源列表改为环境化配置;生产环境只保留正式前端域名;限制允许请求头;保留并扩展 CORS 回归测试。 | P1,建议 2026-07-10 前完成 |
| R-007 | MyBatis `${}` 动态拼接存在 SQL 注入风险 | `mapper/PageBreaks.xml``mapper/DMCrmMapper.xml``mapper/CustomerMapper.xml` | 高 | `${}` 会直接拼接 SQL 文本,若字段名、条件、排序或 SQL 片段来自用户输入,可能导致 SQL 注入。 | 扫描发现 `${sql}``${keyName}``${condition}` 等动态拼接;部分业务代码也存在大量 `String.format` / 拼接式 SQL。 | 将值参数改为 `#{}`;对表名、字段名、排序、条件片段使用服务端白名单枚举;禁止前端直接传 SQL;对无法立即改造的动态 SQL 增加 `SqlAnalyzer` 校验和审计日志。 | P0,建议 2026-07-05 前完成 |
| R-008 | 远程 URL 下载文件可能形成 SSRF | `FileUploadController.java``FileUtil.DownLoadFile``downloadFile``asyncDownload` | 高 | 若用户可控 URL 被服务端下载,可能访问内网、云元数据地址或敏感管理端口。 | 文件上传逻辑支持 `url` 参数触发远程下载,工具类包含多处 HTTP 下载方法。 | 增加 URL 协议、域名、IP 网段、端口白名单;阻断内网地址、回环地址、链路本地地址、云元数据地址;限制重定向和文件大小;记录下载审计日志。 | P0,建议 2026-07-05 前完成 |
| R-009 | 文件上传类型与路径风险需持续治理 | `FileUtil.java``FileUploadController.java` | 中 | 文件类型、文件名、路径校验缺陷可能导致任意文件写入、恶意文件上传或越权读取。 | 已存在扩展名白名单、危险类型黑名单、路径权限校验;测试覆盖伪造根目录名绕过场景。 | 保持服务端真实路径归一化校验;增加 MIME/文件魔数校验;上传目录禁止脚本执行;限制单文件大小和总量;对下载、删除、移动操作统一权限校验。 | P1,建议 2026-07-15 前完成 |
| R-010 | Zip Slip 解压路径穿越风险已识别并有控制 | `ZipUtil.java``SecurityRegressionTest.java` | 中 | 恶意压缩包可能通过 `../` 写出目标目录,覆盖系统文件。 | `ZipUtil` 使用目标根路径 normalize 后校验 `startsWith(targetRoot)`;测试覆盖 `../escaped.txt` 解压逃逸。 | 保留现有校验;补充压缩包大小、条目数、单文件大小、解压后总大小限制,防止 Zip Bomb。 | P1,建议 2026-07-15 前完成 |
| R-011 | GraalJS 允许全访问,动态脚本执行面较高 | `JsEngine.java:39-40``JsEngine.java:99` | 高 | 若脚本内容或上下文参数可被用户控制,可能造成任意 Java 访问、敏感信息读取或命令执行链。 | `polyglot.js.allowAllAccess` 被设置为 `true`,并执行 `engine.eval(statement, context)`。 | 默认关闭 `allowAllAccess`;只允许执行受控表达式;对脚本来源进行白名单管理;限制执行时间和可访问对象;为脚本执行增加审计日志和安全测试。 | P0,建议 2026-07-05 前完成 |
| R-012 | XML 反序列化需禁用外部实体与 DTD | `XmlUtil.java` | 中 | XML 输入若来自不可信来源,可能存在 XXE、SSRF、文件读取等风险。 | 使用 JAXB `Unmarshaller` 反序列化 XML,当前未显式展示禁用外部实体和 DTD 的配置。 | 使用安全 XML 解析器配置,禁用 DTD、外部实体、外部 schema;限制 XML 大小;对不可信 XML 输入增加测试样例。 | P1,建议 2026-07-15 前完成 |
| R-013 | 系统命令调用需白名单与参数隔离 | `OfficeUtil.java``FormatFactoryUtil.java` | 中 | 外部程序路径或参数若可控,可能形成命令执行、权限扩大或路径劫持风险。 | 扫描发现 `Runtime.getRuntime().exec``ProcessBuilder` 用于文件权限或格式转换。 | 固定可执行文件路径;参数使用数组传递且禁止拼接 shell;校验文件路径位于工作目录;记录执行日志和失败告警;避免 `chmod 777` 等过宽权限。 | P1,建议 2026-07-15 前完成 |
| R-014 | 资源治理已有控制但需纳入定期复核 | `ResourceGovernanceConfig.java``RequestCleanupFilter.java``ResourceGovernanceRegressionTest.java` | 低 | 缓存、线程池、动态数据源若失控,可能导致内存泄漏、连接泄漏或拒绝服务。 | 已有缓存容量、JS 缓存容量、线程池队列、动态连接池关闭等配置和回归测试。 | 保留容量上限;接入运行监控;对连接池活跃数、队列积压、缓存命中率和异常关闭建立告警。 | P2,建议 2026-07-31 前完成 |
| R-015 | 构建与依赖治理流程不完整 | 当前环境与 POM | 中 | 缺少稳定的自动化安全扫描会导致漏洞发现滞后。 | 当前机器无 `mvn`;未能生成完整依赖树;OSV 仅覆盖可解析直接依赖。 | 在 CI 中增加 `mvn test``mvn dependency:tree`、OSV Scanner 或 OWASP Dependency-Check;每次发版前输出依赖漏洞报告。 | P1,建议 2026-07-15 前完成 |
## 4. 公开漏洞核验结果
本次 OSV 查询命中以下依赖风险:
| 组件 | 当前版本 | 风险编号 | 等级 | 摘要 | 修复版本建议 |
| --- | --- | --- | --- | --- | --- |
| `com.fasterxml.jackson.core:jackson-core` | 2.18.3 | [GHSA-72hv-8253-57qq](https://osv.dev/vulnerability/GHSA-72hv-8253-57qq) | 中 | 异步解析器数字长度约束绕过,可能导致拒绝服务。 | 2.18.6 或更高兼容补丁版 |
| `com.fasterxml.jackson.core:jackson-databind` | 2.18.3 | [GHSA-5jmj-h7xm-6q6v](https://osv.dev/vulnerability/GHSA-5jmj-h7xm-6q6v) | 中 | `@JsonIgnoreProperties` 大小写反序列化绕过。 | 2.18.9 或更高兼容补丁版 |
| `com.fasterxml.jackson.core:jackson-databind` | 2.18.3 | [GHSA-hgj6-7826-r7m5](https://osv.dev/vulnerability/GHSA-hgj6-7826-r7m5) | 中 | `InetSocketAddress` 反序列化可能触发 DNS 解析,引入 SSRF 风险。 | 2.18.8 或更高兼容补丁版 |
| `com.fasterxml.jackson.core:jackson-databind` | 2.18.3 | [GHSA-j3rv-43j4-c7qm](https://osv.dev/vulnerability/GHSA-j3rv-43j4-c7qm) | 高 | 多态类型校验绕过,可能导致任意类实例化。 | 2.18.8 或更高兼容补丁版 |
| `com.fasterxml.jackson.core:jackson-databind` | 2.18.3 | [GHSA-rmj7-2vxq-3g9f](https://osv.dev/vulnerability/GHSA-rmj7-2vxq-3g9f) | 高 | `BasicPolymorphicTypeValidator` 数组子类型白名单绕过。 | 2.18.8 或更高兼容补丁版 |
| `com.microsoft.sqlserver:mssql-jdbc` | 12.8.1.jre11 | [GHSA-m494-w24q-6f7w](https://osv.dev/vulnerability/GHSA-m494-w24q-6f7w) / CVE-2025-59250 | 高 | SQL Server JDBC 驱动输入校验问题。 | 至少 12.8.2.jre11,或升级到 12.10.2.jre11 等兼容修复版本 |
依赖处置原则:
- 同一组件族统一版本,避免 `dependencyManagement` 与子模块显式版本不一致。
- 优先通过 Spring Boot BOM 或统一属性管理版本。
- 升级前备份当前依赖树;升级后执行单元测试、接口冒烟测试、文件预览/转换测试、登录鉴权测试。
- 对暂不能升级的漏洞记录风险接受原因、补偿控制和复核日期。
## 5. 已有安全控制与规避措施
| 控制项 | 当前证据 | 有效性说明 |
| --- | --- | --- |
| 默认拒绝未匹配请求 | `SecurityConfig``anyRequest().denyAll()` | 可降低非白名单路径暴露面。 |
| 接口级登录校验注解 | `@RequestCheck` 默认 `CheckLogin = true` | 业务层可对方法级别实施登录态、参数、日志控制。 |
| CORS 源白名单 | `CorsConfig` 中使用具体来源模式 | 避免使用 `*` 携带凭证;仍需生产环境收敛来源。 |
| CORS 方法限制 | 已允许常用方法并测试拒绝 TRACE | `SecurityRegressionTest` 覆盖异常方法拒绝。 |
| 响应头暴露收敛 | 暴露固定响应头,不使用 `*` | 已有测试验证不暴露所有响应头。 |
| 文件扩展名黑白名单 | `FileUtil` 中定义允许和禁止类型 | 可阻止常见脚本文件上传;仍需补充 MIME/魔数校验。 |
| 文件路径权限校验 | `FileUtil.checkFileAuthory` | 已有测试覆盖伪造根目录名绕过。 |
| Zip Slip 防护 | `ZipUtil.resolveZipEntryPath` | 解压路径规范化后校验目标目录边界。 |
| JWT 签名初始化 | `JwtHelp` 使用 RSA 签名并有静态初始化测试 | 已有测试覆盖 Spring 构造器未运行时的令牌生成。 |
| 资源治理配置 | 缓存、JS 缓存、线程池、动态连接池上限 | 已有回归测试覆盖容量限制和动态连接池关闭。 |
## 6. 风险处置方案与整改优先级
### P0:立即整改
整改目标:消除高危依赖、凭证泄露、未授权、SQL 注入、SSRF 和高危脚本执行面。
| 事项 | 责任建议 | 截止建议 | 验收标准 |
| --- | --- | --- | --- |
| 升级 Jackson 与 mssql-jdbc | 后端负责人 | 2026-07-01 | OSV/Dependency-Check 不再命中对应漏洞;回归测试通过。 |
| 移除明文数据库凭证 | 运维与后端负责人 | 2026-07-01 | POM、properties、日志和文档中无真实密码;已轮换暴露账号。 |
| 收敛 `permitAll` 与免登录接口 | 后端负责人 | 2026-07-05 | 白名单清单明确;高风险接口必须登录和鉴权;新增未授权访问测试。 |
| 动态 SQL 白名单治理 | 后端负责人 | 2026-07-05 | 用户输入值全部参数化;字段/表名/排序仅来自服务端白名单。 |
| 远程 URL 下载 SSRF 防护 | 后端负责人 | 2026-07-05 | 阻断内网、回环、链路本地、云元数据地址;新增 SSRF 单元测试。 |
| 关闭或限制 GraalJS 全访问 | 架构与后端负责人 | 2026-07-05 | 默认不允许 Java 全访问;脚本来源、对象访问和执行时间受控。 |
### P1:短期治理
整改目标:降低中危配置、解析、上传和命令执行风险。
| 事项 | 截止建议 | 验收标准 |
| --- | --- | --- |
| 生产 CORS 来源环境化和最小化 | 2026-07-10 | 生产仅保留正式域名;测试覆盖非法 Origin。 |
| CSRF 策略复核 | 2026-07-10 | Cookie 会话启用 CSRFBearer Token 场景明确禁止跨站自动携带凭证。 |
| XML 安全解析配置 | 2026-07-15 | 禁用 DTD、外部实体和外部 schema;新增 XXE 测试。 |
| 文件上传魔数、大小、目录策略 | 2026-07-15 | 上传目录不可执行;大小限制、MIME/魔数校验和审计日志上线。 |
| 系统命令调用白名单 | 2026-07-15 | 外部程序路径固定;参数数组化;无 shell 拼接;避免过宽文件权限。 |
| CI 安全扫描补齐 | 2026-07-15 | CI 生成测试报告、依赖树、漏洞扫描报告。 |
### P2:持续优化
整改目标:将安全自查固化为周期机制。
| 事项 | 截止建议 | 验收标准 |
| --- | --- | --- |
| 资源治理监控 | 2026-07-31 | 连接池、线程池、缓存、队列积压均有指标和告警。 |
| 安全基线文档 | 2026-07-31 | 形成接口鉴权、SQL、安全配置、上传下载、依赖升级基线。 |
| 安全回归用例扩展 | 2026-07-31 | 覆盖未授权、SQL 注入、SSRF、XXE、文件魔数、上传大小限制。 |
## 7. 定期漏洞自查机制建议
建议建立以下定期自查制度:
| 周期 | 自查内容 | 输出材料 |
| --- | --- | --- |
| 每周 | 依赖漏洞库增量扫描,关注高危/严重漏洞。 | 依赖漏洞扫描记录、风险接受记录。 |
| 每月 | 代码安全关键字扫描,复核认证、SQL、文件、脚本、XML、命令执行。 | 风险识别台账、整改闭环清单。 |
| 每次发版前 | `mvn test`、依赖树、OSV/Dependency-Check、关键接口安全回归。 | 发版安全检查表、测试报告。 |
| 每季度 | 安全基线复核、配置脱敏检查、凭证轮换、最小权限复核。 | 季度安全自查报告、凭证轮换记录。 |
| 重大漏洞公告后 | 针对公告组件和受影响版本快速排查。 | 专项漏洞排查记录、应急处置记录。 |
建议保留的自证材料:
- 自查日期、范围、负责人、扫描工具和命令记录。
- 依赖漏洞扫描原始结果和处置结论。
- 风险台账:风险编号、等级、影响、证据、责任人、计划完成日期、闭环状态。
- 整改前后代码或配置差异。
- 回归测试报告、构建报告、上线验证记录。
- 风险接受审批记录和下次复核日期。
## 8. 后续验证清单
| 检查项 | 命令或动作 | 预期结果 |
| --- | --- | --- |
| Maven 测试 | `mvn test` | 全部测试通过,无失败和错误。 |
| 依赖树 | `mvn dependency:tree` | 输出完整直接与传递依赖,归档为发版证据。 |
| OSV 扫描 | `osv-scanner -r .` 或 CI 中等效工具 | 无高危/严重未处置漏洞;中低危有处置计划。 |
| OWASP Dependency-Check | `dependency-check` Maven 插件或 CI 任务 | 生成 HTML/JSON 报告并归档。 |
| 敏感信息扫描 | secret 扫描工具或 `rg` 关键字扫描 | 无真实密码、Token、Secret、公网连接串。 |
| 安全回归 | 现有 JUnit + 新增未授权/SSRF/XXE/SQL 注入测试 | 关键安全用例稳定通过。 |
## 9. 本次自查结论
本次自查确认项目已具备一定安全治理基础,包括 Spring Security 默认拒绝策略、业务层登录校验注解、CORS 回归测试、文件路径校验、Zip Slip 防护、JWT 初始化测试和资源治理回归测试。
同时,本次自查识别出若干需要优先处置的风险:高危依赖版本、明文数据库凭证、接口开放面依赖业务层校验、动态 SQL 拼接、远程 URL 下载 SSRF 风险以及 GraalJS 全访问脚本执行风险。建议将 P0 风险纳入最近一次安全整改,完成后补跑 Maven 测试、依赖树、OSV/OWASP 扫描,并更新本报告形成闭环记录。