#844·kotaemon

[安全] 在 /check_connection 端点中通过不安全的反序列化实现未授权 RCE

作者: HK4zCzi创建于 2026年6月29日更新于 2026年8月4日
标签bug

说明

□ 总结

`/check connection' Gradio API端点中不安全的去序列化脆弱性允许任何未经认证的攻击者在服务器上执行任意操作系统命令,并具有应用程序进程的特权. 不需要任何类型的证书、会话饼干或 API 密钥。 脆弱性之所以存在,是因为所有Gradio事件处理器端点,不管应用程序的登录UI,都可以公开到达,端点将攻击者控制的YAML/JSON解为任意的Python类,使用"importlib.import module" +"gettr".

  • ** 严重性:** 临界值(CVSS 3.1分 10.0分)
  • ** 变量:** `CVSS:3.1.AV:N/AC:L/PR:N/UI:N/S:C:H/I:H/A:H'

-- -- . . .

□ 细节

    • 根因1 — Gradio 建筑绕行( 无服务器侧验证执行)

libs/ktem/ktem/main.py', 第127至189行:访问控制作为UI分页可见度在toggle login visibility ()'中进行。 当用户未登录时,聊天/设置标签被隐藏在浏览器中,但所有361 Gradio fn=-事件- handler端点仍可被调用为"HTTP POST /run/prespect"或通过没有服务器侧门的Gradio客户SDK. 申请将检查-连接 ' 登记为没有用户-id'输入线的公开API终点:

[Python]

libs/ktem/ktem/llms/ui.py线路 243-245

自己. 检查 连接 btn. 单击( c) 自动。检查 连接, 输入=[self.sselect llm name,自.edit spec],# QQ没有用户 d . . . . . . . . (中文(简体) ).


整个 " llms/ui.py " 文件的grep返回“ user id” 、“is admin” 、“ require login” 或任何认证守卫的零匹配值。

* 根因2——用户提供数据的`去区域化(安全=虚假)'

" libs/ktem/ktem/llms/ui.py " , " check-connection () " ,344至381行:

```2ZZ
async def check connection(自己,所选 llm name,编辑 spec):
. . . . . . . .
spec = yaml.load (所选的  spec, loader = YAML 编号DateSafeLoader) # 攻击者 YAML
info ["spec"].update(spec) # QQ攻击者覆盖 type 
. . . . . . . .
LLM = 取消序列化(info[" spec"], safe=False)# QQ 任意类即时
resp = 等待 LLM ("Hi")
自我.  log. append( f) “ 获取响应 : {resp} ”

流出/利用/模块.py',去区域化(安全=虚假)':

已取消序列( spec, safe= True) :
模块 名称, obj name = spec [" type "]. rsplit ("""), 1
cls = getatr (importlib.import module (module name), obj name) (中文(简体) ).
返回 cls( QQk: v for k, v in spec. items () if k! = " type " )

任何已安装的Python级都可以用攻击者提供的构造参数进行即时化. `子进程. check output' 是运行 shell 命令并返回输出的 Python 标准库中的可调用程序 。

QQ 攻击链

  1. 通过`/create llm'(也未经认证)登记一个临时的LLM,以便在LLM登记册中取得一个被命名的槽。 它提供了“ 检查- 连接” 取自数据库的“ info[' spec] ” 基础。
  2. 向YAML以Unittest.mock'覆盖的/检查 连接'发射所设计的有效载荷。 模拟和设定“返回值” . . . . . . .

内容来源: Cinnamon/kotaemon