2026.09.11

Percona

Percona Monitoring and Management (PMM) 3.9.1(リリース日:2026年8月19日)

リリース概要

PMM 3.9.1は、セキュリティを重視したリリースであり、権限を持つアカウントを使用して接続していたGrafana ClickHouseデータソースにおける重大度が高い脆弱性を修正します。この修正では、専用の読み取り専用ユーザーに置き換えられます。できるだけ早いアップグレードを強く推奨します。

今回のリリースでは、保存された認証情報を破損させる暗号化キーローテーションの不具合や、ネットワーク切断後にPMM Clientが切断されたままになる問題も修正されています。

セキュリティアップデート

重大度が高い脆弱性の修正:今すぐアップグレードしてください

GrafanaのClickHouse データソースにおいて、任意のSQL実行と内部データベースやクラウド認証情報の露出を引き起こす可能性のある、重大度が高い脆弱性が確認されました。

直ちに行うべき対応

お客様のシステムは、データベースへの不正アクセスや認証情報の窃取にさらされている可能性があります。インフラストラクチャを保護するため、直ちに以下の措置を講じてください:

  1. 直ちにPMM 3.9.1へアップグレードしてください(強く推奨されます)。
  2. 外部のClickHouseインスタンスを使用している場合は、まず読み取り専用ユーザーを作成してください。アップグレード前にPMM_CLICKHOUSE_DATASOURCE_USERおよびPMM_CLICKHOUSE_DATASOURCE_PASSWORDを設定してください。そうしないと、データソースは認証に失敗します。Restrict the ClickHouse data source to a read-only userを参照してください。
  3. PMMインスタンスが外部からアクセス可能な状態にある場合は、不正アクセスの有無を確認するためにアクセスログを監査し、接続されたサービスの認証情報をローテーションすることを検討してください。
脆弱性の詳細

この脆弱性は、Grafana ClickHouseデータソースが権限を持つアカウントを使用して接続することに起因しており、それにより以下が可能になります:

  • 最低権限であるViewerロールのユーザーを含む、ログイン中のあらゆるユーザーによる任意のSQL実行
  • Query Analyticsデータ以外の内部データベースへのアクセス
  • ClickHouseからのアウトバウンドHTTPリクエスト(クラウド環境へのデプロイ時にAWSインスタンスメタデータやクラウドの認証情報が外部に露出するリスクを伴うもの)
  • PMM管理者アカウントの乗っ取りの可能性
影響を受けるインストール

デプロイ方法(Docker、Podman、Helm、AMI)にかかわらず、バージョン3.9以前を実行しているすべてのPMMデプロイメントが影響を受けます。

リスク軽減の選択肢

推奨:PMM 3.9.1へのアップグレード
今回のリリースでは、ClickHouseデータソース用の権限付きアカウントが、専用の読み取り専用ユーザーに置き換えられます。

システムを安全に保つために:

  1. 外部のClickHouseインスタンスを使用する場合は、読み取り専用ユーザーを作成し、PMM_CLICKHOUSE_DATASOURCE_USERおよびPMM_CLICKHOUSE_DATASOURCE_PASSWORDを設定してください。
  2. PMM 3.9.1にアップグレードしてください。
  3. アップグレード後、Query Analyticsのダッシュボードが正しく読み込まれることを確認してください。

一時的:すぐにアップグレードできない場合
すぐにアップグレードできない場合は、軽減スクリプトを実行して悪用経路を塞いでください。このスクリプトは、Grafana用に最小権限のClickHouseユーザーを作成し、ClickHouseデータソースをそのユーザーに向けることで、デフォルトのスーパーユーザーを置き換えます。

