この記事の概要
PostgreSQL の contrib モジュール refint にスタックバッファオーバーフロー脆弱性(CVE-2026-6637、CVSS 8.8)が公開されました。
特権を持たない通常データベースユーザーが、PostgreSQL を実行している OS ユーザー権限で任意コード実行を狙えるため、refint を有効化している環境は即時パッチ適用(18.4 / 17.10 / 16.14 / 15.18 / 14.23)または DROP EXTENSION refint で対応してください。
この脆弱性について
2026年5月14日、PostgreSQL開発チームは11件のセキュリティ修正を含むアップデートを公開しました。
その中で実務的に最も注意が必要なのが CVE-2026-6637 です。
| 項目 | 内容 |
|---|---|
| CVE-ID | CVE-2026-6637 |
| CVSSスコア | 8.8(High) |
| 対象バージョン | PostgreSQL 14.x〜18.x(各修正版未満) |
| 修正版 | 18.4 / 17.10 / 16.14 / 15.18 / 14.23 |
| 公開日 | 2026年5月14日 |
| 発見者 | Nikolay Samokhvalov |
この脆弱性が厄介なのは、特権を持たない通常データベースユーザーが、データベースを実行しているOSユーザー権限で任意コードを実行できる点です。
つまり、アプリケーション用の読み取り専用ユーザーであっても、サーバーを乗っ取られる可能性があります。
自分がこのアドバイザリを読んだとき、最初に思ったのが「うちのPostgreSQLに refint 入ってたっけ?」でした。
意外と見落としがちなポイントなので、後述の確認コマンドを参照してください。
原因:なぜ特権なしでOSレベルのコード実行が可能なのか
PostgreSQL には contrib モジュールと呼ばれる拡張機能群があります。
その中の refint(referential integrity)は、テーブル間の参照整合性をトリガーベースで実現するためのユーティリティです。
FOREIGN KEY 制約の代替や補完として使われることがあります。
この refint モジュールの C 実装内部に、固定サイズのスタックバッファが存在します。
長いカラム名を渡されると、このバッファが溢れます(スタックバッファオーバーフロー)。
結果として、スタック上のリターンアドレスが書き換わり、攻撃者が用意したコードが実行されてしまいます。
refint関数の内部処理
↓
固定サイズのスタックバッファにカラム名をコピー
↓
カラム名が長い場合 → バッファ境界を越えて上書き
↓
リターンアドレスの改ざん → 任意コード実行
もう一つの攻撃ベクターとして SQLインジェクションもあります。
アプリケーションが「ユーザーが制御できるカラム」を refint のカスケードプライマリキーとして宣言し、かつユーザーがそのカラム値を更新できる設計になっている場合、攻撃者は任意のSQLをデータベースユーザー権限で実行できてしまいます。
つまり、この脆弱性は「refint を使っているかどうか」が攻撃の分かれ目になります。
使っていなければ影響を受けません。
影響範囲:どんな環境が対象になるか
影響を受けるバージョン
| メジャーバージョン | 影響を受けるバージョン | 修正版 |
|---|---|---|
| PostgreSQL 18 | 18.3以前 | 18.4 |
| PostgreSQL 17 | 17.9以前 | 17.10 |
| PostgreSQL 16 | 16.13以前 | 16.14 |
| PostgreSQL 15 | 15.17以前 | 15.18 |
| PostgreSQL 14 | 14.22以前 | 14.23 |
なお、PostgreSQL 14はEOL予告版として今回のリリースで言及されています。
14系を使っている環境はバージョンアップを強く検討してください。
攻撃が成立する条件
スタックバッファオーバーフローは以下の条件で成立します。
- PostgreSQL に
refintcontrib モジュールがインストールされている - 攻撃者がデータベースにログインできる(特権不要)
SQLインジェクションはさらに条件が絞られます。
refintのカスケードプライマリキーとして「ユーザー制御カラム」が宣言されている- かつ、そのカラムへの UPDATE をユーザーが実行できる
バッファオーバーフローの方は条件が緩く、refint さえ有効なら一般ユーザーで即座に悪用できる点に注意が必要です。
悪用された場合のリスク
- データベースを実行しているOSユーザー(通常
postgres)権限での任意コード実行 - データ窃取・改ざん・削除
- DBサーバーを起点にした内部ネットワークへの侵害
RDSやCloud SQLといったマネージドサービスでは、OSレベルのコード実行は制限されているケースが多い。
ただし、SQLインジェクションのリスクは残るため確認が必要です。
対応策・回避策:今すぐできることと恒久対策
最優先:パッチ適用
パッチ適用が最も確実な対策です。
以下の修正版へアップグレードしてください。
# バージョン確認
psql -V
# または接続後に
SELECT version();
RPM系(RHEL/CentOS/AlmaLinux):
sudo dnf update postgresql-server
# バージョン確認
sudo dnf info postgresql-server
Debian/Ubuntu系:
sudo apt update
sudo apt upgrade postgresql
# バージョン確認
psql --version
pgdg リポジトリを使っている場合(メジャーバージョン指定の例):
# PostgreSQL 17の例
sudo apt install postgresql-17=17.10*
再起動が必要な場合:
sudo systemctl restart postgresql
自分の環境が影響を受けるか確認する方法
まず refint がインストールされているかどうかを確認します。
-- 拡張機能の確認(全データベース)
SELECT datname, extname FROM pg_extension e
JOIN pg_database d ON true
WHERE extname = 'refint';
-- または特定のデータベースで
\dx refint
Linuxでパッケージレベルから確認する場合:
# RPM系
rpm -qa | grep -i postgresql | grep contrib
# Debian/Ubuntu系
dpkg -l postgresql-contrib*
refint がインストールされていなければ、このCVEの影響を受けません。
暫定回避策(すぐにアップグレードできない場合)
パッチ適用が困難な場合は、refint 拡張を無効化することで影響を回避できます。
-- 拡張の削除(依存オブジェクトがない場合)
DROP EXTENSION IF EXISTS refint;
-- 依存オブジェクトが存在する場合はCASCADEが必要(注意して実行)
DROP EXTENSION IF EXISTS refint CASCADE;
また、SQLインジェクションの回避策として、refint のカスケードプライマリキーとして「ユーザー制御カラム」が設定されていないか、設計を見直してください。
まとめ
- CVE-2026-6637 は PostgreSQL の contrib モジュール
refintの固定サイズバッファオーバーフロー - 特権なしのデータベースユーザーが OS ユーザー権限でコード実行できる可能性がある
- 対象は PostgreSQL 14〜18 の広範なバージョン(EOL前の14系も対象)
- 修正版(18.4 / 17.10 / 16.14 / 15.18 / 14.23)へのアップグレードが最優先
- まず
\dx refintで拡張が入っているかを確認します。入っていなければ影響を受けません - 即時アップグレードできない場合は
DROP EXTENSION refintで暫定回避
マネージドサービス利用者は各クラウドベンダーのメンテナンス通知を確認し、パッチ適用のスケジュールを把握しておくとよいでしょう。
参考リンク
- NVD:https://nvd.nist.gov/vuln/detail/CVE-2026-6637
- ベンダーアドバイザリ(PostgreSQL公式):https://www.postgresql.org/support/security/CVE-2026-6637/
- GitHub Advisory Database:https://github.com/advisories/GHSA-96xx-m79q-xh44

コメント