本文へ移動
情シスの相棒
ニュース約10分で読めます

pgAdmin 4の脆弱性15件、共用のサーバーモードは9.19へ

pgAdmin 4 9.19で直った15件のうち12件は、サーバーモードで共用する形の問題です。デスクトップ版で気にする1件と、9.19に上げると止まる接続、上げても残る共有の設定が分かります。

公開 更新 執筆・監修:佐々木 航人が監修しながらAIを活用して執筆
文字
pgAdmin 4の脆弱性15件、共用のサーバーモードは9.19へ

この記事のまとめ

  • クリティカルの2件は、ログインの回数制限の回避と、データの書き出しからのコマンド実行。
  • 15件のうち12件は、CVEの説明が「サーバーモード」の問題と明記しています。
  • 9.19では、LDAPで同名の内部アカウントに入っていた人や、共用の鍵に頼る接続が止まります。
こんな方に#30代#40代#50代実務

社内のサーバーにpgAdminを1台立てて、何人かがブラウザから使っていませんか。その形なら、10月29日に出たpgAdmin 4 9.19の修正15件は、ほぼ自分ごとです。手元のPCで1人で使うデスクトップ版なら、急ぐ理由はずっと少なくなります。

ただ、共用の形では、9.19は上げればすぐ終わる更新ではありません。上げると止まる接続と、上げても残る設定があります。

クリティカルの2件は、ログイン画面とデータの書き出し

開発チームは9.19で、136件の不具合の修正と新機能に加え、15件の脆弱性(CVE-2026-116238〜CVE-2026-116252)を直しました。CVSS v4.0でクリティカルとされたのは2件です。

pgAdminのNews Archiveの画面。2026-10-29 - pgAdmin 4 v9.19 Released の見出しの下に、136件の不具合の修正と新機能、15件の脆弱性(CVE-2026-116238からCVE-2026-116252)の修正を含むとある。Featuresの欄には、サーバーモードのPassword Exec Commandsを管理者が決める許可リストSERVER_PASSEXEC_COMMANDSに置き換え、上げたあとの最初の起動の前に設定するよう書かれている。Security Fixesの欄の1つ目は、Import/Export DataのOSコマンドインジェクション(CVE-2026-116241)
pgAdminの開発チームによる9.19の告知。15件の脆弱性を修正出典: pgAdmin Development Team「pgAdmin 4 v9.19 Released」(引用)

1件目のCVE-2026-116238(9.2)は、ログインの失敗の回数制限を回避できる問題です。サーバーモードのpgAdminは、内部のアカウントを既定で3回の失敗でロックします。その制限をすり抜けられ、アカウントを持たない攻撃者でも、管理者を含む内部のアカウントのパスワードを何度でも試せました。既定の設定のままで当たります。

2件目のCVE-2026-116241(9.4)は、データのインポート・エクスポートの機能からのOSコマンドインジェクションです。クエリの結果を書き出す処理に細工をすると、pgAdminが動くホストで、pgAdminを動かすOSのアカウントとしてコマンドを実行できました。悪用にはpgAdminへのログインが要りますが、この機能の権限は管理者でない利用者にも既定で付いています。

2件が重なると、ログイン画面が外から見えるpgAdminでは、パスワードを当てた人がホストでコマンドを動かす道筋も考えられます。開発チームがそう説明しているわけではありませんが、ログイン画面をインターネットに出している会社は、今日のうちに上げる理由になるでしょう。

15件のうち12件は、サーバーモードの会社に影響する

pgAdminには2つの動かし方があります。サーバーモードは、Webアプリとして1台に置き、利用者がログインして使う形です。利用者ごとにファイルの置き場所が分かれ、サーバーのファイル全体には触れません。デスクトップモードは、手元のPCで1人が使う形です。

公式の文書によると、v2からはサーバーモードが既定で、デスクトップのアプリで動かすときだけ自動で切り替わります。公式のコンテナ(dpage/pgadmin4)も、起動時にログイン用のメールアドレスとパスワードを決める、ログイン画面のある形です。