スクリプトを実行する前に、pmm-dataボリュームをバックアップしてください。

  1. PMM Serverが稼働しているホスト上で、以下のスクリプトをpmm-ch-user.shとして保存してください。このスクリプトにはdocker、jq、およびopensslが必要です:
    #!/bin/bash
    # Create a least-privilege ClickHouse identity for Grafana and point the
    # ClickHouse datasource at it, replacing the default superuser.
    
    
    set -euo pipefail
    
    CONTAINER=${CONTAINER:-pmm-server}
    PMM_HOST=${PMM_HOST:-localhost}
    PMM_PORT=${PMM_PORT:-443}
    GRAFANA_URL="https://${PMM_HOST}:${PMM_PORT}"
    ADMIN_PASS=${ADMIN_PASS:-$(cat /root/pmm-admin-password)}
    # Drop-ins are loaded from users.d (users_config defaults to users.xml ->
    # users.d), NOT default-users.d.
    BOOTSTRAP_XML=/etc/clickhouse-server/users.d/zz-provision-bootstrap.xml
    
    CH_PASS=$(openssl rand -hex 24)
    CH_HASH=$(printf '%s' "$CH_PASS" | sha256sum | awk '{print $1}')
    BOOT_PASS=$(openssl rand -hex 24)
    BOOT_HASH=$(printf '%s' "$BOOT_PASS" | sha256sum | awk '{print $1}')
    
    ch_wait () {
      local user=$1 pass=$2 i
      for i in $(seq 1 45); do
        if docker exec -i "$CONTAINER" clickhouse-client --host 127.0.0.1 \
             --user "$user" --password "$pass" -q "SELECT 1" >/dev/null 2>&1; then
          return 0
        fi
        sleep 2
      done
      echo "ERROR: clickhouse did not accept $user within 90s" >&2
      return 1
    }
    
    # PMM's ClickHouse default superuser has access_management disabled, so it
    # cannot run CREATE USER / GRANT even with its known password. Install a
    # short-lived admin to run the DDL instead. Drop-ins must live in users.d;
    # and a plaintext  is rejected outright at startup because PMM
    # ships allow_plaintext_password=0.
    docker exec -u root "$CONTAINER" mkdir -p /etc/clickhouse-server/users.d
    docker exec -u root -i "$CONTAINER" bash -c "cat > $BOOTSTRAP_XML" <
        
            
                $BOOT_HASH
                127.0.0.1::1
                default
                default
                1
            
        
    
    XMLEOF
    docker exec -u root "$CONTAINER" chown pmm:root "$BOOTSTRAP_XML"
    docker exec -u root "$CONTAINER" supervisorctl restart clickhouse
    ch_wait provision_admin "$BOOT_PASS"
    
    # grafana_ro holds SELECT and nothing else. Without the SOURCES family it
    # cannot call url(), s3(), mongodb(), remote() or file(); readonly=1
    # additionally prevents it overriding server settings such as
    # max_http_get_redirects. ALTER runs unconditionally so that re-running
    # this script rotates the password rather than failing.
    docker exec -i "$CONTAINER" clickhouse-client --host 127.0.0.1 \
      --user provision_admin --password "$BOOT_PASS" --multiquery <&2
      exit 1
    fi
    
    # Transient files hold the CH password; keep them in a private dir and
    # always remove them, even if a curl below fails.
    umask 077
    TMPD=$(mktemp -d)
    trap 'rm -rf "$TMPD"' EXIT
    curl -sk -u "admin:$ADMIN_PASS" \
      "$GRAFANA_URL/graph/api/datasources/uid/$DS_UID" > "$TMPD/ds-ch.json"
    jq --arg p "$CH_PASS" \
      '.jsonData.username = "grafana_ro" | .secureJsonData.password = $p' \
      "$TMPD/ds-ch.json" > "$TMPD/ds-ch.new.json"
    curl -sk -u "admin:$ADMIN_PASS" -X PUT -H 'Content-Type: application/json' \
      -d @"$TMPD/ds-ch.new.json" \
      "$GRAFANA_URL/graph/api/datasources/uid/$DS_UID" >/dev/null
    
    # Fail the build rather than come up believing this worked.
    if docker exec -i "$CONTAINER" clickhouse-client --host 127.0.0.1 \
         --user grafana_ro --password "$CH_PASS" \
         -q "SELECT count() FROM url('http://169.254.169.254/latest/user-data','LineAsString','line String')" \
         >/dev/null 2>&1; then
      echo "FATAL: grafana_ro can still reach url()" >&2
      exit 1
    fi
    if docker exec -i "$CONTAINER" clickhouse-client --host 127.0.0.1 \
         --user grafana_ro --password "$CH_PASS" \
         -q "CREATE TABLE default.zz_provision_check (x String) ENGINE=Memory" \
         >/dev/null 2>&1; then
      echo "FATAL: grafana_ro can still run DDL" >&2
      exit 1
    fi
    
    unset CH_PASS BOOT_PASS ADMIN_PASS
    echo "ClickHouse datasource now authenticates as grafana_ro."
  2. XXXXXをPMMの管理者パスワードに置き換えて、スクリプトを実行してください。設定がデフォルトと異なる場合は、CONTAINER、PMM_HOST、およびPMM_PORTを調整してください:
    CONTAINER=pmm-server PMM_HOST=localhost PMM_PORT=443 ADMIN_PASS=XXXXX bash ./pmm-ch-user.sh
  3. スクリプトがClickHouse datasource now authenticates as grafana_roで終了することを確認してください。代わりにERRORまたはFATALメッセージが表示されて終了した場合は、軽減が適用されていません。この失敗を無視せず、報告された問題を解決し、スクリプトを再実行してください。再実行は安全に行うことができ、grafana_roのパスワードもローテーションされます。
  4. Query Analyticsのダッシュボードが引き続き読み込まれることを確認してください。

