PostgreSQL 18.6 的 output_plugin_libraries 白名单:第三方逻辑解码插件被挡掉,pg_upgrade --check 会先失败
PostgreSQL 18.6 新增了服务器参数 output_plugin_libraries,用来限制逻辑解码可以加载哪些输出插件。该改动对应 CVE-2026-6471,由 Jacob Champion 提交;Debian 的 postgresql-18 包在 18.6-1 版本中同步了这一上游版本(18.5 从未发布)。
白名单的默认值与显式放开
在 18.6 之前,拥有复制权限的用户可以为逻辑解码选择任意可加载库,这导致一系列利用场景。18.6 改为白名单机制,默认只允许随 PostgreSQL 一起发布的输出插件,即 pgoutput 和 test_decoding。
依赖其他输出插件的安装,必须在更新服务器后自行把它们加入列表:
output_plugin_libraries = 'pgoutput, test_decoding, my_trusted_decoder'
PostgreSQL 项目感谢 Vladimir Tokarev 与 Yu Kunpeng 报告该问题(CVE-2026-6471)。
排查与修改顺序
升级前先确认现有复制槽用的是什么插件,不要凭印象改配置:
SELECT slot_name, plugin, database, active
FROM pg_replication_slots
ORDER BY slot_name;
拿到 plugin 列的取值后,写入 postgresql.conf(或在 psql 里用 ALTER SYSTEM):
ALTER SYSTEM SET output_plugin_libraries = 'pgoutput, test_decoding, wal2json';
ALTER SYSTEM 只是把设置写进 postgresql.auto.conf,必须 reload 才生效:
SELECT pg_reload_conf();
SHOW output_plugin_libraries;
用 SHOW 确认实际生效值,而不是只看配置文件里写了什么。
pg_upgrade --check 的前置条件
从 17 及以后版本迁移时,pg_upgrade --check 会比对旧集群逻辑复制槽所用的插件与新集群的 output_plugin_libraries;如果新集群不允许这些插件,检查直接失败。
因此白名单要在新集群上先设好,再跑:
pg_upgrade --check ...
顺序反了会看到检查报错,而不是等到启动复制时才暴露。
Debian 包的 Breaks
postgresql-18 18.6-2 为受 output_plugin_libraries 变更影响的包加了 Breaks:
pg-rewritepg-squeezepostgres-decoderbufswal2json
以及各类 pg-output-plugin。另外还加了 timescaledb,原因不同,尚待确定。
18.6-3 修正了 Breaks 里的包名,并去掉对 2.0.22 之前 dbconfig-common 的旧 Breaks。同一版本还移除了 pg_numa_init 与 LLVM 21 补丁,两者已合并上游。
pg_trgm 的 CVE-2026-2007
同版本还加固了 contrib/pg_trgm,对应 Heikki Linnakangas 的修复:在某些 locale 下,小写化后的字符数(不是字节数)可能变多,从而引发潜在的缓冲区越界。该小写化行为是 18 版新引入的,所以这是一个新 bug(CVE-2026-2007)。
18.x 小版本节奏
18.1(2025-11-13)修复了 2 个安全漏洞与 50 多个 bug:
- CVE-2025-12817:
CREATE STATISTICS不检查 schema 的 CREATE 权限 - CVE-2025-12818:libpq 分配大小计算整数回绕,可导致越界写并段错误
18.x 系列小版本免 dump/restore,停机替换二进制即可;跳过多个小版本升级的,可能需要额外的更新后步骤。