People-first проверка Centrifugo JWKS по ghsa-g6vg-wj8f-48cj: применимость, безопасный fixture для границы «изоляция dynamic JWKS cache по trust domain, endpoint и kid», измеримый контракт и stop-rule без production-данных.
Определите применимость Centrifugo JWKS
Создайте карточку применимости для Centrifugo JWKS: installed version, package source, build digest, feature/config reachability и роль вызывающего субъекта. Reviewed Advisory описывает «Centrifugo's dynamic JWKS key cache keyed only by `kid` allows cross-issuer JWT authentication bypass», опубликована 2026-07-01, обновлена 2026-07-01 и задаёт диапазон «github.com/centrifugal/centrifugo/v6 <= 6.8.0; first patched 6.8.1 | github.com/centrifugal/centrifugo/v5 <= 5.4.9; patched version not listed | github.com/centrifugal/centrifugo/v4 <= 4.1.5; patched version not listed | github.com/centrifugal/centrifugo/v3 <= 3.2.3; patched version not listed | github.com/centrifugal/centrifugo <= 2.4.0; patched version not listed». Эти данные не доказывают состояние конкретного развёртывания. Проверьте vendor backport и commit provenance; при неизвестной сборке оставьте applicability=unknown. Фактическая граница статьи — «изоляция dynamic JWKS cache по trust domain, endpoint и kid», а не общее обсуждение severity или продукта.
Опишите доверительную границу
Сформулируйте отдельную пользовательскую боль: одинаковый kid у двух разрешённых issuer приводит к повторному использованию ключа из чужого tenant. Запишите доверенный субъект, объект, управляющую policy и первый потенциальный побочный эффект. Заранее задайте защитный контракт: ключ выбирается только из JWKS своего issuer; порядок прогрева не меняет verify result. Его нельзя подменять отсутствием исключения или HTTP 200: важна стадия до чтения, передачи, allocation, mutation или delivery. Рабочий артефакт — issuer / jwks-endpoint / kid / cache-key / fetched-from / verify-result. В нём нужны только классы и счётчики; значения credentials, содержимое файлов, IP, account identifiers и персональные данные исключаются.
Соберите обратимый стенд
Постройте минимальный обратимый стенд: два локальных issuer fixtures с одинаковым kid, разными test keys и fake fetch counters. Затем прогреть cache issuer A, затем проверить token metadata issuer B и повторить в обратном порядке. Сеть должна быть отключена или замкнута на loopback, filesystem — на disposable temp, state — на in-memory либо transaction rollback. Добавьте штатный контроль и отрицательный boundary-case, дайте каждому bounded timeout и одинаковую конфигурацию. До опыта внесите в карточку digest входа; после опыта зафиксируйте result class, side-effect counters и cleanup proof. Не увеличивайте нагрузку и не пытайтесь воспроизвести вредный эффект на чужой системе.
Измерьте контракт до побочного эффекта
Сведите observed в матрицу «issuer / jwks-endpoint / kid / cache-key / fetched-from / verify-result» и сравните с критерием «ключ выбирается только из JWKS своего issuer; порядок прогрева не меняет verify result». Для каждого ряда отметьте decision stage, mutation/read/send counter, final state digest и отклонение от expected. Normal-control обязан пройти тот же код, иначе отрицательный исход ничего не говорит о защите. Повторите лишь малый детерминированный набор; расхождение порядка считается отдельным race/cache сигналом. Pass ставится только когда запрет срабатывает раньше чувствительного действия, а разрешённый сценарий сохраняет documented behavior.
Свяжите patch с узким механизмом
Проверьте исправление по механизму, а не по номеру версии: upstream patch должен напрямую обеспечивать «изоляция dynamic JWKS cache по trust domain, endpoint и kid». Сопоставьте pre/post build на том же fixture и сравните «issuer / jwks-endpoint / kid / cache-key / fetched-from / verify-result». Для диапазона «github.com/centrifugal/centrifugo/v6 <= 6.8.0; first patched 6.8.1 | github.com/centrifugal/centrifugo/v5 <= 5.4.9; patched version not listed | github.com/centrifugal/centrifugo/v4 <= 4.1.5; patched version not listed | github.com/centrifugal/centrifugo/v3 <= 3.2.3; patched version not listed | github.com/centrifugal/centrifugo <= 2.4.0; patched version not listed» отдельно внесите в карточку vendor patch provenance и release artifact digest. Canary допускается только в лаборатории; production rollout требует отдельного change contract, backup и rollback. Не объявляйте систему безопасной целиком: этот опыт подтверждает один узкий invariant и не говорит об эксплуатации, ущербе, спросе, индексации или позиции страницы.
Остановитесь и подготовьте поддержку
Примените жёсткий stop-rule: остановиться до реального JWT, внешнего JWKS endpoint или пользовательской identity. Красные флаги также включают внешний адрес, реальный credential, privilege prompt, необратимую запись, рост ресурсов, данные не из fixture, отсутствие cleanup и изменившийся объект вне test root. При первом флаге остановитесь и оставьте статус blocked. Для поддержки соберите для ghsa-g6vg-wj8f-48cj, Centrifugo JWKS, «github.com/centrifugal/centrifugo/v6 <= 6.8.0; first patched 6.8.1 | github.com/centrifugal/centrifugo/v5 <= 5.4.9; patched version not listed | github.com/centrifugal/centrifugo/v4 <= 4.1.5; patched version not listed | github.com/centrifugal/centrifugo/v3 <= 3.2.3; patched version not listed | github.com/centrifugal/centrifugo <= 2.4.0; patched version not listed», reachability evidence, sanitized matrix, штатный контроль, stop reason и две прямые ссылки. Не публикуйте payload и чужие логи; неизвестное обозначьте unknown, а не выдуманным фактом.
Используйте минимальное дерево решения
Минимальное дерево решения для Centrifugo JWKS: если версия вне доказанного affected range и patch provenance подтверждён — not-applicable; если ветвь недостижима по документированной конфигурации — not-reachable; если fixture даёт «ключ выбирается только из JWKS своего issuer; порядок прогрева не меняет verify result» на candidate build — ready-for-reviewed-update; если наблюдается «одинаковый kid у двух разрешённых issuer приводит к повторному использованию ключа из чужого tenant» — fail и эскалация владельцу. Во всех остальных случаях статус unknown. К карточке приложите «issuer / jwks-endpoint / kid / cache-key / fetched-from / verify-result» и criterion «остановиться до реального JWT, внешнего JWKS endpoint или пользовательской identity». Такое дерево не превращает один advisory в универсальную рекомендацию и сохраняет people-first приоритет: минимальное воздействие, ясная остановка и проверяемый ответ.
Материал подготовлен редакцией VOne с помощью ИИ; даты, диапазоны, прямые ссылки, безопасный опыт, privacy-ограничения и отсутствие рекламных обещаний затем перепроверены по первичным источникам.
Источники и проверка
- GitHub Reviewed Advisory ghsa-g6vg-wj8f-48cj проверено 2026-08-31
- Upstream-репозиторий Centrifugo JWKS проверено 2026-08-31
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.