PMM Serverイメージからpercona-telemetry-agentを削除

PMM Serverイメージからpercona-telemetry-agentバイナリを削除しました。このバイナリはGo 1.26.5でビルドされており、Go標準ライブラリにおける重大度の高い脆弱性が8件含まれていましたが、削除によってそれらのCVEは完全に解消されました。

複数のコンポーネントのアップグレード

PMM 3.9.1では、既知の脆弱性に対処するため、いくつかの内部コンポーネントがアップグレードされています。

PMM独自のコンポーネントにおける脆弱性はゼロ

今回のリリースにおいて、PMMが所有するすべてのバイナリ(exporters、VictoriaMetrics、Nomad、pmm-managed、pmm-agent、pmm-admin、vmalert、vmproxy、qan-api2、pmm-dump)には、既知の脆弱性はゼロと報告されています。

残存するリスクは、アップストリームでの修正がまだ提供されていないサードパーティの依存関係に起因するものですが、一般的なPMMのデプロイ環境において悪用可能なものは存在しません。

残留セキュリティリスク

現代のソフトウェア開発において、複雑なシステムは一般的にサードパーティ製コンポーネントに依存しており、継続的な脆弱性管理を行っていても、リリース時に一定の残存リスクが残る場合があります。

特に、予定されているリリースの直前に、アップストリームの依存関係における脆弱性が公表された場合には、こうした状況が生じやすくなります。

PMMに含まれるサードパーティの依存関係において、以下のCVEが依然として存在しています。評価の結果、PMMのデプロイ環境への残存リスクは低いと判断されます。その理由は、悪用の可能性が限定的であること、既存のアーキテクチャ上の境界が存在すること、および利用可能な軽減策が講じられていることです。

今後もアップストリームでの公開を監視し、PMMへの影響を再評価し、将来のリリースにて是正措置を講じてまいります。

GrafanaバイナリにおけるGo標準ライブラリの脆弱性

CVE-2026-33818、CVE-2026-39821、CVE-2026-46600、CVE-2026-56853、CVE-2026-56858、CVE-2026-56859、CVE-2026-56860、およびCVE-2026-56862として追跡されています。

影響を受けるコンポーネント
Grafanaのバイナリ(grafana、grafana-cli、grafana-server)。PMMはGo 1.26.5でビルドされていますが、これらのCVEに対する修正にはGo 1.26.6以降が必要です。これらのCVEは、Go 1.26.6のセキュリティリリースの一環として2026年8月13日に公開されました。

PMM固有のコンテキスト
これらは、encoding/asn1、encoding/xml、html/template、net/http、net/url、crypto/tls、および golang.org/x/net に影響を及ぼすGo標準ライブラリの問題です。いずれもサービス拒否攻撃であるか、あるいは事前認証済みのアクセスを必要とします。いずれも、リモートコード実行やデータへのアクセスを可能にするものではありません。

  • CVE-2026-33818 (encoding/asn1 DoS): PMMは、信頼できないASN.1入力を解析しません。
    CVE-2026-39821 (Punycodeによる権限昇格): PMMは国際化ドメイン名のルックアップを実行しません。
  • CVE-2026-46600 (DNS解析DoS): 内部DNSのみが使用されます。
  • CVE-2026-56853 (暗号化されていないHTTP/2 DoS): Grafanaはnginxの背後で動作しており、Grafanaポートへの直接アクセスは不要です。
  • CVE-2026-56858 (html/template XSS): 認証済みアクセスおよびテンプレートインジェクションが必要ですが、そのいずれもPMMの通常の使用方法では不可能です。
  • CVE-2026-56859 (XMLデコードによるDoS): PMMは信頼できないXMLを解析しません。
  • CVE-2026-56860 (URLパス解決DoS): Grafanaのエンドポイントに到達するために、細工されたURLが必要です。
  • CVE-2026-56862 (TLS KeyUpdate DoS): Grafanaはnginx TLS terminationの背後に配置されています。
  • リスク軽減要因
    Grafanaのどのエンドポイントにもアクセスできるようになる前に、PMM認証が必要です。
  • Grafanaはnginxの背後に配置されており、nginxがTLSの終端とHTTPのプロキシ処理を行います。
  • これらのCVEはいずれも、データへのアクセスやリモートコード実行を可能にするものではありません。

