文章总结: 本文记录CVE-2026-9198漏洞的野外利用实录。该漏洞为langflow未授权RCE链,CVSS9.8,影响1.0.0至1.10.0版本。蜜罐观测显示暴露后最快34分钟被攻破,31个攻击源成功执行代码。攻击者主要窃取凭据、部署挖矿程序及远控。建议立即升级至1.10.1并轮换所有凭据。 综合评分: 88 文章分类: 漏洞分析,应急响应,威胁情报,恶意软件,安全运营
34分钟失陷:Langflow CVE-2026-9198 野外利用实录
原创
威胁情报中心 威胁情报中心
奇安信威胁情报中心
2026年8月26日 16:17 北京
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
漏洞应急 · 威胁情报
34 分钟失陷 Langflow CVE-2026-9198 野外利用实录
一个 CVSS 9.8 的未授权 RCE 漏洞、542.4 主机小时的蜜罐观测、31 个成功执行代码的攻击源——被攻击不是概率问题,而是时间问题
· 深度技术报告 · AI 基础设施安全 · 2026
2026 年 7 月,IBM 披露 Langflow OSS 存在可导致未授权远程代码执行的漏洞链 CVE-2026-9198(CVSS 9.8,Critical)。8 月 4 日,CISA 将其列入 KEV 目录。Bitbison 团队将真实漏洞实例暴露在互联网上,累计 542.4 主机小时,完整记录了攻击者的每一步操作。
01 概述
Langflow 是一个开源的低代码 AI 工作流平台,用户通过拖拽组件即可搭建 LLM 应用、RAG 管线和 Agent 工作流。它最早由 Logspace 开发,2024 年被 DataStax 收购,2025 年随 DataStax 并入 IBM,目前已被整合进 watsonx.ai 体系。
这类平台有一个共同特点:它们天生握着一堆钥匙——模型厂商 API Key、数据库凭据、连接器令牌、向量库端点,甚至还连着下游系统的写权限。对攻击者来说,拿下一台 Langflow 主机,价值远不止这台主机本身。
2026 年 7 月,IBM 发布安全公告,披露 Langflow OSS 存在可导致未授权远程代码执行的漏洞链,编号 CVE-2026-9198(CWE-94 代码注入,CVSS 3.1 评分 9.8 分,Critical),影响 1.0.0 到 1.10.0 的全部版本,修复版本为 1.10.1,IBM 明确表示没有临时缓解方案。该漏洞由安全研究员 Harish Kolla 报告。
8 月 4 日,CISA 将其列入已知被利用漏洞目录(KEV),确认存在野外利用,并要求联邦文职机构在 8 月 7 日前完成修复。公开 PoC 在披露后约一周出现,Metasploit 模块也在开发中。威胁情报遥测显示,从 7 月 6 日起已记录到来自 41 个国家、244 个独立 IP 的约 650 次利用尝试。
漏洞进了 KEV,意味着「正在被攻击」已是事实。但被攻击之后到底会发生什么?Bitbison 团队做了一件很硬核的事:把真实存在漏洞的 Langflow 实例暴露在互联网上,累计暴露 542.4 主机小时,完整记录了攻击者的每一步操作。
图 | CVE-2026-9198 关键事件时间线(图源:本文依据 IBM 公告、CISA KEV 及 Bitbison 报告整理绘制)
02 漏洞原理:两扇默认敞开的门
CVE-2026-9198 不是单点漏洞,而是两个各自存在缺陷的 API 端点被串成了一条链。这两个底层缺陷在上游分别以独立公告修复(Tenable 在检测插件中将其分别标注为 CVE-2026-9103 与 CVE-2026-8481)。
第一扇门:/api/v1/auto_login
这是 Langflow 为方便本地开发设计的「自动登录」功能,默认开启(AUTO_LOGIN)。问题在于:该端点会向任何网络调用者签发一枚 SUPERUSER(超级用户)角色的 JWT 令牌,不做任何身份校验。
也就是说,只要 Langflow 实例绑定在 0.0.0.0 或通过反向代理暴露到公网,互联网上任何人发一个 GET 请求,就能拿到最高权限令牌。单独看,这已构成未授权访问——攻击者凭此即可调用只读甚至管理类 API。
第二扇门:/api/v1/validate/code
该端点的设计用途是「校验」用户自定义组件中的 Python 代码。它的实现方式是:把提交的源码解析为 AST,名义上只执行函数定义而非任意语句——但致命的是,Python 在函数定义时就会求值装饰器表达式、默认参数值和类型注解。
换句话说,攻击者只要把恶意代码塞进 @装饰器(…)、def f(x=exec(…)) 或注解位置,代码就会在服务端无沙箱的 exec() 上下文中执行,其 globals 中还暴露了 importlib 与 Python 内建函数。AST 检查约束了输入的「形状」,却约束不了实际执行的内容。
链条闭合
单独看第二扇门,需要先有一枚令牌;单独看第一扇门,只能拿到一个访问 UI 的会话。两者结合,就构成了一条从匿名 HTTP 请求到服务器进程内任意代码执行的完整路径——这正是 CVSS 向量 AV:N/AC:L/PR:N/UI:N 全满的由来。
整个利用只需两个请求,脚本化成本极低:
GET /api/v1/auto_login → 获得 SUPERUSER JWT
POST /api/v1/validate/code → 携带令牌的恶意 Python,落地执行
修复情况:1.10.1 版本从两端分别斩断了链条——auto-login 不再签发长期超级用户令牌,validate/code 端点不再执行代码。同版本还修复了 Tweaks API 等另外三处代码注入问题。
图 | CVE-2026-9198 未授权远程代码执行利用链全景(图源:本文依据 Bitbison 报告与漏洞公告绘制)
03 蜜罐实验:把漏洞放到互联网上,看狼什么时候来
Bitbison 的实验设计很直接:部署默认配置、存在漏洞的 Langflow 实例,并在环境中埋设了诱饵凭据(包括一枚植入的 OpenAI API Key),完整记录网络请求与主机行为。
核心数字
| | | | — | — | | 指标 | 数值 | | 完成的暴露窗口 | 18 个(累计 542.4 主机小时) | | 出现攻击者代码执行的窗口 | 12 个(67%) | | 观测到的利用尝试总数 | 328 次 | | 成功执行代码的独立攻击源 | 31 个 | | 首次代码执行耗时 | 最快 34 分钟,中位数 15 小时,最长 38 小时 |
对攻击流量的漏斗分析更能说明问题——在完成暴露的窗口内,共有 48 个独立源地址请求过 Langflow API 端点:
· 48 个(100%) 请求了 Langflow API 端点;
· 35 个(73%) 发起了针对 CVE-2026-9198 的利用尝试;
· 31 个(65%) 成功在主机上执行了代码;
· 6 个(13%) 在主机上留下了持续运行的载荷。
结论很直白:只要你把默认配置的 Langflow 暴露到公网,被利用不是概率问题,而是时间问题——快则半小时。
图 | 蜜罐观测全景(图源:本文依据 Bitbison 报告数据绘制)
下面是蜜罐主机遥测的实景记录:一次经由 /api/v1/validate/code 触发的载荷执行,事件详情中可以看到 entrypoint 为 cve-2026-9198、进程以 www-data 身份运行 sh -c /tmp/abc&,载荷文件由 wget 写入、gnucp 创建。
图 | 蜜罐主机遥测——经 validate/code 触发的载荷落地执行过程(图源:Bitbison )
攻击者拿到执行权之后做了什么
对 31 个成功执行代码的攻击源逐一分析后,行为分布如下:
| | | | | — | — | — | | 行为 | 攻击源数量 | 占比 | | 搜索凭据(共发出 66 条凭据搜索命令) | 14 | 45% | | 通过 RCE 拿到植入的 OpenAI Key | 9 | 29% | | 投递加密挖矿程序(分属两个 XMRig 运营团伙) | 4 | 13% | | 安装远控植入体(1 个 AdaptixC2 agent + 1 个类 Mirai 僵尸程序) | 2 | 6.5% | | 表现出交互式操作特征 | 1 | 3.2% |
有一个细节尤其值得警惕:由于 Langflow 的 validate/code 校验响应会直接回显命令输出,成功执行代码的攻击源中约 29% 拿到了环境里植入的全部秘密值。也就是说,攻击者甚至不需要主动「翻文件」——执行一条读取环境变量的命令,凭据就自己送上门了。
04 四起典型攻击活动剖析
蜜罐观测到了四类具有代表性的攻击载荷投递行动,手法和成熟度差异很大。
活动一:AdaptixC2 Gopher 远控植入体(1 个样本)
攻击者在 37 分钟内评估了三台蜜罐主机,最终选定一台部署了定制的 AdaptixC2 Gopher 植入体,以 www-data 用户身份运行。该植入体支持远程命令执行、文件操作、进程查看和屏幕截图。研究者解密了两段其 C2 通信流量,但观测期间服务器未下发任何指令——更像是在「占坑」备用。
这个攻击源表现出明显的交互式操作特征:先用 1+1 测试代码执行是否生效,在三台主机中挑选目标,在两次启动失败之间检查 /tmp 目录内容和权限。这些动作说明会话背后存在主动控制,但仅凭命令记录无法判断操控者是人还是自动化 Agent。
活动二:XMRig 6.22.2 + Python 守护脚本(2 个样本)
攻击者部署了 XMRig 6.22.2 门罗币矿工程序,并配套一个 Python 守护脚本,每 10 秒检查并重启一次矿工,保证进程存活。
下图为蜜罐侧对/tmp/xmrig 的检测记录:告警判定”Executed binary /tmp/xmrig has unknown or untrusted provenance”,可看到矿工以www-data 身份反复被拉起执行,以及它与矿池方向的 TCP 通信记录
图 | XMRig 6.22.2 从 /tmp/xmrig 启动的检测告警与行为图谱(图源:Bitbison )
溯源线索很有意思:矿机的 rig 名称以 lf9 前缀拼接受害主机地址,明确将该次部署与 Langflow 利用相关联。而同一钱包地址已收到超过 65.7 万个 accepted shares,其中还包括两台标注了其他漏洞利用来源的矿机——说明这是一个跨漏洞、批量收割的挖矿运营团伙。
活动三:跨平台 XMRig 6.26.0 加载器(4 个样本)
攻击者使用 POSIX shell stager,按目标架构下发 Linux x86-64、Linux ARM64 和 FreeBSD amd64 三种构建。x86 载荷启动后立即删除自身文件,并在主机重建后以随机化文件名再次出现,研究者最终只能从 /proc 文件系统中将其恢复。
该矿工使用 TLS 加密通信,且二进制内未硬编码矿池和钱包配置,导致无法完成钱包归属溯源——反取证意识明显更强。
下图为该活动的证据图谱:载荷经漏洞入口落地,从外部地址 172.245.88.168 下载,以随机化文件名 /tmp/4NLsJMGR 执行后连接 XMR 矿池。
图 | XMRig 6.26.0 载荷下载、随机化名执行并连接矿池的证据图谱(图源:Bitbison)
活动四:多架构类 Mirai 僵尸程序(1 个样本)
攻击者先后尝试 x86、ARMv7 和 MIPS 架构的载荷,最终成功安装了一个 i386 版本,伪装路径为 /tmp/klogd(模仿内核日志守护进程名)。该二进制通过 HTTP 完成注册,使用自定义协议接收远程指令。MalwareBazaar 将其家族标注为 Mirai——值得注意的是,它不是矿工,而是典型的 DDoS/僵尸网络节点。
下图为蜜罐对该二进制的研判结论:”Malicious self-propagating binary dropped via webshell RCE, disguised as klogd”,并自动标注了 T1190、T1105、T1036.005、T1059.004、T1571、T1496 等 ATT&CK 技术标签。
图 | 类 Mirai 僵尸程序伪装为 klogd 的检测记录(图源:Bitbison)
05 四条值得记住的战术观察
1. 攻击载荷藏在哪里:定义时执行是主流
对 328 次利用尝试按”载荷投放位置”统计:
| | | | | — | — | — | | 载荷位置 | 尝试次数 | 占比 | | 函数默认参数,如 def f(x=exec(…)) | 234 | 71.3% | | 装饰器,如 @exec(…) | 73 | 22.3% | | 顶层代码、畸形输入或验证性探测 | 17 | 5.2% | | 通过组件载荷读取环境变量 | 4 | 1.2% |
默认参数和装饰器合计占 93.6%——攻击者非常清楚这个漏洞的正确打开方式,扫描 payload 已经高度标准化。
2. 不碰 RCE 端点,也能偷走密钥
在全部 15 个窃取到植入 OpenAI Key 的攻击源中,有 6 个根本没有调用过 validate/code。他们的路径是:用 auto_login 拿到 SUPERUSER 令牌后,直接发起完整数据的 GET /api/v1/flows,从返回的流定义 JSON 中读出保存的凭据。
这意味着:即使日志里没有代码执行痕迹,也不能排除凭据泄露。凡是不受信来源在 auto_login 之后成功执行过完整数据 GET /api/v1/flows 的,返回内容中保存的凭据都应视为已暴露,必须轮换。
3. 扫描量与利用风险并不正相关
| | | | | — | — | — | | 暴露窗口 | 外部请求量(次/小时) | 利用尝试次数 | | 全研究最繁忙窗口 | 192.2 | 0 | | 第二繁忙窗口 | 149.5 | 0 | | 首轮最安静窗口 | 24.9 | 36 | | 被利用的最安静窗口 | 8.5 | 3 |
最繁忙的两个窗口一次利用尝试都没有,安静的窗口反而被打穿。通用背景扫描噪声大小,无法作为「是否会被打」的参考——真正的攻击流量是定向的。
4. 攻击者分层明显,且存在跨 IP 情报共享
对 31 个成功执行代码的攻击源按行为模式分类:
· 15 个(48%)疑似纯自动化:机械重复固定命令,不根据响应调整。有个矿工攻击者把同一段语法错误的 Python 连续提交了 8 次,每次都收到相同报错;类 Mirai 团伙在 81 毫秒内对三台主机发出首个 x86 尝试,第一次成功后仍继续下载后续载荷。
· 9 个(29%)具备响应感知能力:会利用主机返回的信息调整动作。一个典型案例中,某 IP 使用植入的密码和一个仅在 13 分钟前返回给另一个 IP 的账户名执行 su -——说明这四个 IP 在共享侦察结果,背后大概率是同一运营实体。
· 1 个(3%)表现为交互式操作(即前文 AdaptixC2 案例)。
· 6 个(19%)活动量不足,无法分类。
06 防守清单:现在就做这六件事
1. 立即升级到 Langflow 1.10.1 或更高版本。 IBM 未提供受影响版本的任何临时缓解方案,升级是唯一修复路径。容器化部署请使用新镜像重建,避免旧镜像残留漏洞代码。
2. 把互联网暴露的 1.0.0–1.10.0 且开启 auto-login 的实例当作「可能已失陷」处理,而不是当作「待修补」处理。
3. 回溯日志排查:在反向代理和应用日志中检索 /api/v1/auto_login 之后紧跟 /api/v1/validate/code 的请求序列,以及 auto_login 之后来自不可信来源的完整数据 GET /api/v1/flows 请求。注意公开分析中提到路由存在 /api/v1/login/auto_login 等前缀变体,路径规则需一并覆盖。
4. 轮换凭据:流定义中保存的所有凭据、Langflow 服务环境可访问的一切凭据,全部轮换——validate/code 的响应可能已把这些值直接回显给了攻击者。
5. 排查「已删除但仍在运行」的进程:观测到两个载荷启动后删除了自身文件路径,其中一个只能通过 /proc 恢复。借助进程或内核级遥测检查无文件路径的可疑执行体。
6. 先处置再重建:在不升级/不摘除漏洞服务的情况下直接重建主机,等于把同样的暴露面再摆回互联网上。另建议设置 LANGFLOW_AUTO_LOGIN=false、以低权限专用账户运行服务、将实例置于认证代理或 VPN 之后。
07 技术附录
附录 A:漏洞档案
| | | | — | — | | 项目 | 内容 | | CVE 编号 | CVE-2026-9198 | | 漏洞类型 | CWE-94:代码生成控制不当(代码注入) | | CVSS 3.1 | 9.8(Critical)CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H | | 影响产品 | IBM Langflow OSS 1.0.0 – 1.10.0 | | 修复版本 | 1.10.1(无临时缓解方案) | | 利用前提 | 默认配置:auto-login 开启且 validate/code 端点网络可达 | | 链中底层缺陷 | auto_login 未授权签发 SUPERUSER 令牌;validate/code 无沙箱 exec()(上游分别修复,Tenable 标注为 CVE-2026-9103 / CVE-2026-8481) | | CISA KEV | 2026-08-04 列入,联邦机构修复期限 2026-08-07 | | 披露时间 | 2026 年 7 月(IBM 安全公告 7278927);发现者 Harish Kolla | | 野外首次观测 | 2026-08-13(Bitbison 蜜罐) |
附录 B:MITRE ATT&CK 技术映射
| | | | | | — | — | — | — | | 战术(Tactic) | 技术 ID | 技术名称 | 本次观测中的对应行为 | | 初始访问(TA0001) | T1190 | Exploit Public-Facing Application | 利用公网暴露的 Langflow API 端点链获取初始立足点 | | 初始访问 / 防御规避 / 持久化 / 权限提升 | T1078 | Valid Accounts | 通过 auto_login 获取 SUPERUSER 令牌;使用植入的密码与账户名执行 su – | | 执行(TA0002) | T1059.006 | Command and Scripting Interpreter: Python | 通过装饰器/默认参数/注解在 exec() 中执行 Python 载荷 | | 执行(TA0002) | T1059.004 | Command and Scripting Interpreter: Unix Shell | 使用 POSIX shell stager 按架构下发挖矿载荷 | | 持久化(TA0003) | T1543 | Create or Modify System Process | Python 守护脚本每 10 秒拉起矿工进程 | | 防御规避(TA0005) | T1036 | Masquerading | 载荷伪装为 /tmp/klogd;主机重建后以随机化文件名重现 | | 防御规避(TA0005) | T1070.004 | Indicator Removal: File Deletion | 载荷启动后删除自身文件路径,仅可从 /proc 恢复 | | 凭据访问(TA0006) | T1552 | Unsecured Credentials | 66 条凭据搜索命令;读取环境变量与流定义中保存的 API Key | | 凭据访问(TA0006) | T1528 | Steal Application Access Token | 窃取 auto_login 签发的 SUPERUSER JWT 以调用受保护 API | | 发现(TA0007) | T1083 | File and Directory Discovery | 检查 /tmp 目录内容 | | 发现(TA0007) | T1082 | System Information Discovery | 检查主机权限配置,评估三台候选主机 | | 发现(TA0007) | T1057 | Process Discovery | 植入体支持进程查看(AdaptixC2) | | 收集(TA0009) | T1113 | Screen Capture | AdaptixC2 植入体具备屏幕截图能力 | | 命令控制(TA0011) | T1071.001 | Application Layer Protocol: Web | 类 Mirai 僵尸程序通过 HTTP 完成注册与指令交互 | | 命令控制(TA0011) | T1573 | Encrypted Channel | XMRig 6.26.0 使用 TLS 加密矿池通信 | | 命令控制(TA0011) | T1105 | Ingress Tool Transfer | 向受害主机下载多架构矿工与僵尸程序载荷 | | 影响(TA0040) | T1496 | Resource Hijacking | 部署 XMRig 门罗币矿工劫持算力 |
附录 C:失陷指标(IOC)
样本哈希(SHA-256,源自 Bitbison 报告):
1835f744861e9aa6bf965ed9f21cc0109b3d01888d5b8f8c304c5cc297a9d9bd
b0e1ae6d73d656b203514f498b59cbcf29f067edf6fbd3803a3de7d21960848d
f11076cfdf1e60ff7e117c879504f9be20432b0aadf9b8f8a37e3d4bbb22e92f
c61cd83b6f8f0bcf08ed475b4001a1a44ff262dd1649c5ba03b06d542948024b
0b8e037d160bdb0b621c975c424f680b814bc438fd492ae376ff3140e209e480
6a1f70ef89684037bb3d0536657f00a92fbbcdb9067195b060128a221df79df5
ed23db197d907bdb6873c02b7222110321b0f859e329c420a6d0d6e50220308f
3a56f24ab23598a62933859f8839bf74796547c29d5e78727e56fbc497327330
文件与路径指标:
| | | | — | — | | 指标 | 说明 | | /tmp/xmrig | XMRig 6.22.2 矿工执行路径 | | /tmp/klogd | 类 Mirai i386 僵尸程序的伪装路径 | | /proc 中的无路径运行进程 | 载荷自删除后的排查入口 |
网络与日志指标:
| | | | — | — | | 指标 | 说明 | | GET /api/v1/auto_login 后紧跟 POST /api/v1/validate/code | 核心利用链检测信号(注意 /api/v1/login/auto_login 等前缀变体) | | validate/code 请求体中包含装饰器/默认参数/注解位置的可执行 Python | 攻击载荷的典型形态 | | auto_login 后来自不可信来源的完整数据 GET /api/v1/flows | 凭据窃取行为,触发凭据轮换 | | rig 名称以 lf9 开头的 XMRig 矿机 | 与 Langflow 利用相关联的挖矿团伙特征 | | 每 10 秒拉起矿工进程的 Python 守护脚本 | 挖矿持久化特征 |
附录 D:检测思路速查
1. Web 层:告警同源 IP 在短时间内顺序请求 auto_login → validate/code;对携带 auto_login 签发令牌的 validate/code POST 请求重点审计。
2. 主机层:监控 Langflow Python 进程派生出的异常子进程(shell、curl、wget、包管理器等)。
3. 网络层:监控 Langflow 主机向从未联系过的外部基础设施发起的出站连接,尤其是非常用端口。
4. 进程层:通过 eBPF/内核审计捕获「已删除但仍运行」的可执行文件。
参考链接
- https://bitbison.io/blog/langflow-rce-exposure/
- https://www.ibm.com/support/pages/node/7278927
- https://nvd.nist.gov/vuln/detail/CVE-2026-9198
- https://github.com/advisories/GHSA-5wm9-vgmg-cjv6
- https://www.cisa.gov/known-exploited-vulnerabilities-catalog
- https://github.com/langflow-ai/langflow/releases
- https://thehackernews.com/2026/08/cisa-flags-langflow-rce-tomcat-and-n.html
- https://www.securityweek.com/cisa-warns-of-exploited-langflow-n-central-and-tomcat-vulnerabilities/
- https://www.tenable.com/plugins/nessus/334529
- https://github.com/0xdak/cve-2026-9198_exploit
- https://bazaar.abuse.ch/
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:奇安信威胁情报中心 威胁情报中心 威胁情报中心《34分钟失陷:Langflow CVE-2026-9198 野外利用实录》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论