
Выявляет фактически установленные у вас модули и версии Apache Shiro и по каждому пункту определяет, какие из 26 официальных CVE действительно вас затрагивают. Определение по принципу «CVE × модуль», без зависимостей, один jar. CVE-2026-49268
Определяет, какие модули и версии Apache Shiro вы фактически поставляете, и по каждой из 26 официальных CVE показывает, какие из них действительно вас касаются.
Один jar без зависимостей, без сети, не читает ваш pom — сканирует непосредственно артефакты сборки (jar / war / fat jar / каталог).
java -jar shiro-check.jar --utf8 your-app.jar
CVE в Shiro привязаны не к «Shiro», а к конкретным модулям. Один и тот же номер в разных модулях — это разные правила:
| CVE | Затронутые модули | Только shiro-core |
|---|---|---|
| CVE-2020-17510 | shiro-spring | не затронут |
| CVE-2020-17523 | shiro-web / shiro-spring / shiro-spring-boot-starter | не затронут |
| CVE-2023-34478 | shiro-web | не затронут |
| CVE-2026-56091 | shiro-guice | не затронут |
Из официальных 26 записей 13 вообще не касаются shiro-core. Сжать их во фразу «Shiro < 1.7.1 уязвим» — значит принять за пользователя решение, которое он должен принимать сам. И это решение ошибочно.
Гранулярность определения этого инструмента — CVE × модуль: 26 CVE разворачиваются в 37 правил, покрывающих 7 модулей.
Dependabot сопоставляет рекомендации GitHub по координатам зависимостей. Из 26 записей 5 не сходятся:
А shiro-root — это родительский POM с packaging=pom. На Maven Central нет соответствующего jar (HTTP 404), ни один проект от него не зависит, поэтому сопоставление по координатам никогда не сойдётся.
ℹ️
unreviewed— это нормальное состояние процесса в GitHub (автоматический импорт из NVD, затронутые пакеты ещё не размечены вручную); сопоставление по координатам — тоже разумное проектное решение. Здесь лишь констатируется факт «не попадает в предупреждения», а не чья-то ошибка.
shiro-all — это uber jar, упаковывающий в себя несколько модулей. Проверено на практике: внутри shiro-all-1.3.2.jar находятся 6 файлов META-INF/maven/org.apache.shiro/<模块>/pom.properties:
shiro-all shiro-core shiro-web shiro-spring shiro-ehcache shiro-quartz
То есть у проекта, в pom которого указан только shiro-all, на уровне координат есть лишь одно имя (из 26 записей только CVE-2016-6802 висит на этой координате), а внутри jar в действительности лежит код трёх модулей — core / web / spring.
Сканирование реального артефакта позволяет увидеть этот слой. Проверено на shiro-all-1.3.2.jar: инструмент выдаёт 20 записей в 3 модулях.
У 3 рекомендаций first_patched_version — это 3.0.0-alpha-2, и эта версия никогда не публиковалась на Maven Central (официально сразу вышел финальный 3.0.0). Обновиться до неё невозможно — инструмент помечает такие случаи и заменяет рекомендацию по обновлению на версию, которую реально можно получить.
«Попадание» = этот модуль присутствует И версия попадает в официальный диапазон затронутых версий. Это не равно «уже эксплуатируется» или «обязательно эксплуатируемо».
Подавляющее большинство из 26 записей срабатывает только при определённой конфигурации, поэтому инструмент перечисляет их раздельно:
Примеры условий (дословно по оригинальному тексту официальных описаний, без экстраполяций):
CVE-2026-49268 仅当使用 DefaultLdapRealm(用户名未转义即拼进 LDAP DN)
CVE-2023-22602 仅当与 Spring Boot 2.6+ 一起使用,且未把
spring.mvc.pathmatch.matching-strategy 设回 ant_path_matcher
CVE-2026-23903 仅当静态文件放在大小写不敏感的文件系统上(如 macOS 默认设置),
且 Shiro 里只配了小写的 filter 路径;只影响静态文件
🔴 Инструмент не разбирает вашу конфигурацию. Shiro можно настроить в shiro.ini / application.yml / Java-коде; вывод, полученный парсингом, опаснее, чем его отсутствие. Условия перечислены открытым текстом, и решение принимаете вы — это осознанное проектное решение, а не лень.
# 扫一个 jar / war
java -jar shiro-check.jar your-app.jar
# 扫整个目录(递归)
java -jar shiro-check.jar /path/to/libs
# 连「不适用」的条目也列出来
java -jar shiro-check.jar --all your-app.jar
# Windows 控制台中文乱码时
java -jar shiro-check.jar --utf8 your-app.jar
Что распознаёт: обычные jar · Spring Boot fat jar (BOOT-INF/lib/) · классические WAR (WEB-INF/lib/) · uber jar (shiro-all, с разворачиванием вложенных модулей) · переименованные jar (ориентир — pom.properties) · некорректные архивы, в которых пути записаны через обратную косую черту.
Требуется JDK 17+. В рантайме ноль зависимостей.
Ни одной строки не переписано вручную. tools/gen_rules.py генерирует её из двух первоисточников:
| Источник | Что даёт |
|---|---|
| shiro.apache.org/security-reports.html | полный набор записей, оригинальный текст описаний, оригинальный текст условий срабатывания |
| GitHub Advisory API | координаты затронутых модулей, структурированные диапазоны версий, уровень серьёзности |
Процесс генерации сопровождается 12 проверками-утверждениями; если хоть одна не выполнена, генерация останавливается и файл не записывается (защита от ситуации «парсер сломался, таблица вышла пустой, а тесты по-прежнему зелёные»):
Перед публикацией дополнительно запускается tools/recheck_before_publish.py, который по второй, независимой методике заново проверяет несущие аргументы (не импортирует скрипт генерации и не читает его вывод — повторное использование той же логики разбора воспроизвело бы и баги вместе с ней).
unreviewed в reviewedshiro-check сканирует ваши артефакты сборки (jar / war / fat jar / каталог), чтобы определить, какие модули Apache Shiro вы фактически поставляете, а затем оценивает все 26 официальных CVE применительно к вашей точной комбинации модуль + версия.
Зачем это нужно: CVE в Shiro привязаны к модулям, а не к «Shiro». 13 из 26 вообще не касаются shiro-core. Инструмент работает на гранулярности CVE × модуль (37 правил, 7 модулей).
Три вещи, которые не видит сопоставление по координатам:
unreviewed с пустым списком затронутых пакетов; ещё 2 прикреплены только к org.apache.shiro:shiro-root, а это родительский POM с packaging=pom, у которого нет jar на Maven Central (HTTP 404), поэтому ни один проект никогда от него не зависит.shiro-all — это uber jar — внутри shiro-all-1.3.2.jar содержатся 6 записей pom.properties (core, web, spring, ehcache, quartz + он сам). В вашем pom видна одна координата; внутри jar лежит код трёх модулей.3.0.0-alpha-2 — версия, которая никогда не публиковалась на Maven Central. Инструмент помечает такие случаи и предлагает версию, до которой реально можно обновиться.«Попадание» означает модуль присутствует И версия находится в официальном затронутом диапазоне. Это не означает эксплуатируемость — большинство записей требует определённой конфигурации, которую инструмент приводит дословно из официальной рекомендации. Он осознанно не разбирает вашу конфигурацию.
java -jar shiro-check.jar [--all] [--utf8] <jar | war | directory> ...
Требуется JDK 17+. Без зависимостей в рантайме. Таблица правил генерируется из двух первоисточников с 12 проверками-утверждениями, которые останавливают генерацию при сбое; см. tools/gen_rules.py.
Apache License 2.0
| Запись | Почему не сходится |
|---|
| CVE-2026-56091 (обход аутентификации в shiro-guice, high) | рекомендация всё ещё unreviewed, список затронутых пакетов пуст |
| CVE-2026-56130 (cookie RememberMe никогда не истекает) | то же самое |
| CVE-2014-0074 (обход пустого пароля LDAP) | то же самое |
| CVE-2023-22602 (обход аутентификации в Spring Boot 2.6+, high) | рекомендация прикреплена только к org.apache.shiro:shiro-root |
| CVE-2010-3863 | то же самое |