综合 PostgreSQL 18.6 的 output_plugin_libraries 白名单:第三方逻辑解码插件被挡掉,pg_upgrade --check 会先失败

2026-10-29 21:05:49

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-rewrite
  • pg-squeeze
  • postgres-decoderbufs
  • wal2json

以及各类 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,停机替换二进制即可;跳过多个小版本升级的,可能需要额外的更新后步骤。

复制全文 生成海报 PostgreSQL 数据库 运维

推荐文章

程序员茄子在线接单