IPBUF安全漏洞报告
English
CVE-2026-41496 CVSS 8.1 高危

CVE-2026-41496 PraisonAI SQL注入漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2026-41496
漏洞类型
SQL注入
CVSS评分
8.1 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
PraisonAI, praisonaiagents

相关标签

SQL注入PraisonAICVE-2026-41496高危漏洞数据库安全SaaS安全

漏洞概述

PraisonAI是一款多智能体团队系统。在4.6.9版本之前的PraisonAI和1.6.9版本之前的praisonaiagents中,存在严重的SQL注入漏洞。虽然之前针对CVE-2026-40315的修复为SQLiteConversationStore添加了输入验证,但该修复并不完整。该漏洞影响了MySQL、PostgreSQL、异步数据库、Turso、SingleStore、Supabase和SurrealDB等九个后端。这些后端直接将用户提供的table_prefix参数通过f-string拼接到SQL语句中,导致攻击者可以注入恶意SQL代码。此外,postgres.py还直接在DDL语句中使用了未经验证的schema参数。该问题已在后续版本中修复,攻击者可利用此漏洞窃取或篡改数据库中的敏感信息。

技术细节

该漏洞的根本原因在于PraisonAI在处理数据库连接配置时,对用户输入的参数缺乏全面的验证。虽然开发人员曾修复了SQLiteConversationStore中的类似问题(CVE-2026-40315),但未能将安全补丁同步应用到其他数据库后端。受影响的后端包括MySQL、PostgreSQL、Turso等九种数据库连接器。在这些后端的代码实现中,table_prefix参数被直接传递给Python的f-string,并拼接到SQL查询语句中。由于没有进行转义或参数化查询,攻击者可以通过控制table_prefix注入任意SQL命令。代码库中共有52处此类未经验证的注入点。此外,在postgres.py文件中,schema参数也被直接用于DDL(数据定义语言)语句中,进一步扩大了攻击面。攻击者利用低权限账户即可通过网络发起攻击,无需用户交互,成功利用该漏洞可导致数据库数据泄露(机密性影响)或数据被篡改(完整性影响)。

攻击链分析

STEP 1
侦察阶段
攻击者识别目标系统使用的是受影响版本的PraisonAI(< 4.6.9)或praisonaiagents(< 1.6.9),并确认其使用了MySQL、PostgreSQL等受影响的数据库后端。
STEP 2
漏洞利用
攻击者向应用程序发送精心构造的请求,其中包含恶意的`table_prefix`或`schema`参数。该参数包含SQL注入载荷(如`'); DROP TABLE users; --`)。
STEP 3
代码执行
应用程序后端在处理该请求时,直接将恶意参数通过f-string拼接到SQL语句中,并传递给数据库执行。
STEP 4
影响达成
数据库执行了注入的恶意SQL命令,导致敏感数据泄露(机密性影响)或数据被非法修改/删除(完整性影响)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC for CVE-2026-41496: SQL Injection in PraisonAI backends # This PoC demonstrates how a malicious table_prefix leads to SQL injection class VulnerableBackend: def __init__(self, table_prefix): # Vulnerable code pattern: direct f-string interpolation self.table_prefix = table_prefix def create_table(self): # Simulating the vulnerable SQL construction found in mysql.py, postgres.py, etc. # The table_prefix is not sanitized. query = f"CREATE TABLE IF NOT EXISTS {self.table_prefix}_data (id INT, value TEXT);" print(f"[DEBUG] Executing SQL: {query}") # In a real scenario, this query would be executed against the database return query # Exploit Scenario # Attacker crafts a payload to break out of the table name context # Payload: test_data; DROP TABLE test_data; -- malicious_input = "test_data); DROP TABLE test_data; --" backend = VulnerableBackend(table_prefix=malicious_input) # This generates: CREATE TABLE IF NOT EXISTS test_data); DROP TABLE test_data; --_data (id INT, value TEXT); # Depending on the DB backend, this could result in data deletion or injection of other SQL commands. backend.create_table()

影响范围

PraisonAI < 4.6.9
praisonaiagents < 1.6.9

防御指南

临时缓解措施
如果无法立即升级,应严格限制对PraisonAI应用的网络访问,并在WAF或API网关层面部署规则,拦截包含SQL注入特征(如单引号、分号、注释符)的table_prefix参数请求。

参考链接