JVNDB-2026-022113
|
pgAdmin ProjectのpgAdmin 4における複数の脆弱性
|
ユーザーが入力する説明フィールドを用いて COMMENT ON ... IS '' をレンダリングするすべてのダイアログテンプレートにおいて、pgAdmin 4 に SQL インジェクションが存在した。ドメイン(およびその制約)、外部テーブル、言語、イベントトリガ、およびビューの OID 参照クエリの Jinja テンプレートでは、qtLiteral エスケープフィルタを通さずに、単一引用符で囲まれた SQL リテラル内に説明を直接挿入していた('{{ data.description }}')。影響を受けるオブジェクト種別の作成または変更権限を持つ認証済みの pgAdmin 利用者は、アポストロフィを含む説明を送信することでリテラルを閉じ、任意の SQL を連鎖させることができた。注入された SQL は、そのユーザがすでに認証されている PostgreSQL ロールの権限で実行される。COPY ... TO/FROM PROGRAM を許可された接続ロール(通常は PostgreSQL スーパーユーザ)の場合、これが連鎖して PostgreSQL ホスト上での OS コマンド実行に至る。なお、この欠陥は権限境界を越えるものではないユーザは pgAdmin の Query Tool を通じて当該ロールに対する直接の SQL アクセスをすでに持っているため攻撃者は自らのデータベースロールが既に持つ権限を超える能力を得ることはない。周辺的な影響として、運用者が構成したアプリケーション層の Query Tool によるゲーティングを迂回できる点が含まれる。この欠陥は当初、ドメインダイアログの description フィールドに対して報告されたが、コード全体の監査により、前述のテンプレート群に同一パターンが計 16 か所存在することが判明した。同じレビューで、pgstattuple/pgstatindex の統計テンプレートにも関連する 10 箇所のシンクが見つかった。すなわち pgstattuple('{{schema}}.{{table}}') および対応する pgstatindex の形式で、qtIdent は識別子内の二重引用符はエスケープするがアポストロフィはしないため、スキーマに CREATE 権限を持つユーザが foo'bar という名前のテーブルまたはインデックスを作成すると、その後の統計ビューアで不均衡なリテラルが生成されうる。修正は多層的である: 1. サイト: すべての '{{ x.description }}' を {{ x.description|qtLiteral(conn) }} に置き換える(外側の引用符は不要。フィルタが値をエスケープ済みの引用符で自動的に包む)。これらのテンプレートを読み込むあらゆる render_template 呼び出しに conn=self.conn を配管する。さらに、外部テーブルのスキーマ差分における Jinja の { % elif タイポ(デッドブランチ)を修正。pgstattuple/pgstatindex の 10 箇所の統計サイトについては、OID と ::oid::regclass キャスト(例: pgstattuple({{ tid }}::oid::regclass))を介してリレーションを参照するよう書き直し、埋め込みのリテラル呼び出し形式を完全に排除して、このバグクラスが再発しないようにした。 2. ドライバの堅牢化: qtLiteral(utils/driver/psycopg3/__init__.py)は、これまでは conn 引数が偽値の場合に未エスケープの生値を黙って返していた。今後は ValueError を送出するようにしたこれにより、当該バグクラスを以後は顕在化させる。変更により、潜在していた配管バグが 8 件(schemas/__init__.py、schemas/functions/__init__.py、schemas/tables/utils.py、foreign_servers/__init__.py、および roles/__init__.py の 7 箇所)直ちに露見し、本パッチの一部としてすべて修正された。アダプタレベルの失敗を握りつぶして生値を返していた内側の except ブロックも削除され、アダプト不可能な入力は未エスケープ値の漏えいではなく例外を送出するようになった。 3. 回帰テスト: 各テンプレートごとの振る舞いテストにより、以前に脆弱であった各テンプレートをアポストロフィ注入ペイロードでレンダリングし、エスケープ済みの断片が存在し脆弱な断片が存在しないことをアサートする。さらに、すべての *.sql テンプレートを走査して、明示的な許可リストに照らし '{{ ... }}' の単一引用符で囲まれた補間を検出するリンタテストを追加。新しい qtLiteral のフェイルファストおよび内側 except による例外送出経路をカバーする単体テストも実施した。この問題は pgAdmin 4 の 1.0 から 9.16 未満に影響する。
|
CVSS v3 による深刻度 基本値: 8.8 (重要) [その他]
- 攻撃元区分: ネットワーク
- 攻撃条件の複雑さ: 低
- 攻撃に必要な特権レベル: 低
- 利用者の関与: 不要
- 影響の想定範囲: 変更なし
- 機密性への影響(C): 高
- 完全性への影響(I): 高
- 可用性への影響(A): 高
|
|
pgAdmin Project
|
本脆弱性の影響を受ける製品の詳細については、ベンダ情報および参考情報をご確認ください。
|
・当該ソフトウェアが扱う全ての情報が外部に漏れる可能性があります。
・当該ソフトウェアが扱う全ての情報が書き換えられる可能性があります。
・当該ソフトウェアが完全に停止する可能性があります。
|
ベンダ情報を参照して適切な対策を実施してください。
|
GitHub
|
- 不適切なエンコード、または出力のエスケープ(CWE-116) [その他]
- SQLインジェクション(CWE-89) [その他]
|
- CVE-2026-12044
|
- National Vulnerability Database (NVD) : CVE-2026-12044
- 関連文書 : fix(sqli): HTML-escape description fields and harden qtLiteral pgadmin-org/pgadmin4@658bb58 GitHub
- 関連文書 : fix(sqli): close remaining apostrophe-in-identifier sinks and tighten… pgadmin-org/pgadmin4@2ae0d36 GitHub
|
|