
प्रोमेथियस v3.15.0 - उच्च - रिमोट - क्रेडेंशियल लीक - remote_write google_iam/azuread क्रॉस-होस्ट 3xx पर Bearer अग्रेषित करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · prometheus-bearer-redirect
राइट-अप: https://abraxaslabs.tech/research/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 पहले ही कॉपी किए गए हेडर को हटा चुका था। ये RoundTrippers इसे फिर से सेट कर देते हैं।
यह 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 | उच्च: 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 | लैब-प्रमाणित। Oracle POST /write को Authorization: Bearer lab-gcp-PROMETHEUS-BEARER-REDIRECT-WITNESS मिला |
azuread के लिए वही लीक | azureADRoundTripper.RoundTrip हमेशा Header.Set("Authorization", "Bearer "+token) करता है, बिना isCrossHostRedirect के | पिन स्रोत से अनुमानित। NewWriteClient में वही रैप साइट। लैब ने google_iam का उपयोग किया इसलिए Azure को कॉल नहीं किया |
| उस टोकन को उस पहचान के रूप में Azure Monitor / GCP Monitoring के विरुद्ध रीप्ले करना | जब वे auth ब्लॉक कॉन्फ़िगर होते हैं तो टोकन एक वास्तविक क्लाउड क्रेडेंशियल होता है | अनुमानित। लैब ने स्टब टोकन बनाया; इसने Azure या GCP को कॉल नहीं किया |
| उसी पिन पर scrape / oauth2 / basic / bearer | common v0.71.0 से HTTPClientConfig RoundTrippers | लैब-प्रमाणित बंद। oauth2 scrape GET ने उसी oracle पर 302 का पालन किया, बिना Authorization के |
| डिफ़ॉल्ट OSS | remote_write खाली | बंद |
remote_write.headers द्वारा Authorization सेट करना | अस्वीकृत | बंद |
/-/config द्वारा client_secret डंप करना | CVE-2026-42151; इस पिन पर फ़ील्ड Secret टाइप्ड है | बंद |
| Prometheus admin / lifecycle | फ़्लैग डिफ़ॉल्ट रूप से बंद | बंद |
| RCE / शेल | यह अवशेष नहीं | बंद |
मैंने 3.11/3.12 सीक्रेट-रेडैक्शन और snappy-cap लहर के बाद prometheus/prometheus टैग v3.15.0 को पिन किया। उन्नीस खोजें। डिफ़ॉल्ट OSS: admin API, lifecycle HTTP, remote-write receiver, और OTLP receiver बंद। Common #901 v0.71.0 में है। अवशेष वे दो 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, oracle http://127.0.0.1:19381. इमेज prom/prometheus:v3.15.0. run.sh एक लैब gcp-sa.json लिखता है जिसमें token_uri: http://hop:8080/token होता है ताकि 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
isCrossHostRedirect(req) होने पर Azure AD / Google IAM Bearer संलग्न करना छोड़ दें, जैसे common #901 में। Go द्वारा क्रॉस-होस्ट 3xx पर इसे हटाने के बाद Authorization को दोबारा सेट न करें।
5241a27fe3c6983549fccc32f6e65917408c63cd)storage/remote/client.go · storage/remote/azuread/azuread.go · storage/remote/googleiam/googleiam.goGNU Affero GPL v3.0. देखें LICENSE. केवल लूपबैक लैब। कोई वारंटी नहीं।