CVE-2026-6471 的概念验证漏洞利用,演示了通过 PostgreSQL 中的逻辑解码 dlopen 实现权限提升,以达到任意代码执行和超级用户后门的目的。
PostgreSQL 逻辑解码允许持有 REPLICATION 权限的非超级用户角色创建逻辑复制槽并选择输出插件。在受影响版本中,该选择没有授权检查,因此服务器会对插件名称指向的任何内容执行 dlopen()。指定库路径会在 postgres 后端进程中运行该库的代码,且以运行服务器的操作系统账户身份执行。这相当于以数据库服务器的操作系统用户身份执行任意代码,对于持有应用数据的数据库而言,实际上等同于服务器被完全接管。
该漏洞已在 PostgreSQL 18.6、17.11、16.15、15.19 和 14.24 中通过 output_plugin_libraries 白名单(默认 pgoutput, test_decoding)修复。任何不在该列表中的内容现在都会在任何 dlopen 之前报错 library "X" may not be used as an output plugin。
对两个构建执行相同的步骤,仅 PostgreSQL 版本不同。一个低权限账户(LOGIN + REPLICATION,非超级用户,无操作系统访问权限)执行普通逻辑解码订阅者的操作,然后请求服务器将任意库作为输出插件加载。在易受攻击的构建中,该库以 postgres 操作系统用户身份运行并植入一个持久的超级用户后门角色,因此仅拥有复制权限的账户在运行结束时获得可用的超级用户登录权限。
| 步骤 | 易受攻击的 16.14 | 已修补的 16.15 |
|---|---|---|
| 侦察(角色为复制权限,非超级用户) | 通过 | 通过 |
| 基线(使用内置 pgoutput 的逻辑槽) | 通过 | 通过 |
| 触发(槽插件 = 攻击者库路径) | 服务器加载它 | 加载前被拒绝 |
| 接管(以植入的超级用户后门登录) | 超级用户 | 无此角色 |
cve-2026-6471-postgres-logical-decoding-dlopen.txt 是一个 Exploitmatic 解决方案(.txt):包含数据与断言,无代码。运行时针对目标机器重放该文件。该解决方案在运行时交付 pwn.so(文件中的 base64 编码),以低权限复制角色驱动 SQL,然后以载荷植入的超级用户后门角色登录。pwn.c 是载荷库源码,pwn.so 是其构建产物:一个以 postgres 操作系统用户身份运行的 ELF 构造函数,通过本地套接字以数据库超级用户身份连接(peer/trust),并创建持久角色 cve6471_backdoor LOGIN SUPERUSER PASSWORD 'BackdoorPass1'。仅当服务器实际加载该库时才会运行,即仅在易受攻击的构建上运行。使用 gcc -Os -shared -fPIC -o pwn.so pwn.c 在与服务器镜像匹配的 Linux libc 上构建。前置条件:你有 docker 访问权限。
lab/ 文件夹包含用于验证此 PoC 的精确副本。构建并运行两个容器(易受攻击 = postgres 16.14,已修补 = postgres 16.15):
docker build -t pg-6471-vuln -f lab/Dockerfile.vuln lab
docker build -t pg-6471-fixed -f lab/Dockerfile.fixed lab
docker run -d --name pg-6471-vuln -p 15432:5432 -e POSTGRES_PASSWORD=lab-super-pw pg-6471-vuln
docker run -d --name pg-6471-fixed -p 15433:5432 -e POSTGRES_PASSWORD=lab-super-pw pg-6471-fixed
两个容器均运行官方 postgres 镜像并启用 wal_level=logical。初始化脚本 lab/01-repro.sh 创建解决方案使用的低权限角色 repro_rep LOGIN REPLICATION PASSWORD 'repropass',该角色不是超级用户。
然后重放解决方案:
exploitmatic run cve-2026-6471-postgres-logical-decoding-dlopen.txt 127.0.0.1
通过变量覆盖指向已修补的容器,无需编辑文件:
exploitmatic run cve-2026-6471-postgres-logical-decoding-dlopen.txt 127.0.0.1 \
--var ctr=pg-6471-fixed
ctr 是 docker 容器,pw 是复制角色的密码。
| 目标 | 结果 |
|---|---|
| postgres 16.14(易受攻击),wal_level=logical | 4/4 已验证,超级用户后门登录有效 |
| postgres 16.15(已修补),wal_level=logical | 3/4 未验证,无后门 |
仅限授权测试与研究,且仅限你拥有或有权测试的系统。此 PoC 演示了认证后的权限提升:它需要现有的具有 REPLICATION 属性的低权限数据库账户,以及一种将攻击者控制的代码放置到 postgres 操作系统用户可以加载的位置的方法。这不是远程未认证攻击。被加载的代码之所以能达到数据库超级用户权限,是因为拥有服务器的操作系统账户可以通过本地套接字以超级用户身份连接(peer/trust),这是标准的 PostgreSQL 部署实践。