
実際にインストールされている Apache Shiro モジュールとバージョンをスキャンし、公式の26件の CVE のうち、どれが実際にあなたに該当するかを1件ずつ判定します。
依存関係ゼロの単一 jar、ネットワーク接続なし、あなたの pom を読まない —— ビルド成果物(jar / war / fat jar / ディレクトリ)を直接スキャンします。
java -jar shiro-check.jar --utf8 your-app.jar
Shiro の CVE は**「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 advisory を照合します。26 件のうち 5 件が一致しません:
| 項目 | 一致しない理由 |
|---|---|
| CVE-2026-56091(shiro-guice 認証バイパス、high) | advisory が依然として unreviewed で、影響を受けるパッケージが空 |
| CVE-2026-56130(RememberMe cookie が期限切れにならない) | 同上 |
| CVE-2014-0074(LDAP 空パスワードによるバイパス) | 同上 |
| CVE-2023-22602(Spring Boot 2.6+ 認証バイパス、high) | advisory が**org.apache.shiro:shiro-root にのみ紐付けられている** |
| CVE-2010-3863 | 同上 |
そして shiro-root は packaging=pom の親 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 しか書かれていないプロジェクトは、座標レベルでは名前が1つしかない
(26 件のうち CVE-2016-6802 だけがこの座標に紐づく)が、jar の中には実際に core / web / spring の3モジュールのコードが存在している。
実物をスキャンすればこの層を見抜ける。実際に shiro-all-1.3.2.jar を試したところ、本ツールは 3モジュールにまたがる20件 を報告した。
3件の advisory の 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.ini / application.yml / Java コードのいずれでも Shiro を設定できますが、 解析して得られる結論は解析しないよりも危険です。条件は明示的に列挙されているので、判断はあなた自身が行います —— これは意図的な設計であり、手抜きではありません。
# 扫一个 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 があり、第二の独立した口径で根幹となる論拠を再検証する
(生成スクリプトを import せず、その出力も読まない —— 同じ解析ロジックを再利用すればバグごと再現してしまうからだ)。
unreviewed を reviewed に変えうるshiro-check はビルド成果物(jar / war / fat jar / ディレクトリ)をスキャンして、実際に出荷している Apache Shiro のモジュールを特定し、正確なモジュール + バージョンの組み合わせに対して26 件の公式 CVE をすべて評価します。
存在理由:Shiro の CVE は「Shiro」ではなくモジュールに紐づきます。26 件のうち 13 件は shiro-core にまったく触れていません。このツールは CVE × モジュールの粒度(37 ルール、7 モジュール)で動作します。
座標ベースのマッチングでは見えない 3 つのこと:
unreviewed で影響パッケージリストが空です。2 件は org.apache.shiro:shiro-root にのみ紐づいており、これは packaging=pom の親 POM で Maven Central に jar が存在しない(HTTP 404)ため、どのプロジェクトもこれに依存することはありません。shiro-all は uber jar — shiro-all-1.3.2.jar には 6 つの pom.properties エントリ(core、web、spring、ehcache、quartz + 自身)が含まれています。あなたの pom には 1 つの座標しか表示されませんが、jar には 3 モジュール分のコードが入っています。3.0.0-alpha-2 を指す — これは Maven Central に公開されたことのないバージョンです。このツールはこれらをフラグし、実際にアップグレード可能なバージョンを提案します。「ヒット」とはモジュールが存在し、かつバージョンが公式の影響範囲内にあることを意味します。悪用可能であることを意味するものではありません — ほとんどのエントリは特定の設定を必要とし、ツールはそれを公式アドバイザリから逐語的に列挙します。意図的にあなたの設定を解析することはありません。
java -jar shiro-check.jar [--all] [--utf8] <jar | war | directory> ...
JDK 17+ が必要です。実行時の依存関係はありません。ルールテーブルは2つの主要なソースから生成され、失敗時に中止する12個のアサーションがあります。tools/gen_rules.py を参照してください。
Apache License 2.0
このツールが答えるのは「自分は該当したかどうか」です。以下はこのツールでは答えられないため、私にご依頼いただけます:
📮 [email protected] —— 状況をお知らせください。24 時間以内に 1 ページの書面回答をお返しします: できるかどうか、どこが難しいか、おおよその所要時間。この段階は無料で、事前のコミットも不要です。
| コード | 意味 |
|---|---|
0 | スキャン完了、かつすべてのファイルを実際に読み込めた、対応が必要な検出結果なし |
4 | 読み込めないファイルがある —— zip でない、内容が切り詰められている、または読み取り失敗 |
🔴 4 は 2026-09-09 に追加されました。追加した理由は明確にしておく価値があります。
それ以前は、読み込めないファイルは出力に 1 行のヒントを残すだけで、終了コードは従来どおり 0 でした ——
記録は人間が見るものですが、CI やスクリプトが見るのは終了コードであり、
「私はそれを読めなかった」が自動化の中では「合格」と等しくなっていました。
破損した、暗号化された、またはダウンロードが不完全な jar は、静かに「問題は見つかりませんでした」に変わってしまいます。
「私はそれを読めない」と「あなたは安全だ」は別の文でなければなりません。
⚠️ 正当な空の jar は読み込めない扱いになりません(22 バイトの EOCD レコードは本物の空 zip です)、4 は発生しません ——
誤警告が増えると、本当の警告を誰も見なくなります。
その他の終了コードの意味は、上記の各判定段階と使い方の説明を参照してください。