abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · prometheus-bearer-redirect
クラス: 認証情報漏洩 到達範囲: リモート
Prometheus v3.15.0 (5241a27) - CNCF / Prometheus
prometheus/common v0.71.0 は、クロスホストリダイレクト時に scrape / HTTPClientConfig の認証情報をすでに除去しています (isCrossHostRedirect、#901)。NewWriteClient はまずそのクライアントを構築し、その後、除去の外側で azuread.NewAzureADRoundTripper または googleiam.NewRoundTripper をラップします。follow_redirects は依然としてデフォルトで true です。
設定された remote_write URL が別のホストへ 301/302/307 リダイレクトする場合、Prometheus は Authorization: Bearer と Azure AD または GCP の monitoring.write トークンをそのホストへ送信します。 Go はすでにコピーされたヘッダーを破棄しています。これらの RoundTripper がそれを再設定します。
CVE-2026-42151 (/-/config での client_secret ダンプ) ではありません。デフォルトの prometheus.yml には remote_write がありません。これは azuread: または google_iam: によって制御されます。
| ID | CVE 未割当 |
| クラス | 認証情報漏洩 (クロスホスト 3xx 時の remote_write Bearer) |
| 到達範囲 | リモート (Prometheus から 3xx ターゲットへのアウトバウンド) |
| CWE | CWE-201 |
| CVSS | High: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| 製品 | Prometheus |
| 影響を受けるバージョン | v3.15.0 (5241a27fe3c6983549fccc32f6e65917408c63cd)、イメージ prom/prometheus:v3.15.0 |
| 認証 | 設定で制御される remote_write と azuread: または google_iam: |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
オペレーターが azuread: または google_iam: を伴う remote_write を設定しています。RW URL、またはそれが 3xx リダイレクトするホップが、攻撃者が制御するホストです。
| 権限 | メソッド / シンク | ラボ実証済みまたは推測 |
|---|---|---|
クロスホスト 3xx で実際の GCP monitoring.write Bearer を読み取る | google_iam remote_write POST、別ホストへの 307 | ラボ実証済み。オラクルの POST /write が Authorization: Bearer lab-gcp-PROMETHEUS-BEARER-REDIRECT-WITNESS を受信 |
azuread でも同様の漏洩 | azureADRoundTripper.RoundTrip は常に Header.Set("Authorization", "Bearer "+token) を実行し、isCrossHostRedirect がない | ピン留めしたソースから推測。NewWriteClient 内の同じラップ箇所。ラボは google_iam を使用したため Azure は呼び出していない |
| そのトークンをその ID として Azure Monitor / GCP Monitoring に対してリプレイする | これらの認証ブロックが設定されている場合、トークンは実際のクラウド認証情報 | 推測。ラボはスタブトークンを発行しただけで、Azure や GCP は呼び出していない |
| 同じピン留めでの scrape / oauth2 / basic / bearer | common v0.71.0 の HTTPClientConfig RoundTripper | ラボでクローズを実証済み。oauth2 scrape GET は同じオラクルへ 302 を追跡し、Authorization はなかった |
| デフォルト OSS | remote_write は空 | クローズ |
remote_write.headers で Authorization を設定 | 拒否 | クローズ |
/-/config が client_secret をダンプ | CVE-2026-42151。このピン留めではフィールドは Secret 型 | クローズ |
| Prometheus 管理 / ライフサイクル | フラグはデフォルトでオフ | クローズ |
| RCE / シェル | この残存物ではない | クローズ |
3.11/3.12 のシークレット秘匿化と snappy キャップの波の後、prometheus/prometheus タグ v3.15.0 をピン留めしました。19 回の調査。デフォルト OSS: admin API、ライフサイクル HTTP、remote-write レシーバー、OTLP レシーバーはオフ。common #901 は v0.71.0 に含まれています。残存物は、そのクライアントの外側に位置する 2 つの remote_write ラッパーです。
func (rt *azureADRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
accessToken, err := rt.tokenProvider.getAccessToken(req.Context())
// ...
req.Header.Set("Authorization", bearerAccessToken)
return rt.next.RoundTrip(req)
}
googleiam.NewRoundTripper は google.golang.org/api/transport/http -> oauth2.Transport であり、これはすべてのホップで SetAuthHeader を実行します。
すでに記録済みの誤った方向: CVE-2026-42151 の再申請、scrape oauth2 を依然として漏洩しているとみなすこと (そうではない)、これをデフォルトインストールの High と呼ぶこと (そうではない - remote_write は有効にするまで空)。茶番: リバースシェル。オラクルはリダイレクトされた POST 上の Bearer です。
python3 prometheus-bearer-redirect-Abraxas-Labs.py
または
cd lab
./run.sh
ループバックのみ: Prometheus http://127.0.0.1:19380、オラクル http://127.0.0.1:19381。イメージ prom/prometheus:v3.15.0。run.sh は token_uri: http://hop:8080/token を持つラボ用 gcp-sa.json を書き出すため、google_iam が Google と通信することはありません。
SUCCESS prometheus-bearer-redirect how=live rw-method=POST rw-bearer=yes token-has-witness=yes scrape-method=GET scrape-bearer=no PROMETHEUS-BEARER-REDIRECT-WITNESS
common #901 と同様に、isCrossHostRedirect(req) の場合に Azure AD / Google IAM Bearer の付与をスキップしてください。Go がクロスホスト 3xx で破棄した後に Authorization を再設定しないでください。
5241a27fe3c6983549fccc32f6e65917408c63cd)storage/remote/client.go · storage/remote/azuread/azuread.go · storage/remote/googleiam/googleiam.goGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。