
بروميثيوس v3.15.0 - عالي - عن بُعد - تسريب بيانات الاعتماد - remote_write google_iam/azuread يمرر Bearer عبر مضيفين مختلفين عند 3xx
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.
إذا أعاد عنوان URL المُهيَّأ لـ remote_write توجيه 301/302/307 إلى مضيف آخر، فإن Prometheus يرسل Authorization: Bearer بالإضافة إلى رمز monitoring.write الخاص بـ Azure AD أو GCP إلى ذلك المضيف. لقد أسقط Go بالفعل الترويسة المنسوخة. لكن هذه الـ RoundTrippers تعيد تعيينها مرة أخرى.
ليست CVE-2026-42151 (تفريغ client_secret على /-/config). ملف prometheus.yml الافتراضي لا يحتوي على remote_write. هذا مشروط بوجود azuread: أو google_iam:.
| المعرّف | لا يوجد CVE بعد |
| الفئة | تسريب بيانات اعتماد (Bearer الخاص بـ remote_write عند 3xx بين المضيفين) |
| النطاق | عن بُعد (صادر من 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 فقط |
لدى المشغّل remote_write مع azuread: أو google_iam:. عنوان URL الخاص بـ RW، أو أي قفزة يعيد توجيهها 3xx، هو مضيف يتحكم به المهاجم.
| الصلاحية | الطريقة / الهدف | مُثبت مختبريًا أو مُستنتج |
|---|---|---|
قراءة Bearer الحيّ الخاص بـ GCP monitoring.write عند 3xx بين المضيفين | POST الخاص بـ google_iam remote_write، 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 بصفته تلك الهوية | الرمز بيانات اعتماد سحابية حقيقية عند تهيئة كتل المصادقة تلك | مُستنتج. أنشأ المختبر رمزًا وهميًا؛ لم يستدعِ Azure أو GCP |
| scrape / oauth2 / basic / bearer على التثبيت نفسه | RoundTrippers الخاصة بـ HTTPClientConfig من common v0.71.0 | مُثبت مختبريًا مغلق. اتبع GET الخاص بـ oauth2 scrape إعادة توجيه 302 إلى الـ oracle نفسه دون Authorization |
| OSS الافتراضي | remote_write فارغ | مغلق |
ضبط remote_write.headers لـ Authorization | مرفوض | مغلق |
تفريغ /-/config لـ client_secret | CVE-2026-42151؛ الحقل مُعرَّف من النوع Secret على هذا التثبيت | مغلق |
| مسؤول Prometheus / دورة الحياة | الأعلام معطّلة افتراضيًا | مغلق |
| RCE / صدفة | ليس هذه البقايا | مغلق |
ثبّتت وسم prometheus/prometheus v3.15.0 بعد موجة تنقيح الأسرار في 3.11/3.12 وموجة حد snappy. تسع عشرة عملية بحث. OSS الافتراضي: واجهة admin API، وlifecycle HTTP، ومستقبل remote-write، ومستقبل OTLP معطّلة. 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، والذي يقوم بـ SetAuthHeaders في كل قفزة.
المنعطفات الخاطئة المسجلة بالفعل: إعادة تقديم CVE-2026-42151؛ التعامل مع scrape oauth2 على أنه لا يزال يسرب (وهو ليس كذلك)؛ وصف هذا بأنه High في التثبيت الافتراضي (وهو ليس كذلك - remote_write فارغ حتى تقوم بتفعيله). مسرحيات: reverse shell. الحكم الحاسم هو Bearer على POST المُعاد توجيهه.
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
تخطَّ إرفاق Azure AD / Google IAM Bearer عند تحقق isCrossHostRedirect(req)، على غرار common #901. لا تُعِد تعيين Authorization بعد أن أسقطه Go عند إعادة توجيه 3xx عبر مضيفين مختلفين.
5241a27fe3c6983549fccc32f6e65917408c63cd)storage/remote/client.go · storage/remote/azuread/azuread.go · storage/remote/googleiam/googleiam.goGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.