修正計画
これらは、Go 1.26.6以降でGrafanaを再ビルドすることにより、将来のリリースで対処される予定です。

kin-openapi 認証バイパス (GHSA-r277-6w6q-xmqw)

影響を受けるコンポーネント
Grafanaバイナリ(サードパーティの依存関係、github.com/getkin/kin-openapi v0.133.0、v0.144.0で修正済み)。

PMM固有のコンテキスト
この脆弱性により、OpenAPI仕様の読み込み時にValidationHandler.Load()がフェイルオープンし、デフォルトでNoopAuthenticationFuncが使用されるため、認証が回避される可能性があります。

PMMにおいて、GrafanaのOpenAPIバリデーションは単独のエンドポイントとして公開されておらず、事前にPMM認証を行わなければ、脆弱性のあるコードパスには到達できません。

  • リスク軽減要因
    Grafanaにアクセスするためには、PMMの認証が必要です。
  • 脆弱性のあるValidationHandler.Load()パスは、PMMのGrafana設定によって呼び出されません。

修正計画
アップストリームから修正が提供され次第、将来の依存関係の更新で対応します。

サービス拒否および情報漏えい (CVE-2026-21728 および CVE-2026-28377)

影響を受けるコンポーネント
Grafanaバイナリ。Tempoは、オプションのデータソースプラグインとしてGrafanaに組み込まれています。

PMM固有のコンテキスト
Tempoは分散トレーシングのバックエンドです。PMMはTempoを使用せず、Tempoデータソースの設定も行わず、トレーシングデータも受け付けません。

PMMのデプロイ環境において、大規模なクエリによるサービス拒否や、ステータスエンドポイント経由でのS3暗号化キーの漏洩が引き起こされることはありません。

リスク軽減要因

  • PMMはTempoデータソースの設定や有効化を行いません。
  • Tempoを介してトレーシングデータを送受信するPMMコンポーネントはありません。
  • 脆弱性のあるエンドポイントは、PMMのGrafana設定において公開されません。

修正計画
アップストリームから修正が提供され次第、将来の依存関係の更新で対応します。

Prometheusライブラリの情報漏洩(CVE-2026-42151)

影響を受けるコンポーネント
PromQLの評価のためにGrafanaに組み込まれているPrometheusライブラリ。

PMM固有のコンテキスト
PMMはメトリクスバックエンドとしてPrometheusではなくVictoriaMetricsを使用しています。このCVEは、Prometheusの構成APIを介してAzure OAuthのクライアントシークレットが漏洩するというものです。PMMではPrometheusにAzure OAuthを使用しておらず、その構成APIも外部に公開されていません。

リスク軽減要因

  • Grafanaへのアクセスおよびクエリの実行には、PMM認証が必要です。
  • PMMは、Azure OAuthやPrometheusリモートリードを使用しません。

修正計画
アップストリームから修正が提供され次第、将来の依存関係の更新で対応します。

golang.org/x/textのサービス拒否 (CVE-2026-56852)

影響を受けるコンポーネント
Grafanaバイナリ (golang.org/x/text v0.37.0、v0.39.0で修正済み)。

PMM固有のコンテキスト
これは、テキスト処理における不正なUTF-8入力によるサービス拒否です。PMMは、信頼できないテキストデータをこのコードパス経由で処理することはありません。

リスク軽減要因

  • Grafanaへのアクセスには、PMM認証が必要です。
  • 影響はサービス拒否に限られ、データへのアクセスやコードの実行には及びません。

修正計画
アップストリームから修正が提供され次第、将来の依存関係の更新で対応します。

gRPC-Go xDS RBACおよびHTTP/2の脆弱性 (GHSA-hrxh-6v49-42gf)

影響を受けるコンポーネント
GrafanaおよびGrafana ClickHouseデータソースプラグイン(google.golang.org/grpc < 1.82.1を使用するサードパーティの依存関係)。 PMM固有のコンテキスト
PMMはいずれのコンポーネントにおいてもxDSサービスディスカバリやRBACポリシーを使用していないため、これら2つのxDSの問題が発生することはありません。HTTP/2 DoSにはgRPCサーバーポートへの直接アクセスが必要です。PMMの場合、影響を受けるすべてのコンポーネントはPMM Serverコンテナ内で内部的に通信を行っており、外部ネットワークに直接公開されていません。

