CVE-2026-48842:Roundcube virtuser\_query 插件预认证 SQL 注入,补丁已发布四个月仍在被利用
网络安全民工
2026年11月2日 09:39
广东
去阅读
一、漏洞定性
Roundcube 的 virtuser_query 插件在处理用户名替换时,使用 preg_replace 而非 str_replace。PHP 的 preg_replace 会对替换字符串中的反斜杠进行二次解析,把 escape() 加上的转义反斜杠吃掉,导致 SQL 注入。攻击者无需任何凭证,在登录请求的 _user 参数中构造载荷即可触发。
| 项 | 值 |
|---|---|
| 漏洞类型 | SQL 注入(CWE-89) |
| CVSS 3.1 | 8.1 High (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| 影响版本 | 1.6.x < 1.6.16;1.7.x < 1.7.1 |
| 修复版本 | 1.6.16 / 1.7.1 (2026 年 5 月 24 日发布) |
| 触发前提 | virtuser_query 插件已启用且配置了 SQL 语句(默认不启用) |
| 认证要求 | 无 (预认证,登录页面即可触发) |
| 在野利用 | 已确认 。加拿大网络安全中心于 2026 年 9 月 21 日发布利用警告 |
你提供的材料在原理分析上是准确的。preg_replace 的替换串中,\\\\\\' 经过 PCRE 解析后变成 \\\\',MySQL 将 \\\\ 读作字面反斜杠,紧跟的 ' 成为闭合符,后续 UNION 注入生效。1.6.16 将四个函数的 preg_replace 全部替换为 str_replace,修复彻底。
二、关键澄清:利用门槛比 CVSS 分数看起来更高
CVSS 8.1 中的 AC:H(攻击复杂度高)并非随意标注。实际可利用性取决于两个条件:
第一,插件必须启用。virtuser_query 是 Roundcube 的自带插件,但默认不加载。Roundcube 的默认插件列表为空,管理员必须在 config.inc.php 中显式将其加入 $config['plugins'] 才会生效。这意味着大量标准部署并不受影响。
第二,利用是盲注,需要时间。 你贴出的 PoC 使用 SLEEP(3) 做时间盲注,公开的验证脚本同样采用真假两次 SLEEP 对照的方式逐字节读取数据。Check Point 的 IPS 通告也将其描述为“通过反斜杠转义绕过”的 SQL 注入。盲注意味着攻击者需要多次请求才能提取数据,而非一次性导出。
实际风险判断:如果目标启用了 virtuser_query,漏洞是真实的、预认证的、可利用的。如果未启用,该 CVE 与你无关。先确认插件状态,再决定升级优先级。
三、Python 检测脚本(安全版)
以下脚本仅做插件存在性与版本指纹,不发送注入载荷。适合资产排查。
#!/usr/bin/env python3\"\"\"CVE-2026-48842 Roundcube 安全检测(无注入载荷)用法: python cve_2026_48842_check.py https://mail.example.com\"\"\"import sysimport reimport requestsimport urllib3urllib3.disable_warnings()
def check(base): base = base.rstrip(\"/\") headers = {\"User-Agent\": \"Mozilla/5.0 (security-check)\"}
# 1) 确认是 Roundcube,提取版本 try: r = requests.get(base, headers=headers, timeout=10, verify=False) except requests.RequestException as e: print(f\"[-] 请求失败: {e}\") return
if \"roundcube\" not in r.text.lower() and \"rcmail\" not in r.text.lower(): print(\"[-] 未检测到 Roundcube 特征\") return
m = re.search(r'\"rcversion\"\\s*:\\s*\"?(\\d+\\.\\d+\\.\\d+)', r.text) version = m.group(1) if m else None print(f\"[*] 目标: {base}\") print(f\"[*] Roundcube 版本: {version or '未从页面提取到'}\")
# 2) 探测 virtuser_query 插件文件是否可访问(间接判断是否安装) plugin_url = f\"{base}/plugins/virtuser_query/virtuser_query.php\" try: rp = requests.get(plugin_url, headers=headers, timeout=8, verify=False) if rp.status_code == 200: print(\"[*] virtuser_query 插件文件可访问(存在,但未证明已启用)\") else: print(f\"[*] virtuser_query 插件文件返回 {rp.status_code},可能未安装或访问受限\") except requests.RequestException: print(\"[*] 插件文件探测失败\")
# 3) 版本判定 if version: def parse(v): return tuple(int(x) for x in v.split(\".\")[:3]) try: v = parse(version) if (1, 6, 0) <= v < (1, 6, 16) or (1, 7, 0) <= v < (1, 7, 1): print(f\"[!] 版本 {version} 在受影响范围内\") print(\"[!] 请确认 config.inc.php 中是否启用了 virtuser_query 插件\") print(\"[!] 若已启用,立即升级至 1.6.16 / 1.7.1 或更高\") else: print(f\"[+] 版本 {version} 不在受影响范围\") except Exception: pass
print(\"\
[*] 外部黑盒无法确认插件是否启用,需登录服务器检查 config.inc.php\")
if __name__ == \"__main__\": if len(sys.argv) != 2: print(f\"用法: {sys.argv[0]} https://target\") sys.exit(1) check(sys.argv[1])
说明:插件文件可访问不等于插件已启用。真正的确认方式是检查 config.inc.php 中 $config['plugins'] 数组是否包含 'virtuser_query'。
四、Nuclei 模板(安全指纹版)
id: CVE-2026-48842-roundcube-detect
info: name: Roundcube virtuser_query CVE-2026-48842 - Safe Version Check author: security-research severity: high description: | 检测 Roundcube 版本是否在 CVE-2026-48842 受影响范围。不发送注入载荷。 插件 virtuser_query 默认不启用,需人工确认。 reference: - https://roundcube.net/news/2026/05/24/security-updates-1.6.16-and-1.7.1 - https://github.com/4minx/CVE-2026-48842 classification: cvss-metrics: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H cvss-score: 8.1 cwe-id: CWE-89 tags: cve,cve2026,roundcube,sqli,detect
http: - method: GET path: - \"{{BaseURL}}\"
matchers-condition: and matchers: - type: word part: body words: - \"roundcube\" - \"rcmail\" condition: or - type: regex part: body name: version regex: - '\"rcversion\"\\s*:\\s*\"?(1\\.6\\.(?:[0-9]|1[0-5])|1\\.7\\.0)'
extractors: - type: regex part: body name: detected_version regex: - '\"rcversion\"\\s*:\\s*\"?([\\d.]+)' group: 1
运行方式:
nuclei -t CVE-2026-48842-roundcube-detect.yaml -u https://mail.example.com
为什么不提供触发型模板:公开 PoC 使用时间盲注(SLEEP),发送此类载荷会对目标数据库造成实际负载,且盲注需要多次请求才能确认,不适合在 Nuclei 中作为单次检测执行。版本指纹已足以完成资产筛查。
五、修复与自查
升级:1.6.x → 1.6.16;1.7.x → 1.7.1。注意 Roundcube 后续又发布了 1.6.19/1.7.4 和 1.6.20/1.7.5,包含其他安全修复,建议直接升至最新补丁版本。
无法升级时的缓解:从 config.inc.php 的 $config['plugins'] 中移除 virtuser_query。这是最直接的缓解,因为漏洞完全依赖于该插件。
自查命令(在服务器上执行):
# 确认版本grep -r \"RCMAIL_VERSION\" /path/to/roundcube/program/include/rcmail.php | head -1
# 检查插件是否启用grep -A20 \"plugins\" /path/to/roundcube/config/config.inc.php | grep virtuser
若 virtuser 出现在插件列表中,且版本低于 1.6.16 / 1.7.1,立即升级或禁用插件。
六、在野利用态势
加拿大网络安全中心于 9 月 21 日更新通告,引用开源报告确认该漏洞已被积极利用。Mallory 的汇总提到,Coalition 在其蜜罐上观测到利用尝试。Proofpoint 曾将 Roundcube 漏洞利用与疑似中国关联的 UNK\_MassTraction 组织关联,该组织利用已知漏洞部署 web shell 或 VShell 后利用工具。
但需要注意:这些报告确认的是利用尝试,并非大规模生产系统失陷。SQL 注入的影响受限于 Roundcube 数据库账户的权限。Roundcube 的应用数据库与 IMAP 邮件存储通常是分离的,SQL 注入本身不等于直接读取所有用户邮件。
总结:CVE-2026-48842 是一个真实的预认证 SQL 注入,CVSS 8.1,已有在野利用报告。但它的触发严格依赖 virtuser_query 插件被启用,而该插件默认关闭。先查插件状态,再决定今晚是否熬夜。 如果插件启用了,升级到 1.6.16/1.7.1 以上(推荐直接上 1.6.20/1.7.5)。如果没启用,这个 CVE 可以排到其他紧急事项之后。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论