恶意监听器针对Ivanti端点移动管理系统的技术分析
执行摘要
网络安全和基础设施安全局(CISA)从一个组织获得了两个恶意软件集,这些组织因网络威胁行为者利用CVE-2025-4427和CVE-2025-4428漏洞入侵Ivanti端点管理器移动版(Ivanti EPMM)而受到损害。每个集合都包含恶意监听器的加载程序,使网络威胁行为者能够在受感染的服务器上运行任意代码。
受影响产品
Ivanti EPMM,版本11.12.0.4及更早版本、12.3.0.1及更早版本、12.4.0.1及更早版本、12.5.0.0及更早版本。(Ivanti于2025年5月13日提供了补丁并披露了漏洞。)
关键行动
- 使用妥协指标(IOC)和检测签名来检测活动,识别恶意软件样本
- 通过尽快升级Ivanti EPMM版本到最新版本来防止入侵
- 通过将移动设备管理(MDM)系统视为具有额外限制和监控的高价值资产(HVA)来防止入侵
妥协指标
有关此恶意软件的IOC可下载副本,请参见:MAR-251126.r1.v1.CLEAR。
检测
此恶意软件分析报告包含YARA和SIGMA规则。 有关此恶意软件的SIGMA规则可下载副本,请参见:AR25-260A/B SIGMA YAML。
目标受众
- 组织:所有拥有本地Ivanti EPMM系统的组织
- 角色:数字取证分析师、事件响应者、漏洞分析师、系统管理员
引言
网络安全和基础设施安全局(CISA)从一个组织获得了两个恶意软件集,共五个文件,网络威胁行为者在该组织中利用CVE-2025-4427 [CWE-288:使用替代路径或通道进行身份验证绕过]和CVE-2025-4428 [CWE-‘代码注入’]在Ivanti端点管理器移动版(Ivanti EPMM)部署中获得初始访问权限。
大约在2025年5月15日,概念验证发布后,网络威胁行为者通过链接这些漏洞获得了运行EPMM的服务器的访问权限。网络威胁行为者针对/mifs/rs/api/v2/端点发送HTTP GET请求,并使用?format=参数发送恶意远程命令。这些命令使威胁行为者能够收集系统信息、下载恶意文件、列出根目录、映射网络、执行脚本创建堆转储,并转储轻量级目录访问协议(LDAP)凭据。
CISA分析了网络威胁行为者写入/tmp目录的两个恶意文件集。每个恶意软件集都通过允许网络威胁行为者在受感染的服务器上注入和运行任意代码来实现持久性。
CISA鼓励组织使用此恶意软件分析报告中的妥协指标(IOC)和检测签名来识别恶意软件样本。如果识别出,请遵循本恶意软件分析报告中事件响应部分的指导。此外,组织应确保尽快运行最新版本的Ivanti EPMM。
恶意软件摘要
CISA分析了两个恶意软件集:
-
集合1包含以下恶意文件:web-install.jar、ReflectUtil.class和SecurityHandlerWanListener.class
-
集合2包含以下恶意文件:web-install.jar和WebAndroidAppInstaller.class
-
集合1的web-install.jar称为加载程序1
-
集合2的web-install.jar称为加载程序2
每个集合包含一个加载程序和恶意监听器,使网络威胁行为者能够在受感染的服务器上注入和运行任意代码。
集合1以下列方式协同工作:
- 加载程序1包含并加载ReflectUtil.class
- ReflectUtil.class在Apache Tomcat中注入和管理SecurityHandlerWanListener
- SecurityHandlerWanListener.class拦截特定的HTTP请求并处理它们以解码和解密有效载荷,这些有效载荷创建一个新的类,网络威胁行为者可以执行该类来运行任意代码
集合2以下列方式协同工作:
- 加载程序2包含并在运行时加载WebAndroidAppInstaller.class
- WebAndroidAppInstaller.class拦截和处理特定的HTTP请求,从请求中检索和解密密码参数,定义和加载一个新的恶意类,加密和编码新的类输出,并生成带有加密输出的响应
恶意软件交付
网络威胁行为者分段交付此恶意软件,将加载程序1和2分成多个Base64编码的段[T1027.004]。他们通过单独的HTTP GET请求交付每个段,然后使用Java表达式语言(EL)注入写入每个块并使用追加模式(通过true参数)将它们附加在一起。
对于每个加载程序,行为者的第一个GET请求创建文件并写入块1。他们随后的请求将块附加到现有文件。以下是行为者GET请求的示例。
|
|
此参数创建/追加恶意软件段到以下文件:
.newInstance("/tmp/web-install.jar", true).
然后写入以下解码的Base64块:
.write("".getClass().forName("java.util.Base64").getMethod("getDecoder").invoke(null).decode("[BASE64_CHUNK]")).
此技术用于防御规避——它使恶意软件在传输到系统时能够逃避基于签名的检测和大小限制。整体上,此技术结合了分块编码用于规避和文件追加操作用于重建。
恶意软件元数据
集合1
表1至表3显示了分析的恶意软件的元数据。
表1. 加载程序1
| 字段 | 值 |
|---|---|
| 文件名 | web-install.jar |
| 大小 | 30996字节 |
| 类型 | JAR |
| MD5 | e33103767524879293d1b576a8b6257d |
| SHA1 | c2046523f1cb487a473b0a46a5a4a957f1b3200a |
| SHA256 | c1f60ca5a5f7b94ab7122718a44b46de16c69d22c2eb62ce2948cab14bc78d50 |
| SHA512 | 004b71ebeb4808b6dfdc4e58b95c4b307985c08118c45c02a34cd56ff697259199698989af0725d63802dfc785a72e416d2db5875edd1a0fa80ae01a282b2007 |
| ssdeep | 384:kaD+TLeDOl+mDcDFNUaD+TLeDOl+mDcDFNUaD+TLeDOl+mDcDFNUaD+TLeDOl+ms:z6Pl+mwj6Pl+mwj6Pl+mwj6Pl+mw3 |
| 熵 | 7.951890 |
表2. ReflectUtil.class注入器恶意软件
| 字段 | 值 |
|---|---|
| 文件名 | ReflectUtil.class |
| 大小 | 11886字节 |
| 类型 | 编译的Java类数据,版本49.0(Java 1.5) |
| MD5 | 6ec2169312feb9fde0b17e244b32c37d |
| SHA1 | 6d7e85862f925e83f6d0c29e291765548fac721a |
| SHA256 | 065c1c2fb17ba1c3f882bead409215df612673cd455698768ed71412f9190ba3 |
| SHA512 | 4cd26b298b448db6b26d91b8cf7ac169d693a0dad4f184742463db872b809b91d462ab4659bb21474578e3202bfc92b0db18716db6b4c3c24b3f9e7f2fccce27 |
| ssdeep | 192:KuZ4E9i44LYcyHCi3uFl0xEHqQ+k5bUW0sbh3aUfPuS6GZz:Ku79BP/3uFygq49V0stKEuSpz |
| 熵 | 6.258794 |
表3. SecurityHandlerWanListener.class恶意监听器
| 字段 | 值 |
|---|---|
| 文件名 | SecurityHandlerWanListener.class |
| 大小 | 4690字节 |
| 类型 | 编译的Java类数据,版本49.0(Java 1.5) |
| MD5 | 5e9d283b483b8d5c637baf7cfdda0e08 |
| SHA1 | 8b87a881f6f81afb596d3f98abef4225315e26bf |
| SHA256 | b1b1cf33b8d3da35293d6b74c378f0cd9452a4351e26d07c896c4d9a8257ef89 |
| SHA512 | 07956b3a830bd0885202d9bc7a5b5a5927acf1c5584830ebc1011849f41b1077c3d6e3c2a6e94e36a338fc6b540c4b736751775e7069df4b257fa3786c1140a2 |
| ssdeep | 96:bFlm4Dt94EugELCBt+qRAVfOTqM8+U00RO:Blz94ExtlRAITqGQO |
| 熵 | 5.690466 |
集合2
表4至表5显示了分析的恶意软件的元数据。
表4. 加载程序2
| 字段 | 值 |
|---|---|
| 文件名 | web-install.jar |
| 大小 | 8728字节 |
| 类型 | JAR |
| MD5 | 32f5c3c1582a77c004b1511c77454678 |
| SHA1 | 2a96ce17ed8a025dd72f3729c247dfdb5b0a19a4 |
| SHA256 | b618057de9a8bba95440f23b9cf6374cc66f2acd127b3d478684b22d8f11e00b |
| SHA512 | ec3880dfdc23a06cc1d97153963c3b0bd64db0469069e8dc3395101d12c65bcdcf87e5eac967ddf0b6be7e1dd6e8faaa233224f9f76a90f44f0e9df320d051a3 |
| ssdeep | 192:omBb/dSBuj9MLFgWfXsea1Xld+LXxzRlRX+pi+n9PshE6w0Tipbg8:j/T9MLFgWfcnVlSzspic9kCPxpB |
| 熵 | 7.923820 |
表5. WebAndroidAppInstaller.class恶意监听器
| 字段 | 值 |
|---|---|
| 文件名 | WebAndroidAppInstaller.class |
| 大小 | 16120字节 |
| 类型 | 编译的Java类数据,版本52.0(Java 1.8) |
| MD5 | 8387a7ce9f2520d8956747fd247b19af |
| SHA1 | 9808ab3ddfb9ab4fe3af1b5d1f6a638bc03788e0 |
| SHA256 | df501b238854d6579cafebeba82581a728e89ed1f6cd0da54c79ef4eb6f4f9fd |
| SHA512 | a51943a8381e67aca4b8296c9df0b05450525b5b27efbf873fd54a7f68febb503e1eb088d287e3561137fd33d3772dd879a3f00b09285a67f215f7a420e7ffcd |
| ssdeep | 384:iI+1BxqQ3evK5c7aIUnKzaxckO05xiZMQn5JI3c+AK8:iImfqQ3z/nbax1 |
| 熵 | 5.950145 |
恶意软件功能
集合1
这组恶意软件包含一个加载程序、一个管理器和一个恶意监听器。
加载程序1
加载程序1是一个Java归档(JAR)文件,包含[T1027.009]并在运行时加载编译的Java类文件ReflectUtil.class。加载程序1将ReflectUtil.class伪装成org.apache.http包的一部分[T1036]。参见图1了解ReflectUtil.class的层次文件路径。
ReflectUtil.class管理器
ReflectUtil.class操作Java对象以在Apache Tomcat(运行在同一受感染服务器上)中注入和管理恶意监听器SecurityHandlerWanListener。执行时,该文件:
- 绕过Java开发工具包(JDK)模块限制
- 迭代对象及其上下文
- 尝试通过使用getClassName()返回硬编码字符串org.junit.SecurityHandlerWanListener在JUnit环境或框架中加载SecurityHandlerWanListener类[T1620]
如果SecurityHandlerWanListener类未加载,因为ReflectUtil.class首次执行时未找到,ReflectUtil.class通过使用Base64字符串catch块(图2)处理错误,以Base64解码、gzip解压缩并加载类SecurityHandlerWanListener。
Base64字符串:
-
返回类SecurityHandlerWanListener的Base64编码和gzip压缩的字节码
-
以两种方式之一解码和解压缩[T1140]类字节码(参见图3):
- 首先使用sun.misc.BASE64Decoder调用decodeBuffer
- 如果第一次尝试失败,则使用java.util.Base64调用getDecoder
-
调用ClassLoader的defineClass方法从解压缩的字节码加载类
一旦类SecurityHandlerWanListener被加载,ReflectUtil.class:
- 创建类的新实例并将其作为新监听器返回
- 检索当前监听器列表,将新监听器添加到此列表,并更新应用程序的监听器列表
- 检查evilClassName是否已注入到应用程序的事件监听器列表中,以避免多次注入或确认先前的注入。(CISA没有关于监听器evilClassName的额外信息。)
SecurityHandlerWanListener.class
这个编译的Java类文件是一个恶意监听器,它拦截特定的HTTP请求并处理它们以解码和解密有效载荷,这些有效载荷动态创建并执行一个新类。
该文件使用ClassLoader设置一个自定义servlet监听器,该监听器基于字符串Pass、Header Name和Header Values拦截HTTP请求[T1071.001]。具体来说,当收到新的HTTP请求时,servlet监听器检查请求是否包含字符串pass 7c6a8867d728c3bb、Header Name Referer和Header Value https://www[.]live.com。
如果字段匹配,该文件创建一个HashMap来存储请求、响应和会话对象。该文件还会话中存储密钥7c6a8867d728c3bb。
然后该文件检索、解码和解密Base64编码的有效载荷:
- 该文件通过从请求的输入流(request.getReader().readLine())读取一行来检索有效载荷
- 该文件使用Base64解码该行
- 该文件使用高级加密标准(AES)密码对象和存储的密钥解密解码的数据
该文件将解密的数据传递给名为g的方法,该方法定义并创建一个新的Java类文件。网络威胁行为者可以在设备上执行该类以运行任意代码。
潜在影响:此监听器可能允许网络威胁行为者:
- 在服务器上注入和执行任意代码,实现后续活动和持久性
- 通过拦截和处理HTTP请求来窃取数据
集合2
这组恶意软件包含一个加载程序和一个恶意监听器。
加载程序2
这个JAR文件包含并在运行时加载编译的Java类文件WebAndroidAppInstaller.class。
JAR文件将类文件伪装成com.mobileiron.service包的一部分。参见图5了解WebAndroidAppInstaller.class的层次文件路径。
WebAndroidAppInstaller.class
这个编译的Java类文件是一个恶意监听器,它拦截和处理特定的HTTP请求,从请求中检索和解密密码参数,定义和加载一个新的恶意类,加密和编码新的类输出,并生成带有加密输出的响应。
监听器首先从Java ServletContext检索请求和响应对象。然后,该文件检查请求的Content-Type以确保它不为null并包含字符串application/x-www-form-urlencoded。
如果满足这些条件,该文件从请求中检索密码参数。如果数据不为null且长度大于零,则密码参数值使用具有硬编码密钥3c6e0b8a9c15224a的AES算法进行Base64解码和解密[T1573.001]。
如果解密的数据不为空,解密的数据定义并实现一个新类。该文件使用相同的硬编码密钥3c6e0b8a9c15224a对新类输出进行AES加密,然后进行Base64编码[T1027.013]。
然后该文件生成存储在密码参数(来自初始HTTP请求)和硬编码密钥中的数据的消息摘要算法5(MD5)哈希,并检查哈希值是否存储在新分配的字节数组ByteArrayOutputStream中。该文件创建一个PrintWriter对象来生成响应,其中包含计算的MD5哈希值的前16个字符,后跟新加载类的Base64编码和AES加密输出以及MD5哈希值的剩余部分。
潜在影响:此监听器可能允许网络威胁行为者:
- 在服务器上注入和执行任意代码,实现后续活动和持久性
- 通过接收响应和执行结果来窃取数据
检测
Yara规则
部署表6中的CISA创建的YARA规则以检测恶意活动。
表6. YARA规则
|
|
(其他YARA规则内容省略以保持简洁)
SIGMA规则
部署表7中的CISA创建的SIGMA规则以检测恶意活动。
表7. SIGMA规则
|
|
事件响应
如果检测到此恶意软件或类似恶意软件,CISA建议组织:
- 隔离或使可能受影响的主机离线
- 收集和审查工件,如运行进程/服务、异常身份验证和最近的网络连接
- 捕获受影响主机的完整取证磁盘映像以与CISA共享
- 如果初步调查(步骤2)发现威胁行为者的访问受限(例如,他们没有横向移动或提升权限),则提供新的帐户凭据。如果调查发现威胁行为者具有更广泛的访问权限或可能横向移动,请遵循组织的事件响应计划启动威胁狩猎、遏制和驱逐措施
- 向CISA报告入侵:
- 通过CISA的24/7运营中心(contact@cisa.dhs.gov或1-844-729-2472)或CISA的事件报告系统报告入侵
- 使用CISA的恶意软件分析提交表单提交包含恶意代码的文件。在开放事件ID字段中包含CISA提供的事件ID号(从报告入侵获得)
- 重新映像受感染的主机
- 应用缓解措施部分的建议以强化系统
缓解措施
CISA建议组织基于威胁行为者的活动实施以下缓解措施,以改善组织的网络安全态势。这些缓解措施与CISA和国家标准与技术研究院(NIST)制定的跨部门网络安全性能目标(CPG)保持一致。CPG提供了CISA和NIST建议所有组织实施的最低实践和保护集。CISA和NIST基于现有的网络安全框架和指南制定了CPG,以防范最常见和最具影响力的威胁、战术、技术和程序。访问CISA的CPG网页以获取有关CPG的更多信息,包括额外的推荐基线保护。
- 尽快将Ivanti EPMM版本升级到最新版本
- 将移动设备管理(MDM)系统视为具有额外限制和监控的高价值资产(HVA)。MDM系统为数千台主机提供提升的访问权限,应被视为具有额外限制和监控的HVA
- 遵循生产和企业环境中的最佳网络安全实践,包括为所有员工和服务强制实施防网络钓鱼的多因素身份验证(MFA)。有关其他最佳实践,请参见CISA的跨部门网络安全性能目标(CPG)
附录A:MITRE ATT&CK技术
参见表8和表9了解本公告中引用的所有威胁行为者战术和技术。有关将恶意网络活动映射到MITRE ATT&CK框架的帮助,请参见CISA和MITRE ATT&CK的MITRE ATT&CK映射最佳实践和CISA的Decider工具。
表8. 防御规避
| 技术标题 | ID | 使用 |
|---|---|---|
| 混淆文件或信息:交付后编译 | T1027.004 | 网络威胁行为者分段交付恶意软件,将其分成多个Base64编码的段。行为者使用Java EL注入写入每个块并使用追加模式(通过true参数)将它们附加在一起 |
| 混淆文件或信息:嵌入式有效载荷 | T1027.009 | 加载程序1包含ReflectUtil.class |
| 混淆文件或信息:加密/编码文件 | T1027.013 | WebAndroidAppInstaller.class使用硬编码密钥对类输出进行AES加密和Base64编码 |
| 伪装 | T1036 | 加载程序1将ReflectUtil.class伪装成org.apache.http包的一部分。加载程序2将WebAndroidAppInstaller.class伪装成com.mobileiron.service包的一部分 |
| 反射代码加载 | T1620 | ReflectUtil.class将代码反射加载到Java进程中,以向Apache Tomcat服务器添加恶意监听器 |
| 反混淆/解码文件或信息 | T1140 | ReflectUtil.class解码和解压缩类字节码 |
表9. 命令与控制
| 技术标题 | ID | 使用 |
|---|---|---|
| 应用层协议:Web协议 | T1071.001 | SecurityHandlerWanListener.class拦截HTTP请求。WebAndroidAppInstaller.class拦截和处理特定的HTTP请求 |
| 加密通道:对称加密 | T1573.001 | WebAndroidAppInstaller.class使用AES算法和硬编码密钥解码Base64密码参数值 |