CVE 中身 CVSS v4.0 デスクトップ版
CVE-2026-116241 書き出しの機能からOSコマンドを実行 9.4 限定の記載なし
CVE-2026-116238 ログインの回数制限を回避 9.2 当たらない(明記)
CVE-2026-116239 LDAPやKerberosで、同じ名前の別アカウントに入れる 8.9 当たらない(明記)
CVE-2026-116243 共有の置き場所のファイルを実行させられる 7.7 サーバーモードの問題
CVE-2026-116250 シンボリックリンクで置き場所の外を読み書き 7.3 サーバーモードの問題
CVE-2026-116249 接続のファイルの場所が置き場所の外に出る 7.2 サーバーモードの問題
CVE-2026-116240 ファイル管理で、確かめた場所と違う場所を操作 7.1 当たらない(明記)
CVE-2026-116242 SSHのトンネルが、pgAdminのアカウントの鍵を使う 7.1 修正でデスクトップは変わらない(明記)
CVE-2026-116244 pgAdminのアカウントのKerberosの資格情報を使う 7.1 サーバーモードの問題
CVE-2026-116245 接続サービスの定義を、だれでも使える 7.1 サーバーモードの問題
CVE-2026-116247 pgAdminのアカウントのパスワードファイルと証明書を使う 7.1 修正でデスクトップは変わらない(明記)
CVE-2026-116252 細工したデータベース名で、接続先を差し替える 7.1 限定の記載なし
CVE-2026-116246 パスワードがプロセスの環境変数に残る 7.0 サーバーモードの問題
CVE-2026-116248 管理者でない人が、接続先を全員に共有できる 6.0 サーバーモードの問題
CVE-2026-116251 パスワードを変えても、ほかのセッションが残る 2.3 限定の記載なし

右の列は、各CVEの説明での扱いです。12件は、説明に「サーバーモード」の問題とあるか、デスクトップモードは当たらない・変わらないと記載があります。では残る3件はどうか。書き出しの件とセッションの件の2つは、ログインと複数の利用者を前提にした中身なので、デスクトップ版で困る場面は少ないと編集部は読んでいます。

サーバーモードでも、条件しだいで急ぐ度合いは下がります。共有の置き場所のファイルを実行させる件(CVE-2026-116243)は、Linuxなど(POSIX)ではpgAdmin経由で置いたファイルに実行の権限が付かず、Windowsで動かすサーバーモードなどで成り立ちます。シンボリックリンクの件(CVE-2026-116250)は、pgAdminとは別のOSのユーザーが置き場所に書き込める共有のストレージと、タイミングの競合が前提です。LDAPやKerberosの件(CVE-2026-116239)は、どちらかの認証を設定している場合だけです。

デスクトップ版で気にしたいのは、CVE-2026-116252です。CREATEDBの権限があるロールなら、接続の文字列のような名前のデータベースを作れます。その中のマテリアライズドビューをpgAdminで更新すると、psqlが別の接続先へつながり、保存してあるパスワードが渡ってしまいました。他人がデータベースを作れる共用のPostgreSQLに、デスクトップ版でつないでいる人も対象です。

復元と書き出しの機能からのコマンド実行は、1年で少なくとも6件

CVE-2026-116241は、7月31日に公表されたCVE-2026-17566の修正が足りなかったものです。さかのぼると、同じ型が続きます。

公表 CVE 中身
2025年11月13日 CVE-2025-12762 サーバーモードで、PLAIN形式のダンプの復元からコマンドを実行(9.9まで)
2025年12月11日 CVE-2025-13780 同じ説明の別の脆弱性(9.10まで)
2026年2月5日 CVE-2026-1707 復元の最中に制限の鍵(\restrict)を盗み見て、コマンドを実行(9.11)
2026年5月11日 CVE-2026-7816 書き出しのクエリから\copyの外に抜けて、コマンドを実行(9.4〜9.14・9.15で括弧の検査を追加)
2026年7月31日 CVE-2026-17566 9.15で入った括弧の検査をすり抜けて、コマンドを実行
2026年10月30日 CVE-2026-116241 CVE-2026-17566の修正を、さらに回避

Windowsのバックアップと復元だけで起きたCVE-2025-12763(2025年11月13日)を含めると7件です。5月に入った括弧の検査は、7月と10月に続けて破られました。

どれも、ダンプの復元やデータの書き出しのように、pgAdminが外部のコマンドを動かす機能の周りで起きました。データベース名から接続先を差し替えるCVE-2026-116252も、バックアップや復元では以前に直っていて、マテリアライズドビューの更新が「残っていた呼び出し元」でした。

つまり、共用のpgAdminの置き方にもヒントがあります。入口を1つずつ閉じる修正が続いている以上、次も出ると考えて置き方を決めたほうが安全です。書き出しの機能の権限は、CVEの説明によると管理者でない利用者にも既定で付いています。「User Management」の画面の「Permissions」タブでは、ロールごとに権限を外せます。だから、書き出しを要る人だけに絞ると入口が減ります。共用のpgAdminは「ログインできる人が、ホストの上でコマンドを動かせるかもしれない箱」として、ほかのサーバーから切り分けます。今回の15件のうち4件は、pgAdminを動かすOSのアカウントが持つパスワードファイルやSSHの鍵、Kerberosの資格情報を、ほかの利用者が使えてしまう問題でした。そのアカウントの持ち物を減らすだけでも、次の脆弱性の被害は小さくなります。

9.19に上げると止まる接続、上げても残る共有

リリースノートには、上げる前と後に手を入れる所がいくつもあります。サーバーモードで使っている会社は、上げる前に次を読み合わせておくと、翌朝の「つながらない」を減らせます。