リスク軽減要因

  • PMMは、どのコンポーネントにおいてもxDSポリシーやxDSベースのRBACポリシーを設定することはありません。
  • 影響を受けるすべてのコンポーネントは、PMM Serverコンテナ内の内部インターフェースにバインドされています。

修正計画
アップストリームから修正が提供され次第、将来の依存関係の更新で対応します。

ClickHouseデータソースプラグインにおけるGo標準ライブラリの脆弱性

CVE-2026-33818、CVE-2026-39821、CVE-2026-39822、CVE-2026-46600、CVE-2026-56853、CVE-2026-56858、CVE-2026-56859、CVE-2026-56860、およびCVE-2026-56862として追跡されています。

影響を受けるコンポーネント
Grafana ClickHouseデータソースプラグイン(サードパーティ、Perconaによる保守対象外)。Go 1.26.4でビルドされていますが、修正にはGo 1.26.6以降が必要です。

PMM固有のコンテキスト
このプラグインは、localhost経由でPMM内部のClickHouseインスタンスにのみ接続します。外部からの入力やユーザーが制御する入力は、事前のPMM認証無しでClickHouseデータソースのクエリパスに到達することはありません。

リスク軽減要因

  • このプラグインは、PMM Serverコンテナ内のClickHouseにのみ接続します。
  • PMM ServerはLinux上で動作します。Windows固有のCVEは適用されません。
  • 信頼できない外部入力は、事前のPMM認証無しでClickHouseデータソースのクエリパスに到達することはありません。

修正計画
この修正には、Go 1.26.6以降を使用したプラグインのアップストリームの再ビルドが必要です。利用可能になり次第、対応が行われます。

今すぐリスクを軽減する方法

アップストリームでの修正が待たれる間、以下を講じることでリスクを低減できます:

  • PMMサーバーへのネットワークアクセスを、信頼できるネットワークおよびユーザーに限定する
  • PMM管理者の数を少数に抑え、強力な認証を強制する
  • 可能な限り、PMM Serverコンテナにリソース制限を適用する

改善点

  • PMM-15309: GrafanaのClickHouseデータソースは、権限付きアカウントではなく、専用の読み取り専用ユーザーとして接続するようになりました。

修正された問題

  • PMM-15188: 監視対象サービスの保存済みTLS証明書や鍵、およびAWSやAzureの認証情報を破損させていた、pmm-encryption-rotationのバグを修正しました。各ローテーションでは、これらの値を最初に復号するのではなく再暗号化し、暗号化の層が幾重にも重ねられた結果、最終的には読み取り不可能な状態となりました。
    アップグレード前のローテーションが一度でも行われると、対象の認証情報は復元できなくなります。アップグレード前に暗号化キーをローテーションした場合は、対象のサービスを削除してから再度追加し、認証情報を再作成してください。Corrupted credentials after encryption key rotationを参照してください。
  • PMM-15198: シャーディングされたクラスター内のMongoDBルーター(mongos)ノードを監視する時、エクスポーターはたった1つのシャードからのインデックス統計を保持して残りを破棄し、さらにmongodb_indexstats_accesses_opsメトリックの重複エラーでシステムログを埋め尽くしてしまいました。また、コレクション統計が誤ったシャードに割り当てられることもありました。インデックスおよびコレクションの統計情報に、そのデータの由来となるシャードが明記されるようになりました。これにより、重複メトリックエラーなしに、すべてのシャードから完全かつ正確に紐付けられたデータを取得できます。シャーディングされていないデプロイメントには影響ありません。
  • PMM-15310: ネットワークの中断後、PMM ClientがDisconnected状態のまま停止し、メトリクスやQuery Analyticsのデータが送信されなくなる問題を修正しました。現在、接続は約1分以内に自動的に復旧します。

Percona Monitoring and Management (PMM) 3.9.1 リリース情報(Percona社ウェブサイト):
https://docs.percona.com/percona-monitoring-and-management/3/release-notes/3.9.1.html


Perconaサポート・コンサルティング

Percona
Perconaサポート・コンサルティングサービスはPercona Serverをご利用頂いているお客様が安心してお使い頂くために専門的なサポートを提供するサービスです。