🟠 高危 | CVE-2026-55084 — DHIS2 is a flexible information system for data ca...
🟠 【深度分析】高危安全漏洞:CVE-2026-55084
CVSS 评分: 高危(8.8)🟠 状态: Deferred 发布时间: 2026-07-21
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-55084 |
| CVSS 评分 | 8.8 🟠 |
| 严重程度 | 高危 |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE 分类 | CWE-89 |
| 发布时间 | 2026-07-21 |
| 最后更新 | 2026-07-21 |
| 状态 | Deferred |
| 数据来源 | security-advisories@github.com |
CVSS 评分:8.8(高危)
CVSS 向量:CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
危害等级: 严重(可导致数据库完全泄露、数据篡改及服务中断)
漏洞概述
CVE-2026-55084 是 DHIS2 系统中 SqlView API 端点 /api/sqlViews/{viewId}/data.json 的 filter 参数存在 SQL 注入漏洞。经身份验证的攻击者(需要拥有 SqlView 访问权限)可通过构造恶意的 filter 参数,利用 PostgreSQL 表达式执行并触发错误信息回显,实现基于错误的 SQL 注入(Error-based SQL Injection),从而提取数据库中的任意敏感数据。该漏洞影响多个主版本,官方已发布补丁及分支修复。
受影响组件与版本
| 版本分支 | 受影响范围 |
|---|---|
| 2.37.x | 全部(官方标记为 EOS,2026-06-09 结束支持) |
| 2.38.x | 全部(EOS) |
| 2.39.x | 全部(EOS) |
| 2.40.x | 低于 2.40.11.1 或 2.40.12 的版本 |
| 2.41.x | 低于 2.41.8.2 的版本 |
| 2.42.x | 低于 2.42.5.1 的版本 |
| 2.43.0 | 低于 2.43.0.1 的版本 |
| 2.44 开发分支 | 未合并 PR #24162 的分支 |
已修复版本:
- 2.37-EOS (2026-06-09)
- 2.38-EOS (2026-06-09)
- 2.39-EOS (2026-06-09)
- 2.40.11.1 / 2.40.12
- 2.41.8.2
- 2.42.5.1
- 2.43.0.1
- 2.44 开发分支(合并 PR #24162 后)
漏洞原理分析
技术成因
该漏洞位于 DHIS2 的 SqlView 特性中。SqlView 允许管理员或授权用户定义并执行自定义 SQL 查询,并以 JSON 格式返回结果。其中 /api/sqlViews/{viewId}/data.json 端点接受 filter 参数用于动态过滤查询结果。
根据 NVD 描述及 CWE-89(SQL注入)分类,漏洞产生的原因是应用程序未对 filter 参数进行充分的输入验证和转义,直接将其拼接到后端 SQL 查询中。攻击者可以利用 PostgreSQL 的表达式机制(例如 CASE WHEN 或子查询)构造恶意 payload,使得后端执行后产生的错误信息(如 PostgreSQL 的 ERROR 消息)被应用层捕获并返回给用户。
攻击向量
- 前提条件: 攻击者需要拥有一个有效的 DHIS2 账户,并且该账户被授予至少一个 SqlView 的访问权限(
ACCESS_READ或ACCESS_UPDATE)。 - 利用路径:
- 攻击者向
/api/sqlViews/{viewId}/data.json发送带有特殊构造filter参数的 HTTP 请求。 - 参数中嵌入 PostgreSQL 条件表达式,例如:
filter=1; SELECT CASE WHEN (condition) THEN pg_sleep(10) ELSE 0 END -- - 由于后端未对输入进行转义,该字符串被直接拼接到 SQL 语句中,导致数据库解析并执行恶意代码。
- 利用 PostgreSQL 的错误信息回显机制(如类型转换错误或约束违反),攻击者可以逐字符推断数据库内容(Error-based SQLi)。
- 攻击者向
- 影响范围: 攻击者可读取任意表(包括用户凭证、系统配置、敏感业务数据),进一步可能通过
INSERT/UPDATE/DELETE修改数据,甚至执行DROP等破坏操作。
注意: 现有信息未披露具体过滤缺陷细节,但根据常规 SQL 注入模式,推测是
filter参数直接拼接到了WHERE子句或动态 SQL 中,未使用参数化查询。
影响评估
攻击复杂度(AC: Low)
漏洞利用无需特殊网络条件,只需发送特定构造的 HTTP 请求即可触发。
所需权限(PR: Low)
攻击者需要具备低权限身份(已认证用户,至少拥有一个 SqlView 的访问权限)。对于使用角色分离的 DHIS2 环境,该权限通常会被授予数据录入或分析人员,覆盖面较广。
用户交互(UI: None)
攻击过程无需受害者交互,属于纯服务端漏洞。
影响范围(Scope: Unchanged)
漏洞仅影响当前数据库实例,不跨越安全边界。
潜在后果
- 数据泄露(C:H): 可提取所有数据库内容,包括密码哈希、个人身份信息、医疗/疾控敏感数据(DHIS2 常用于卫生领域)。
- 数据篡改(I:H): 攻击者可执行
UPDATE/INSERT/DELETE修改关键统计数据或业务配置。 - 服务中断(A:H): 通过执行耗时操作(如大量子查询、游标遍历)使数据库负载过高,或直接删除表结构导致应用不可用。
实际威胁等级:高
由于 DHIS2 广泛部署于全球公共卫生机构(如疾病监测、疫苗管理),该漏洞可能导致严重的数据安全事件和业务中断。
修复建议
官方补丁
立即将受影响版本升级至以下已修复版本:
| 旧版本 | 升级目标 |
|---|---|
| 2.37.x ~ 2.39.x | 升级至 EOS 版本(2026-06-09 发布的最终补丁) |
| 2.40.x | 2.40.11.1 或 2.40.12 |
| 2.41.x | 2.41.8.2 |
| 2.42.x | 2.42.5.1 |
| 2.43.0 | 2.43.0.1 |
| 2.44 开发分支 | 合并 PR #24162 后构建 |
临时缓解措施(补丁不可用时的应急方案)
限制 SqlView 访问权限:
- 审查所有用户角色,移除不必要的
SqlView访问权限,仅保留给管理员。 - 使用 Web 应用防火墙(WAF)规则拦截包含
filter参数中可疑 SQL 关键字的请求(如SELECT、UNION、CASE、pg_sleep等)。
- 审查所有用户角色,移除不必要的
启用数据库审计与入侵检测:
- 开启 PostgreSQL 审计日志(如
pgaudit扩展),监控异常 SQL 执行模式。 - 配置数据库连接池或中间件对传入参数进行长度和字符集限制。
- 开启 PostgreSQL 审计日志(如
应用层安全加固:
- 如果无法立即升级,可临时修改
SqlView相关的源码,将filter参数使用参数化查询(PreparedStatement)或严格的正则表达式白名单过滤。 - 关闭应用错误详情显示(生产环境不应返回原始数据库错误信息)。
- 如果无法立即升级,可临时修改
参考资料
- CVE 详情页(NVD): https://nvd.nist.gov/vuln/detail/CVE-2026-55084
- CWE-89(SQL注入): https://cwe.mitre.org/data/definitions/89.html
- DHIS2 官方安全公告(GitHub): [security-advisories@github.com 来源数据]
- DHIS2 版本发布页面: https://dhis2.org/downloads/(请关注对应版本补丁)
总结: CVE-2026-55084 是一个典型的基于错误的 SQL 注入漏洞,利用门槛低、影响面广。所有 DHIS2 用户应优先升级至官方补丁版本,并遵循最小权限原则。安全团队需立即组织受影响系统的排查与修复工作。