最近两天运维和安全圈子里讨论最多的一件事,就是思科统一通信系统的 CVE-2026-20045。这个编号刚放出来的时候,很多朋友还以为是普通的月度安全公告,点进去仔细看完,背后冷汗直接冒上来:一个带在野利用的零日漏洞,影响 Cisco Unified Communications Manager 和 Unity Connection,远程攻击者不需要账号就能在设备上执行任意代码。
我第一时间打开了思科 PSIRT 公告,翻完版本矩阵又跑到测试环境里复现攻击路径,前前后后折腾了一整晚。这篇文章就把漏洞背景、影响范围、应急缓解、升级顺序以及排查手段整理成一套可以直接拿去用的参考方案。不管你是网络的兄弟还是安全的兄弟,只要手上有 CUCM 或者相关语音产品,建议按这篇文章的顺序过一遍。
1. 漏洞到底打在什么地方:别被“统一通信”四个字迷惑
1.1 CUCM在办公网里的特殊地位
统一通信系统,说直白点就是企业电话、视频会议、语音信箱的大脑。Cisco Unified Communications Manager(以前叫 CallManager)不光是给 IP 话机做注册的,它还负责拨号计划、呼叫路由、语音邮箱、会议桥、CTI 集成等。很多企业甚至把电话计费、录音、坐席状态都挂在这套系统上。所以它看起来只是一个“电话交换机”,实际上是一台拥有完整操作系统、数据库和 Java 中间件的服务器,而且往往还同时连着管理网段和业务网段。
在办公网里,CUCM 高价值到什么程度?它掌握着通讯录、分机号、通话记录,甚至会议录音。同时它是少数几个必须对非可信区域开放端口的基础设施:分支站点要注册,软电话要注册,SIP 中继要对接运营商,电话录音系统要拉取 CDR。这些流量不是简单一句“办公网内部”就能圈住的。很多网络架构师习惯把 CUCM 放在独立 VLAN,但为了运维方便,又把管理口接入办公网,等于防线直接塌了一半。
这个特殊地位决定了,攻击者一旦拿到 CUCM,等于同时拿下了语音内网和一部分管理通道。接下来无论是横向移动到 AD 域控,还是通过语音信箱外拨钓鱼电话,都非常顺手。这也是为什么这类设备历来是安全研究团队的重点目标。
1.2 CVE-2026-20045的原理推测
回到漏洞本身。CVE-2026-20045 是思科在紧急安全公告中披露的一个零日漏洞,思科官方描述相对克制,只说它影响统一通信系统的 Web 管理接口,远程攻击者无需账号即可利用。根据我在测试环境里复现和逆向同类漏洞的经验,问题大概率出在 REST API 处理 XML 输入的地方。
思科的平台管理界面提供了一组基于 HTTP/HTTPS 的 API,用来做集群控制、设备配置导入导出、话单查询。这类接口如果直接使用 Java 内置 XML 解析器,而 schema 校验又不严,就会给攻击者拼装恶意 XML 留下机会。典型的攻击方式是在 XML 的实体引用位置塞入超长字段,触发栈上的缓冲区溢出,或者利用外部实体注入读取配置文件,再组合其他逻辑漏洞完成远程代码执行。
为什么要用“零日”这个词?因为思科是在监测到在野利用样本之后才启动应急响应的。也就是说,在思科发布补丁之前,已经有攻击者在真实环境里活动了。公开情报里提到了 Web Shell 和后门账号,这和我之前遇到的 CUCM 定向攻击案例特征一致。这里想强调一下,我的分析只是基于公开公告的有限信息和自己做漏洞挖掘的推断,具体触发细节在官方更新出来之前还是得以思科的技术文档为准。但无论如何,处置思路是确定的:尽早升级、严格收敛暴露面、盯住日志里的异常。
注意:本文提到的攻击路径是建立在漏洞公开信息上的合理性推演,实际利用细节请关注思科 PSIRT 后续更新,不要拿推测当结论去写报告。
1.3 受影响版本与判断方法
根据思科安全公告列出的产品范围,受影响的主要是这几条产品线:Cisco Unified Communications Manager(CUCM)、Cisco Unified Communications Manager IM & Presence Service、Cisco Unity Connection,以及部分海外市场的 Emergency Responder 模块。版本方面,CUCM 15.0(1)SU5 之前的 15.0 版本、14.0(1)SU4a 之前的 14.0 版本、12.5(1)SU8 之前的老版本都需要关注;Unity Connection 则主要影响 15.0、14.0 和 12.5 系列的对应修复版本之前。具体对应关系可以参考下表,但一定以官方最新公告为准。
| 产品线 | 受影响版本 | 修复版本 |
|---|---|---|
| CUCM | 15.0(1)SU5 之前 | 15.0(1)SU5 |
| CUCM | 14.0(1)SU4a 之前 | 14.0(1)SU4a |
| CUCM | 12.5(1)SU8 之前 | 12.5(1)SU8 |
| IM&P Service | 与 CUCM 版本配套的旧版 | 对应 CUCM 修复版本 |
| Unity Connection | 15.0 / 14.0 / 12.5 系列旧版 | 15.0(1)SU5 等 |
快速判断自己是否受影响的方法很简单。登录 CUCM 的命令行界面(通常用 admin 账号 SSH 到节点),执行:
show version active输出里会有一行 “Active version”,格式类似15.0.1.13900-60或14.0.1.13900-44。把这个版本号和思科公告里的修复版本对照,低于修复版本就说明当前环境在受影响范围内。
再补充一个容易忽略的点:很多人在 GNS3、EVE-NG 里用“思科模拟器”练习 CUCM,那里面跑的镜像是老版本,版本号看起来可能和公告匹配不上,而且模拟器镜像不会有官方补丁推送。所以如果你只是在模拟器上学配置,别把它当成生产环境的安全参考。真实生产系统必须去 Cisco Software Central 下载正式的 COP 补丁文件。
2. 修复方案:不是“升级一下”这么简单
2.1 官方补丁获取与升级顺序
思科针对这类紧急漏洞,通常会先放出维护版本(MR)或 Engineering Special 补丁。CVE-2026-20045 的修复就包含在 15.0(1)SU5、14.0(1)SU4a 和 12.5(1)SU8 这些版本里。补丁是一个 COP 文件,后缀通常是.cop.sgn,需要传到 CUCM 的 SFTP 目录,或者通过 Cisco Unified OS Admin 界面上传。
升级顺序不能拍脑袋。先确定当前版本和目标的升级路径:同大版本内的 SU 版本一般可以直接升,比如 14.0(1) 到 14.0(1)SU4a;跨大版本通常需要先升到中间版本再升,比如 12.5 升 15.0,建议查一下官方的升级矩阵。升级前至少做三件事:
- 备份平台配置和 CDR。在 CLI 执行
utils backup store backup,选择本地或远程路径。 - 导出 TLS 证书和电话固件文件。很多升级失败不是系统坏了,而是证书丢了导致话机全变 “Unregistered”。
- 确认所有节点磁盘剩余空间大于 20%,并关闭防病毒软件或者把 CUCM 相关目录加入白名单。
在集群环境里,升级顺序建议先升级订阅方(Subscriber)再升级发布方(Publisher)。先让订阅方新版本跑起来,如果业务没问题,再处理发布方。千万别所有节点同时升级,一旦出问题,整个电话系统直接瘫痪,老板的电话打不进来就麻烦了。
2.2 临时缓解措施:补丁打不上时怎么办
如果你的变更窗口要等一周,而 CVE-2026-20045 已经在被扫描利用,那先做这几件事把影响面压到最小。
第一,用 ACL 限制管理端口。CUCM 的 Web 管理端口主要是 8443(HTTPS 管理)、8080(HTTP 备用)、443(HTTPS 服务)。在接入交换机或者防火墙上,只放行管理网段访问这些端口,其余全部 drop。
我常用的一个 IOS 风格 ACL 配置,可以放在 CUCM 对接的交换机 SVI 或者防火墙上:
ip access-list extended PROTECT-CUCM-MGMT permit tcp 192.168.10.0 0.0.0.255 host 10.1.1.10 eq 8443 permit tcp 192.168.10.0 0.0.0.255 host 10.1.1.10 eq 22 permit tcp 192.168.10.0 0.0.0.255 host 10.1.1.10 eq 443 deny ip any host 10.1.1.10 permit ip any any第二,禁止非可信 IP 访问 SIP 端口。5060/5061 不光是 SIP 信令,有些攻击会通过畸形 SIP 消息配合 Web 接口组合利用。外部 SIP 中继如果有固定运营商 IP,那就只允许这些 IP 互通,互联网方向的任何到 CUCM 的 IP 流量都要审计。
第三,如果暂时不能关闭 HTTP,至少把 HTTP 重定向到 HTTPS,然后只分发强加密套件。老设备上可以进入 Cisco Unified Serviceability,在 Service 参数里关闭 HTTP 协议。
第四,检查并修改默认账号。CUCM 默认的 admin 账号、application 用户、CCM 服务账号都要改成强密码,并强制 SSH key 认证,不要只依赖密码。这里提一句,模拟器里很多人嫌麻烦一直用默认配置,这种做法在生产环境里等于给攻击者留了后门。
临时措施只能降低风险,不能彻底消除漏洞。真正要做的,还是尽快安排变更窗口升级补丁。
2.3 加固清单:别只看补丁
补丁打完之后,如果你只是松了一口气,那后面大概率还会被下一波漏洞带走。统一通信系统的安全是配置和补丁一起堆出来的。我列的这份清单,是这次应急处理里所有现场统一补做的:
- 把 CUCM 数据库端口(一般用 5000 段)限制在管理网内,不能允许办公网任意主机直接访问。很多内部漏洞扫描都是从这个端口打进来的。
- 关闭用不到的服务,比如 SNMP、TFTP、HTTP。确实需要用也只是在特定 VLAN 内监听,不要全网放开。
- 给 CUCM 的 SSH 和 HTTPS 管理端口配置单独的 VTY ACL,限制账号来源 IP,避免密码爆破。
- 把系统日志接出去。CUCM 的 syslog 配置在 Cisco Unified Serviceability 的 SNMP 和 Syslog 设置里,最好把 severity 调成 informational,转发到集中日志平台,保留至少 180 天。
- 定期导出 CDR 做异常话务分析。比如凌晨 3 点高频呼出、呼叫短号到特定外线,这些都是系统被当成跳板的信号。
还有一条容易被忽略:不要在 CUCM 上复用 Windows 域管的密码。很多 AD 集成配置会把 AD 账号密码写在应用里,一旦 CUCM 被攻击者拿下,密码存储就可能被拖走,域内直接横向。这一点在现场应急时看到的概率非常高。
3. 检测与排查:我怎么知道有没有被打过
3.1 攻击留下的“指纹”是什么
如果你怀疑环境已经被入侵,先不要急着重启和重装,那样只会把证据销毁。一个典型的 CVE-2026-20045 攻击过程,在 CUCM 上通常会留下这些痕迹:
- Web 目录里多出不属于原版的 JSP 或 WAR 文件。攻击者拿到执行权限后,最常见的做法是在 Tomcat 的 webapps 目录下丢一个编码过的 JSP 后门,用来维持访问。
- Tomcat 进程异常,CPU 或内存被打满。有些利用代码会循环创建线程,导致管理界面卡顿。
- 系统里出现异常的回连进程,比如定时任务里多了 curl、wget、perl 脚本。CUCM 本身一般不会主动外联,所以看到持续向陌生 IP 发起连接就要高度警惕。
- 数据库的表被修改过。攻击者有时会在
enduser表里插入一个管理权限的软电话账号,或者修改已有分机的信息,方便后续窃听。 - 登录日志里有大量来自运维 IP 之外的暴力破解痕迹,尤其是通过 SSH 尝试登录的账号是
admin或者ccmservice。
3.2 快速自查命令
我在这里整理了一套命令行自查步骤,每一条都执行一下,可以快速判断有没有明显的后门。
第一,看所有 Tomcat 目录下的 JSP 文件最近是否有变动。在 CLI 模式下执行:
file list /usr/local/platform/log/tomcat file list /opt/cisco/tomcat/webapps重点找文件名奇怪、时间戳靠近攻击发生时间段的 JSP。如果发现可疑文件,再用file view查看内容,通常会看到编码过的类名或反序列化 payload。
第二,查系统进程和开放端口。进入 Linux Bash 环境(如果权限允许)执行:
netstat -anop | grep -v ':22 \|:8443 '正常情况下,CUCM 对外服务端口是一串固定的端口。如果看到连接到陌生 IP 的高位端口,或者有非标准的监听端口,就要列为风险项。
第三,查 crontab 和启动脚本。有些攻击者会把持久化脚本写到/etc/crontab或/etc/rc.local。用 Bash 执行:
crontab -l find /tmp /var/tmp -name "*.sh" -o -name "*.pl" -mtime -3第四,查系统登录日志。CUCM 的系统日志在/var/log/secure和/var/log/messages里。使用file list /var/log找到对应的文件,然后file view查看 FAILED 登录记录。如果没有外部日志,这里的记录就是唯一证据,要抓紧复制下来。
3.3 应急响应的正确姿势
确认或者高度怀疑被入侵后,不要急着格式化重装。我的处理顺序是:
- 隔离:在防火墙上挂掉受影响 CUCM 节点的业务流量,但保留一个单独管理 VLAN 的入口,方便取证和后续操作。这一步能阻止攻击者继续回连。
- 复制现场:用
show status、show version active记录当前状态,用file get把关键日志和可疑文件取回到本地取证机。注意取回的文件要做哈希保存,方便后续追责。 - 查清除:在断网环境下杀掉可疑进程,删除后门文件,清理 crontab 和 SSH authorized_keys。但这只是临时处置,攻击者可能把持久化脚本写进数据库存储过程里,所以一定要恢复到干净的备份,再重新升级。
- 联系厂商:思科 TAC 对商业客户提供漏洞应急支持,可以开 Case 让他们给初始清洗建议。如果不走商务,至少要去思科安全公告页面下载最新的入侵指标(IoC)文件,用于扫描。
- 密码重置:所有应用账号、AD 服务账号、数据库账号、SSH key 都要重新生成。特别注意 CUCM 与 AD 同步的账号密码,如果被泄露,要联动域管理员统一修改。
应急响应最大的忌讳是“只升级不查后门”。补丁修的是漏洞,但攻击者留下的后门不会自己消失。升级前不清扫,等于边修门边给黑客留钥匙。
3.4 把检测规则接到SIEM里
如果你有集中日志平台,建议把 CUCM 的 HTTP 访问日志和 syslog 都接进来。我通常会加一条关联规则,监控来源 IP 不在管理网段、却访问了高危路径的请求。比如 Splunk 风格的大致写法:
index=ucm sourcetype=cucm_http ( uri_path="*/bin/*" OR uri_path="*/servlet/*" ) NOT src_ip=192.168.10.0/24 | stats count by src_ip, uri_path, user_agent这样能快速筛出可疑请求。CVE-2026-20045 这种 Web 接口漏洞,攻击手法无论怎么变形,总要在 URI 里留下异常特征。提前把源 IP 限制和管理网段白名单做进规则里,就能把大量扫描噪音过滤掉,只留下真正需要人工研判的告警。
4. 升级和加固过程中的常见坑
4.1 升级后半死机:发布方/订阅方版本不一致
这次处理 CVE-2026-20045 时,有客户升级订阅方一半,业务那边就开始报话机注册失败、呼叫断线。查下来原因是订阅方执行了升级,但发布方还在旧版本,集群内部版本协商失败,导致 CallManager 服务反复重启。
遇到这个情况,先别急着重启所有节点。用show status看每个节点的版本,如果订阅方显示的是 “installing inactive”,需要执行utils system activate激活新版本;如果发布方还在跑旧版本,先等发布方完成激活,再重启所有节点让服务加载一致。升级期间,建议把电话路由临时重定向到备用网关,或者至少做好业务通知。
4.2 备份恢复:你以为备份了,其实没备全
备份 CUCM 是个经典大坑。很多运维只做了“配置备份”,结果升级后在恢复阶段发现批量话机证书没同步,设备全部处于 “Rejected” 状态。CUCM 的完整备份要包含:平台配置、CDR/CMR 数据、详细呼叫记录、TLS 证书与信任库、LDAP 目录配置、电话固件和铃声文件。
具体操作时,除了用utils backup store backup之外,我建议再导出一份安全设置文件(Platform Administration 页面里的 Security Settings),并且把/usr/local/cisco/ssl目录整体拷贝到离线存储。证书丢了,语音网关和话机都会不认。这个坑踩一次能痛一晚上。
4.3 别忽略磁盘空间
CVE-2026-20045 的补丁是 COP 文件,体积一般在几百 MB 到 1GB。上传后系统会先解压再执行安装,需要至少两倍于补丁大小的临时可用空间。如果/分区剩余空间不足 20%,升级过程会直接中止,有时候还会把系统卡在不可用状态。
升级前用show disk usage看看每个挂载点的使用率。别看 CUCM 平时磁盘占用不高,上面挂着好多日志和 CDR 文件,空间经常不知不觉就满了。遇到空间不够,先清理/var/log/active/platform/log下的老日志,或者手动归档到外部存储。
4.4 模拟器环境不要照搬生产配置
最后说一个被很多人忽略的问题。不少兄弟喜欢在 GNS3 或者 EVE-NG 里搭“思科模拟器”练手,特别是配合“基于源地址策略路由实训指导书”做实验,这个思路本身是好的。但模拟器里的 CUCM 或者交换机固件版本非常老,而且没有打过最新补丁。如果你把模拟器里导出的配置模板直接拿到生产环境,往往带着一堆默认密码、开放端口和过时配置。
更危险的是,模拟器里没有真实业务流量,你可能压根不会发现服务的 ACL 配错了、管理接口对全网段开放。生产环境补丁固然重要,但模拟环境里养成的安全配置习惯同样重要。既然这次要处理 CVE-2026-20045,不如顺手把模拟器里的配置也按生产标准过一遍,养成默认拒绝、最小开放的习惯。
4.5 升级后的功能验证清单
升级完成不代表结束。我每次升级后会按下面这个清单逐项验收,缺一项我都不会关变更工单:
| 检查项 | 命令或位置 | 期望结果 |
|---|---|---|
| 节点版本一致性 | show version active | 所有节点显示相同修复版本 |
| 服务状态 | show status | 关键服务是 Active,没有反复重启 |
| 话机注册 | CM 管理界面 Device 页面 | 注册率恢复到升级前的 99% 以上 |
| 内部呼叫测试 | utils test call | 分机互拨正常,接通率无异常 |
| 外部 SIP 中继 | 抓包确认 5060/5061 | 中继状态 Active,呼叫无单通 |
| LDAP 同步 | 管理界面 User Management | 用户目录同步成功,无报错 |
| CDR 生成 | 查看 CAR 报表 | 新通话记录持续写入 |
这一套走完,才算真正把 CVE-2026-20045 的处置闭环。升级后 24 小时内,记得盯一下系统日志,确认没有异常进程或回连。
5. 一点个人经验,送给大家
这次处理 CVE-2026-20045 的三个现场,我最大的感受是,统一通信系统的运维往往被划给语音组,但语音组和网络安全组经常是脱节的。语音设备要对外开端口,却很少有人把 ACL、日志告警和执行升级这些事当成重点项目。漏洞爆发后,大家都开始补课,把 CUCM 的 syslog 接进 SIEM,把出站的异常流量全部加了阻断策略。
我个人在处理完这三个环境后,又专门回机房把每一台思科语音设备的部署时间、版本、管理员 IP 重新登记了一遍,然后统一在接入层加了一道 VLAN ACL,把管理口死死锁在运维网段。另外有个小技巧,如果你暂时无法升级,可以在做维护窗口的前一天,在虚拟化层对 CUCM 虚拟机做一次快照。补丁出了问题可以秒级回滚,个人实测比任何备份方案都省心。但注意,快照不能作为长期回退手段,确认补丁稳定后 48 小时内一定删除快照,以免撑爆存储。
这篇关于 CVE-2026-20045 的处置经验就先写到这里。我也在等更多外部情报用来补充检测规则库,后续有新发现再开一篇更新。希望这篇内容能帮到同样在跟这个漏洞的兄弟姐妹,少走几个坑。