いちばん先に確かめたいのは、LDAPやKerberosでログインしている人です。これまで、同じ名前の内部のアカウント(最初に作った管理者を含む)として使えていた人は、9.19からそのアカウントに入れません。認証の方法ごとに自分のアカウントが要ります。管理者のアカウントをLDAPで使っていた会社は、上げたあと管理画面に入れなくなるおそれがあります。そこで、内部のアカウントのパスワードでログインできるかを先に確かめます。

  • 接続のパスワードを外部のコマンドで取る設定(Password Exec Command)は、自由な文字列では動かなくなります。管理者がSERVER_PASSEXEC_COMMANDSに許すコマンドを名前で登録し、利用者はその名前から選ぶ形です。上げたあとの最初の起動で、登録と完全に一致するコマンドは名前に置き換わり、それ以外は消えて元に戻せません。設定が空なら置き換えは延期され、起動のたびに警告が出ます。
  • 接続サービス(pg_service.confの定義)は、管理者がSERVER_MODE_ALLOWED_SERVICESに書いたものだけが使えます。既定は空なので、サービスを使う接続は書くまでつながりません。書いたサービスの資格情報は全員で使えるようになる点にも注意が要ります。
  • pgAdminを動かすアカウントの~/.pgpassや~/.postgresqlの証明書、~/.sshの鍵や設定、ssh-agentに頼っていた接続は、接続ごとにファイルやパスワードを設定し直すまで動きません。
  • パスワードファイルや証明書の場所が、利用者の置き場所の外(..やシンボリックリンクの先)にある接続も止まります。
  • 共有された接続先は、持ち主のパスワードファイルを引き継がなくなります。各自が自分の接続に設定するか、全員で使うファイルをSHARED_STORAGEの置き場所に置き、Name:/.pgpassの形で指します。
  • pg_dumpなどのコマンドの場所をSHARED_STORAGEの下に設定していた場合は、その設定が使えなくなります。
  • Kerberosの資格情報の使い回しを止めるには、pgAdminとそのツールが使うlibpqを16以降にします。15以前だと、Windowsの統合認証(SSPI)やgssproxyを通じた使い回しが止まりません。
  • 管理者でない人がすでに全員に共有した接続先は、上げても共有のまま残ります。起動時のログに1件ずつ警告が出るだけです。外すには、持ち主が共有を切るか、管理者が設定のデータベースでsharedの列を消します。
  • Python 3.10以降にwheelで入れている場合は、Flask-Security-Too 5.8.3以降が必要です。

最後の2つは見落としやすいと編集部はみます。とくに共有の件は、上げた時点で「直った」と考えると、管理者でない人が作った共有が残り続けます。

サーバーモードの会社が今日から確認すること

  1. 社内のpgAdminを洗い出します。サーバーに置いたもの、コンテナ(dpage/pgadmin4)で動かしているもの、開発者のPCのデスクトップ版を分けて書き出します。
  2. ログイン画面がインターネットから見えるものは、先に接続元を社内やVPNに絞り、今日のうちに9.19へ上げます。
  3. 上げる前に、config_local.pyでSERVER_PASSEXEC_COMMANDSとSERVER_MODE_ALLOWED_SERVICESを設定します。コンテナでは、PGADMIN_CONFIG_を頭に付けた環境変数で渡すか、/pgadmin4/config_local.pyを置きます。環境変数の値は最初の起動で設定のファイルに書かれるので、直したらdocker compose restartではなく、コンテナを作り直します。今の接続でサービスや外部のコマンドを使っているものも、先に一覧にしておきます。
  4. 上げたら、起動時のログの共有の警告を見て、管理者でない人が作った共有を外します。書き出しの権限も、要る人のロールだけに残します。パスワードの変更でほかのセッションが切れるようになったので、気になるアカウントはパスワードを変えておきます。
  5. pgAdminを動かすOSのアカウントから、要らないパスワードファイルやSSHの鍵を消します。
  6. デスクトップ版の人は、ふだんの更新の流れで9.19に上げます。それまでは、他人がデータベースを作れる共用のPostgreSQLで、マテリアライズドビューの更新を避けます。

同じPostgreSQLの周りでは、10月にPgBouncerの脆弱性とJDBCドライバー(pgjdbc)の脆弱性も公表されました。データベースの周りのツールは、本体と別に版を台帳で追っておくと、次の告知のときに迷いません。

出典・参考

人が監修しながらAIを活用して執筆しています。公開したあとも、人が内容を確かめています。

執筆・監修

佐々木 航株式会社Game

代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。

記事は、人が監修しながらAIを活用して執筆しています。何を書くかと中身は人が決めて確かめ、記事の中身の責任は編集部(執筆・監修者)が負います。くわしくはAI の使い方に書いています。まちがいに気づいたら訂正・ご指摘からお知らせください。直したら更新日を改め、記事の最後に何を直したかを書きます。

役に立ったら、いいねと共有をお願いします