
Descubra os módulos e versões reais do Apache Shiro que você tem instalados e determine, item por item, quais das 26 CVEs oficiais realmente se aplicam a você. Julgamento por «CVE × módulo», um único jar sem dependências. CVE-2026-49268
Descobre os módulos e versões reais do Apache Shiro que você instalou e determina, uma a uma, quais das 26 CVEs oficiais realmente se aplicam a você.
Um único jar sem dependências, sem internet, não lê seu pom — analisa diretamente os artefatos de build (jar / war / fat jar / diretório).
java -jar shiro-check.jar --utf8 your-app.jar
As CVEs do Shiro não estão ligadas ao «Shiro», e sim a módulos específicos. O mesmo número significa regras diferentes em módulos diferentes:
| CVE | Módulos afetados | Quem usa apenas shiro-core |
|---|---|---|
| CVE-2020-17510 | shiro-spring | Não é afetado |
| CVE-2020-17523 | shiro-web / shiro-spring / shiro-spring-boot-starter | Não é afetado |
| CVE-2023-34478 | shiro-web | Não é afetado |
| CVE-2026-56091 | shiro-guice | Não é afetado |
Das 26 oficiais, 13 não tocam em shiro-core de forma alguma. Comprimi-las em uma frase como «Shiro < 1.7.1 tem vulnerabilidades» é fazer pelo usuário o julgamento que ele deveria fazer sozinho — e fazê-lo de forma errada.
A granularidade de avaliação desta ferramenta é CVE × módulo: as 26 CVEs se desdobram em 37 regras, cobrindo 7 módulos.
O Dependabot faz a correspondência das advisories do GitHub pelas coordenadas de dependência. Das 26, 5 não batem certo:
E shiro-root é o POM pai com packaging=pom — no Maven Central não existe jar correspondente (HTTP 404); nenhum projeto depende dele, então a correspondência por coordenadas nunca vai bater.
ℹ️
unreviewedé um estado normal do fluxo do GitHub (importado automaticamente pelo NVD, ainda sem marcação manual dos pacotes afetados); a correspondência por coordenadas também é um design razoável. Aqui apenas se constata o fato de «não entrar nos alertas» — não se diz que alguém reportou errado.
shiro-all é um uber jar que empacota vários módulos. Na prática, dentro de shiro-all-1.3.2.jar há 6 arquivos META-INF/maven/org.apache.shiro/<módulo>/pom.properties:
shiro-all shiro-core shiro-web shiro-spring shiro-ehcache shiro-quartz
Ou seja, um projeto cujo pom declara apenas shiro-all tem apenas um nome no nível das coordenadas (das 26, só a CVE-2016-6802 está associada a essa coordenada), mas dentro do jar há de fato código dos três módulos core / web / spring.
Analisar o artefato real enxerga através dessa camada. Em um teste com shiro-all-1.3.2.jar, a ferramenta reportou 20 entradas em 3 módulos.
O first_patched_version de 3 advisories é 3.0.0-alpha-2, mas essa versão nunca foi publicada no Maven Central (a oficial lançou direto a versão final 3.0.0). Atualizar seguindo essa referência é impossível — a ferramenta sinaliza isso e troca a sugestão de atualização por uma versão que realmente pode ser obtida.
«Hit» = o módulo está presente E a versão está dentro do intervalo afetado oficial. Não equivale a «já explorado» nem a «necessariamente explorável».
A grande maioria das 26 entradas só se aplica com configuração específica, por isso a ferramenta as lista separadamente:
Exemplos de condições (comparadas palavra por palavra com o texto original da descrição oficial, sem extrapolação):
CVE-2026-49268 apenas ao usar DefaultLdapRealm (nome de usuário concatenado no DN do LDAP sem escape)
CVE-2023-22602 apenas ao usar com Spring Boot 2.6+, sem redefinir
spring.mvc.pathmatch.matching-strategy para ant_path_matcher
CVE-2026-23903 apenas quando arquivos estáticos estão em um sistema de arquivos que não diferencia
maiúsculas de minúsculas (ex.: configuração padrão do macOS), e no Shiro só estão
configurados caminhos de filter em minúsculas; afeta apenas arquivos estáticos
🔴 A ferramenta não analisa sua configuração. O Shiro pode ser configurado em shiro.ini / application.yml / código Java; uma conclusão obtida com parsing seria mais perigosa do que não analisar. As condições estão listadas em texto claro para você mesmo julgar — é uma decisão deliberada, não preguiça.
# analisa um jar / war
java -jar shiro-check.jar your-app.jar
# analisa um diretório inteiro (recursivo)
java -jar shiro-check.jar /path/to/libs
# também lista as entradas «não aplicáveis»
java -jar shiro-check.jar --all your-app.jar
# para quando o console do Windows exibe caracteres chineses corrompidos
java -jar shiro-check.jar --utf8 your-app.jar
Capacidade de reconhecimento: jar comum · Spring Boot fat jar (BOOT-INF/lib/) · WAR tradicional (WEB-INF/lib/) · uber jar (shiro-all, expande os módulos internos) · jar renomeado (a referência é o pom.properties) · arquivos malformados que usam barras invertidas nos caminhos.
Requer JDK 17+. Zero dependências em tempo de execução.
Nenhuma linha é escrita à mão. tools/gen_rules.py gera a partir de duas fontes primárias:
| Fonte | O que fornece |
|---|---|
| shiro.apache.org/security-reports.html | conjunto completo de entradas, texto original das descrições, texto original das condições de acionamento |
| GitHub Advisory API | coordenadas dos módulos afetados, intervalos de versão estruturados, classificação de severidade |
O processo de geração tem 12 asserções; se qualquer uma não for satisfeita, ele aborta sem gravar o arquivo (evitando «falha de parsing gera tabela oca e os testes continuam todos verdes»):
Antes da publicação, existe tools/recheck_before_publish.py, que revalida os argumentos estruturais com um segundo critério independente (não importa o script de geração nem lê a saída dele — reutilizar a mesma lógica de parsing reproduziria os bugs junto).
unreviewed para reviewed a qualquer momentoshiro-check analisa seus artefatos de build (jar / war / fat jar / diretório) para identificar quais módulos do Apache Shiro você realmente distribui e, em seguida, avalia todas as 26 CVEs oficiais contra sua combinação exata de módulo + versão.
Por que ela existe: as CVEs do Shiro estão ligadas a módulos, não ao «Shiro». 13 das 26 nunca tocam em shiro-core de forma alguma. A ferramenta trabalha na granularidade de CVE × módulo (37 regras, 7 módulos).
Três coisas que a correspondência baseada em coordenadas não consegue ver:
unreviewed, com a lista de pacotes afetados vazia; 2 estão associadas apenas a org.apache.shiro:shiro-root, que é um POM pai com packaging=pom e sem jar no Maven Central (HTTP 404), portanto nenhum projeto depende dele.shiro-all é um uber jar — shiro-all-1.3.2.jar contém 6 entradas pom.properties (core, web, spring, ehcache, quartz + ele mesmo). Seu pom mostra uma coordenada; o jar carrega código de três módulos.3.0.0-alpha-2 como a correção, uma versão nunca publicada no Maven Central. A ferramenta sinaliza essas e sugere uma versão para a qual você pode de fato atualizar.Um «hit» significa módulo presente E versão dentro do intervalo afetado oficial. Não significa explorável — a maioria das entradas exige configuração específica, que a ferramenta lista literalmente a partir da advisory oficial. Deliberadamente, ela não analisa sua configuração.
java -jar shiro-check.jar [--all] [--utf8] <jar | war | directory> ...
Requer JDK 17+. Sem dependências em tempo de execução. A tabela de regras é gerada a partir de duas fontes primárias com 12 asserções que abortam em caso de falha; veja tools/gen_rules.py.
Apache License 2.0
| Entrada | Por que não corresponde |
|---|
| CVE-2026-56091 (bypass de autenticação no shiro-guice, alta) | a advisory ainda está unreviewed; lista de pacotes afetados vazia |
| CVE-2026-56130 (cookie RememberMe que nunca expira) | idem |
| CVE-2014-0074 (bypass de senha vazia no LDAP) | idem |
| CVE-2023-22602 (bypass de autenticação no Spring Boot 2.6+, alta) | a advisory está associada apenas a org.apache.shiro:shiro-root |
| CVE-2010-3863 | idem |