安全通告

排序参数 ORDER BY SQL 注入漏洞处置通告(GHSA-g8qc-r85v-gqpp)

Charles7c

ContiNew Admin / ContiNew Starter 排序参数 ORDER BY SQL 注入漏洞(GHSA-g8qc-r85v-gqpp)处置通告:影响范围、修复版本、升级指引、披露时间线与安全承诺。

本着负责任披露的原则,我们现将近期收到并已完成修复的一个 SQL 注入漏洞向全体用户通报。请受影响用户尽快升级。

事件概述

2026 年 9 月 25 日,安全研究者 tonghuaroot 通过 GitHub 私有漏洞报告向我们提交了一个排序参数 SQL 注入漏洞(GHSA-g8qc-r85v-gqpp)。该漏洞存在于 ContiNew Starter 的 CRUD 套件中,ContiNew Admin 作为下游项目同受影响。

我们已于 2026 年 9 月 27 日随 ContiNew Starter v2.16.1 发布修复,ContiNew Admin 的修复已合入 dev 分支,将随 v4.2.0 版本发布(尚未发布)。建议所有在影响范围内的用户尽快升级;暂时无法升级的,可先按文末的临时缓解方案处置。

时间线

时间事件
2026-09-25报告者通过 GitHub 私有漏洞报告提交漏洞详情
2026-09-27根因修复随 ContiNew Starter v2.16.1 发布,同步至 Maven Central
2026-09-27ContiNew Admin 完成依赖升级(Starter 2.16.0 → 2.16.1),修复合入 dev 分支
2026-09-29GitHub 安全通告 GHSA-g8qc-r85v-gqpp 正式发布(暂未申请 CVE 编号)
待定ContiNew Admin v4.2.0 发布

漏洞说明

ContiNew Starter 的 CRUD 套件为所有列表、树型、导出类接口提供了统一的 sort 排序参数支持。排序字段会被拼接进 SQL 的 ORDER BY 子句,此前框架对该参数设有两道防线:

  1. SqlInjectionUtils 关键字黑名单校验;
  2. CrudServiceImpl#sort 的实体字段名比对校验。

经报告者演示,这两道防线存在被同时绕过的可能:黑名单属于“封禁已知特征”的防御方式,天然无法穷举所有攻击形态;而字段名校验只校验了表别名后的字段片段,实际拼接时却使用了完整字段值,攻击者可借助注释符截断拼接内容,构造出布尔盲注,进而探测接口本未返回的数据列(如密码散列字段)。

这是一次典型的标识符位置注入(CWE-89)。利用该漏洞需要有效登录凭证,不涉及未认证场景。

影响范围

项目受影响版本
ContiNew Starter(top.continew.starter:continew-starter)≤ 2.16.0
ContiNew Admin≤ 4.1.0(各发布版本内置的 Starter 均 < 2.16.1,如 4.1.0 内置 2.14.0)

是否受影响以项目中实际生效的 ContiNew Starter 版本为准:Admin 以源码形式分发使用,版本号仅作参考——自行管理过 Starter 依赖的项目,请以依赖树中的实际版本判断(mvn dependency:tree -Dincludes=top.continew.starter 或 IDE 依赖面板可查),≥ 2.16.1 即已修复;直接跟进 dev 分支最新源码的用户同样已包含修复。

涉及模块:Starter 的 data-mp、data-mf、extension-crud-mp、extension-crud-mf(CRUD 套件的排序处理链路)。基于 ContiNew Starter 二次开发且使用了 CRUD 套件的项目,同样建议按下方方式自查与升级。

修复方案

修复的核心思路是:对拼接进 ORDER BY 的排序字段按标识符白名单做整体校验,而不是依赖黑名单去“封禁”攻击特征。

新增 SortUtils#validateProperty:仅允许字母、数字、下划线,以及 . 分隔的表别名前缀(如 u.create_time),不满足即拒绝请求;并在全部 ORDER BY 拼接点完成接入:

  • SortQuery#getOrder(入口统一校验)
  • CrudServiceImpl#sort(MyBatis-Plus / MyBatis-Flex 双实现)
  • QueryWrapperHelper#sort 与 #build(MyBatis-Plus / MyBatis-Flex 双实现)

升级后,非法排序字段将被直接拒绝并返回参数错误提示。

升级指引

ContiNew Admin 用户:v4.2.0 发布后升级至 v4.2.0 或更高版本(内置 Starter 依赖随版升至 2.16.1),参照 CHANGELOG.md 的 v4.2.0 条目核对本批破坏性变更即可;自行管理过 Starter 依赖的项目不必等待 Admin 发版,现在直接将 Starter 升至 2.16.1+ 即可,v4.2.0 发布前可先按下方临时缓解方案处置。

ContiNew Starter 用户:将 Maven 依赖升级至 2.16.1 或更高版本:

<dependency>
    <groupId>top.continew.starter</groupId>
    <artifactId>continew-starter</artifactId>
    <version>2.16.1</version>
</dependency>

暂时无法升级的用户:可在自己的项目中添加排序参数校验过滤器(无需升级依赖,代码见安全通告页),或在网关 / WAF 层对 sort 参数做标识符白名单过滤,作为临时缓解措施,并尽快安排升级。

升级后的额外建议:由于该漏洞可被用于读取接口未返回的数据列(如密码散列),如果你曾将服务暴露给不受信任的用户群体,建议排查历史访问日志中的异常排序请求,并视情况轮换管理员密码等敏感凭证。

我们的安全承诺

开源项目的安全需要社区共同守护。这里也同步说明我们的处理原则:

  • 请勿公开披露:如你发现安全漏洞,请勿在任何代码托管平台通过公开 Issue、PR 或讨论区披露,请通过 GitHub 私有漏洞报告 提交,在通告发布前只有维护者与报告者可以查看;
  • 快速响应:我们承诺在 7 个工作日内确认受理、14 个工作日内给出评估(详见安全策略),严重问题加急发版;
  • 透明披露:修复随版本发布后,我们会在安全通告页集中公示所有已披露漏洞的编号、影响范围与修复版本,方便跟进。

最后,衷心感谢 tonghuaroot 的负责任披露,让我们有机会在漏洞被广泛利用前完成修复。🙏


相关链接: