Hunt-Benito/pgadmin-ai-assistant-sql-injection-cve-2026-17351-lexer-differential-bypass

GitHub: Hunt-Benito/pgadmin-ai-assistant-sql-injection-cve-2026-17351-lexer-differential-bypass

该项目是 pgAdmin 4 AI 助手 SQL 注入绕过漏洞 CVE-2026-17351 的 PoC,演示了通过 sqlparse 与 PostgreSQL 之间的 Lexer 解析差异绕过只读限制并执行写操作的完整攻击链。

Stars: 0 | Forks: 0

# CVE-2026-17351 — pgAdmin 4 AI 助手通过 Lexer 差异绕过只读限制 CVE-2026-17351 的 PoC,这是 pgAdmin 4 的 AI 助手中一个严重的(CVSS 9.0)SQL 注入绕过漏洞。 ## 漏洞概述 pgAdmin 4 版本 9.13 至 9.16 使用 Python 的 `sqlparse` 库来验证 LLM 生成的 SQL 查询是否为单一的只读语句。在 PostgreSQL 的 `standard_conforming_strings = on`(自 PostgreSQL 9.1 以来的默认设置)配置下,`sqlparse` 和 PostgreSQL 在处理字符串字面量中的反斜杠方式上存在分歧。这使得攻击者能够构造一个 payload,在 `sqlparse` 验证中作为单一的 `SELECT` 语句通过,但在 PostgreSQL 中却作为四条语句执行——其中包括结束只读事务的 `COMMIT` 以及随后的写操作语句。 ## Payload ``` SELECT '\';COMMIT;CREATE TABLE pwn(x int);SELECT 1 --' ``` - **sqlparse** 看到的是一个带有大型字符串字面量的 `SELECT` 语句 → 验证通过 - **PostgreSQL** 看到的是:`SELECT '\'` + `COMMIT` + `CREATE TABLE pwn(x int)` + `SELECT 1 --'` ## 交付方式 该 payload 通过**间接 prompt 注入**进行交付:攻击者将其植入到 AI 助手读取的数据库对象(列注释、行值、视图定义)中。当合法用户提问时,LLM 会读取中毒数据并将其作为 `execute_sql_query` 工具调用发出。 ## 文件 | 文件 | 描述 | |---|---| | `poc.py` | 演示 lexer 差异:sqlparse 验证通过,简单查询协议执行了多条语句,扩展查询协议则阻止了它 | | `prompt_injection_demo.py` | 模拟完整攻击链:作为列注释植入的 payload → 模拟 LLM 读取它 → 验证通过 → 执行 | ## 环境要求 ``` pip install psycopg[binary] sqlparse ``` 您还需要一个运行中的 PostgreSQL 实例(14+ 版本): ``` docker run -d --name pg-poc \ -e POSTGRES_PASSWORD=secret \ -e POSTGRES_DB=testdb \ -p 5433:5432 \ postgres:18 ``` ## 用法 ``` # Main PoC — lexer differential 演示 python3 poc.py # Prompt injection 投递演示 python3 prompt_injection_demo.py # 自定义连接参数 python3 poc.py --host 10.0.0.5 --port 5432 --user postgres --password mypw ``` ## 修复方案(pgAdmin 9.17) 该修复通过以下方式强制使用 psycopg3 的**扩展查询协议**: 1. 在 LLM 的专用连接上设置 `conn.prepare_threshold = 0` 2. 向 `cursor.execute()` 传递 `prepare=True` 这使得 PostgreSQL 自身的 `Parse` 步骤成为语句边界的权威判定者——无论客户端的 lexer 如何对其进行分类,它都能从结构上拒绝多语句文本。 ## 参考 - CVE:https://nvd.nist.gov/vuln/detail/CVE-2026-17351 - GitHub Issue:https://github.com/pgadmin-org/pgadmin4/issues/10192 - 修复提交:https://github.com/pgadmin-org/pgadmin4/commit/ef76102bcd1cdb544eb9b4ef18d3382f22b76752 - 原始 CVE(CVE-2026-12045):https://nvd.nist.gov/vuln/detail/CVE-2026-12045 - 报告者:Kai Aizen (SnailSploit) ## 免责声明 此 PoC 仅用于教育和授权测试目的。
标签:CISA项目, pgAdmin, PoC, 大模型安全, 暴力破解, 测试用例, 请求拦截, 逆向工具, 间接提示词注入