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, 大模型安全, 暴力破解, 测试用例, 请求拦截, 逆向工具, 间接提示词注入