概念验证(PoC),演示通过 sqlparse/PostgreSQL 词法分析器差异在 pgAdmin 4 的 AI 助手中实现 CVE-2026-17351 SQL 注入绕过,并包含间接提示注入的投递。
针对 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 对字符串字面量中反斜杠的处理方式存在分歧。这使得攻击者能够构造一个载荷,使其作为单个 SELECT 通过 sqlparse 的验证,但在 PostgreSQL 中却作为四条语句执行——其中包括一条结束只读事务的 COMMIT 以及后续的写语句。
SELECT '\';COMMIT;CREATE TABLE pwn(x int);SELECT 1 --'
SELECT → 验证通过SELECT '\' + COMMIT + CREATE TABLE pwn(x int) + SELECT 1 --'该载荷通过间接提示注入进行投递:攻击者将其植入 AI 助手会读取的数据库对象(列注释、行值、视图定义)中。当合法用户提问时,LLM 会读取被投毒的数据,并将其作为 execute_sql_query 工具调用输出。
| 文件 | 描述 |
|---|---|
poc.py | 演示词法分析器差异:sqlparse 验证通过,简单查询协议会执行多条语句,扩展查询协议则会阻止 |
prompt_injection_demo.py | 模拟完整攻击链:载荷作为列注释植入 → 模拟 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 demonstration
python3 poc.py
# Prompt injection delivery demo
python3 prompt_injection_demo.py
# Custom connection parameters
python3 poc.py --host 10.0.0.5 --port 5432 --user postgres --password mypw
该修复通过以下方式强制使用 psycopg3 的扩展查询协议:
conn.prepare_threshold = 0cursor.execute() 传递 prepare=True这使得 PostgreSQL 自身的 Parse 步骤成为语句边界的权威——无论任何客户端词法分析器如何分类,它都会从结构上拒绝多语句文本。
此 PoC 仅用于教育和授权测试目的。