zhengfei611头像
CVE-2026-48842:Roundcube virtuser_query 插件预认证 SQL 注入,补丁已发布四个月仍在被利用封面图

CVE-2026-48842:Roundcube virtuser_query 插件预认证 SQL 注入,补丁已发布四个月仍在被利用

一、漏洞定性

Roundcube 的 virtuser_query 插件在处理用户名替换时,使用 preg_replace 而非 str_replace。PHP 的 preg_replace 会对替换字符串中的反斜杠进行二次解析,把 escape() 加上的转义反斜杠吃掉,导致 SQL 注入。攻击者无需任何凭证,在登录请求的 _user 参数中构造载荷即可触发。

项值
漏洞类型SQL 注入(CWE-89)
CVSS 3.18.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

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--