
Prometheus v3.15.0 — High — Remote — Утечка учётных данных — remote_write google_iam/azuread передаёт Bearer при кросс-хостовых 3xx
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.
Если настроенный URL remote_write отвечает 301/302/307 на другой хост, Prometheus отправляет Authorization: Bearer вместе с токеном Azure AD или GCP monitoring.write на этот хост. Go уже удалил скопированный заголовок. Эти RoundTripper устанавливают его снова.
Не CVE-2026-42151 (дамп client_secret на /-/config). В стандартном prometheus.yml нет remote_write. Это зависит от azuread: или google_iam:.
| ID | CVE пока нет |
| Класс | Утечка учётных данных (remote_write Bearer при кросс-хостовом 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, контролируется атакующим.
| Привилегия | Метод / приёмник | Доказано в лаборатории или выведено |
|---|---|---|
Прочитать действующий GCP monitoring.write Bearer при кросс-хостовом 3xx | 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 не вызывался |
| Воспроизвести этот токен против Azure Monitor / GCP Monitoring от имени этой учётной записи | Токен является реальными облачными учётными данными, когда эти блоки аутентификации настроены | Выведено. В лаборатории был сгенерирован фиктивный токен; Azure или GCP не вызывались |
| Scrape / oauth2 / basic / bearer на той же версии | HTTPClientConfig RoundTripper из common v0.71.0 | Доказано в лаборатории как закрыто. oauth2 scrape GET проследовал за 302 к тому же оракулу без 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 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 пуст, пока вы его не включите). Театральность: reverse shell. Оракул — это Bearer в перенаправленном POST.
python3 prometheus-bearer-redirect-Abraxas-Labs.py
или
cd lab
./run.sh
Только loopback: Prometheus http://127.0.0.1:19380, оракул 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
Пропускать прикрепление Bearer Azure AD / Google IAM, когда 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-лаборатория. Без гарантий.