【CVE-2026-6637】PostgreSQL refint のスタックバッファオーバーフローとSQLインジェクションを解説と対応方法

CVE・脆弱性情報

この記事の概要

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 に refint contrib モジュールがインストールされている
  • 攻撃者がデータベースにログインできる(特権不要)

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

コメント