
실제 설치된 Apache Shiro 모듈과 버전을 스캔해 공식 CVE 26개 중 실제로 해당되는 항목을 하나씩 판정합니다. 「CVE × 모듈」 기준으로 판정하며, 제로 의존성 단일 jar입니다. CVE-2026-49268
실제로 설치된 Apache Shiro 모듈과 버전을 스캔하여, 공식 26개 CVE 중 어떤 것이 실제로 해당되는지 항목별로 판정합니다.
의존성 없는 단일 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가 7개 모듈을 포괄하는 37개 규칙으로 확장됩니다.
Dependabot은 의존성 좌표를 기준으로 GitHub advisory를 매칭합니다. 26개 중 5개는 매칭되지 않습니다:
그런데 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만 적어 둔 프로젝트는 좌표상으로는 이름이 하나뿐이며(26개 중 CVE-2016-6802만 이 좌표에 연결됨), jar 안에는 실제로 core / web / spring 세 모듈의 코드가 들어 있습니다.
실물을 스캔하면 이 층위가 드러납니다. 실제로 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가 두 개의 1차 소스에서 생성합니다:
| 소스 | 제공 내용 |
|---|---|
| shiro.apache.org/security-reports.html | 전체 항목, 설명 원문, 트리거 조건 원문 |
| GitHub Advisory API | 영향받는 모듈 좌표, 구조화된 버전 범위, 등급 |
생성 과정에는 **12개의 단언(assertion)**이 있으며, 하나라도 충족되지 않으면 파일을 쓰지 않고 중단합니다('파싱이 실패해 빈 껍데기 테이블이 생성되어도 테스트는 여전히 모두 통과'하는 상황을 방지):
게시 전에 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개 모듈)로 동작합니다.
좌표 기반 매칭으로는 볼 수 없는 세 가지:
unreviewed이며
영향받는 패키지 목록이 비어 있음. 2개는 org.apache.shiro:shiro-root에만 연결되어 있는데,
이는 Maven Central에 jar가 없는(HTTP 404) packaging=pom 부모 POM이므로
어떤 프로젝트도 이를 의존하지 않음.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에 게시된 적이 없음. 도구는 이를 표시하고 실제로 업그레이드할 수 있는 버전을 권장함.'적중'은 모듈이 존재하고 버전이 공식 영향 범위 내에 있음을 의미합니다. 악용 가능함을 의미하지는 않습니다 — 대부분의 항목은 특정 구성이 필요하며, 도구는 이를 공식 advisory에서 원문 그대로 나열합니다. 구성은 의도적으로 해석하지 않습니다.
java -jar shiro-check.jar [--all] [--utf8] <jar | war | directory> ...
JDK 17+ 필요. 런타임 의존성 없음. 규칙 테이블은 두 개의 1차 소스에서 생성되며, 실패 시 중단되는 12개의 단언(assertion)이 적용됩니다. tools/gen_rules.py 참조.
Apache License 2.0
| 항목 | 매칭되지 않는 이유 |
|---|
| CVE-2026-56091(shiro-guice 인증 우회, high) | advisory가 여전히 unreviewed이며 영향받는 패키지가 비어 있음 |
| CVE-2026-56130(RememberMe 쿠키 만료되지 않음) | 위와 동일 |
| CVE-2014-0074(LDAP 빈 암호 우회) | 위와 동일 |
| CVE-2023-22602(Spring Boot 2.6+ 인증 우회, high) | advisory가 org.apache.shiro:shiro-root에만 연결됨 |
| CVE-2010-3863 | 위와 동일 |