一、漏洞定性
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 sys
import re
import requests
import urllib3
urllib3.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("\n[*] 外部黑盒无法确认插件是否启用,需登录服务器检查 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 可以排到其他紧急事项之后。

转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/zhengfei611/article/details/169817863




