
Spring Cloud Config CVE-2026-40982용 오프라인 체커 — 사용 중인 버전 계열에 OSS 수정 사항이 전혀 있는지 알려줍니다(3.1.x/4.1.x/4.2.x: 없음)
Spring Cloud Config CVE-2026-40982 오프라인 점검 도구 —— 의존성 제로, 단일 jar, 네트워크 불필요.
이 도구가 답하는 것은 「내가 영향을 받는가」가 아니라, 그 더 괴로운 질문입니다:
내 이 버전 라인은, Maven Central에 올라온 안전한 업그레이드 버전이 대체 있는가?
3.1.x / 4.1.x / 4.2.x 세 라인에 대한 답은 없다입니다.
공식 advisory(spring.io/security/cve-2026-40982)에서 제시한 수정 버전:
| 버전 라인 | 공식 수정 버전 | 가용성 | Maven Central에서 해당 라인의 최고 버전 | 업그레이드 가능 여부 |
|---|---|---|---|---|
| 3.1.x | 3.1.14 | Enterprise Support Only | 3.1.10 | ❌ |
| 4.1.x | 4.1.10 | Enterprise Support Only | 4.1.7 | ❌ |
| 4.2.x | 4.2.7 | Enterprise Support Only | 4.2.4 | ❌ |
| 4.3.x | 4.3.3 | OSS | 4.3.4 | ✅ |
| 5.0.x | 5.0.3 | OSS | 5.0.4 | ✅ |
그 세 수정 버전은 공개 저장소에 없습니다. 누구나 검증할 수 있습니다:
curl -sI https://repo1.maven.org/maven2/org/springframework/cloud/spring-cloud-config-server/4.2.7/
# HTTP/1.1 404 Not Found
그리고 자동화 도구는 이 사실을 알려주지 않는다 —— GitHub advisory의 구조화된 데이터에서,
이 세 가지 라인의 first_patched_version은 바로 null이다:
{"range": "<= 3.1.13", "first_patched_version": null}
{"range": ">= 4.1.0, <= 4.1.9", "first_patched_version": null}
{"range": ">= 4.2.0, <= 4.2.6", "first_patched_version": null}
{"range": ">= 4.3.0, <= 4.3.2", "first_patched_version": "4.3.3"}
{"range": ">= 5.0.0, <= 5.0.2", "first_patched_version": "5.0.3"}
Dependabot / OSV가 소비하는 것이 바로 이 데이터입니다. 업그레이드 대상이 없으면 업그레이드 제안을 할 수 없습니다.
java -jar scc-check.jar <目录或 jar/war 路径>
# 中文乱码时(Windows 控制台代码页与 Java 判断常常对不上):
java -jar scc-check.jar target/ --utf8
**Java 17+**가 필요합니다. 런타임 의존성이 전혀 없어 오프라인 환경에 그대로 넣어 사용할 수 있습니다.
종료 코드: 2 버전 라인이 올라갈 수 없음 · 1 영향받지만 업그레이드 가능 / 판정 불가 · 0 미발견 · 3 사용법 또는 경로 오류
.jar / .war 파일 이름BOOT-INF/lib/, WEB-INF/lib/)META-INF/maven/.../pom.properties) — jar 이름이 바뀌어도 인식 가능pom.xml1. 클라이언트를 영향받는 것으로 계산하지 않음.
이 CVE는 서버 측 spring-cloud-config-server에만 영향을 줍니다. spring-cloud-starter-config
(클라이언트)를 참조한 프로젝트는 영향받지 않으며, 도구가 이를 명확히 알려주어 괜히 긴장하지 않도록 합니다.
2. 4.0.x에 대해서는 판정을 내리지 않음.
공식 advisory의 어떤 구간도 4.0.x를 포함하지 않습니다(4.0.0 > 3.1.13, 하한이 없는 구간에 속하지 않음).
도구는 "공식 커버리지 범위 밖"이라고만 보고하며, CRITICAL로 보고하지 않습니다 — 추측으로 판정표를 채우면 잘못된 결정을 내리게 됩니다.
3. 버전을 읽을 수 없을 때는 "판정 불가"라고 명시하며, 절대 안전으로 처리하지 않음.
Spring Cloud는 release train으로 버전을 통합 관리하므로 pom.xml에 <version>이 아예 없는 경우가 많습니다.
이 경우 도구는 문제를 찾지 못한 척하지 않고 빌드 산출물을 스캔하라고 알려줍니다.
마찬가지로 scope가 test / provided인 의존성은 사용자에게 전이되지 않으므로 노출면으로 계산하지 않으며,
XML 주석으로 감싸인 의존성은 제거됩니다.
tools/gen_rules.py는 두 개의 1차 데이터 소스로부터 RuleTable.java를 컴파일합니다:
GHSA-6g23-24mc-hx6x → 영향받는 구간 + 공식 수정 버전repo1.maven.org의 maven-metadata.xml → 공개 저장소에 실제로 존재하는 버전그리고 네 가지 단언을 포함합니다: 구간 수 ≥5, first_patched=null인 것 ≥3, 버전 라인 ≥5,
ENTERPRISE_ONLY로 판정된 것 ≥3. 하나라도 충족되지 않으면 즉시 중단하고 파일을 생성하지 않습니다 —
그렇지 않으면 파싱이 한 번 실패할 때 빈 표가 생성되고, 단위 테스트는 빈 표를 상대로도 그대로 통과하게 됩니다.
python tools/gen_rules.py # 重新生成判定表
mvn test # 31 个测试
이 도구는 버전 비교만 수행하며, 당신의 Config Server가 실제로 공인 인터넷에 노출되어 있는지, WAF가 있는지, 다른 방식으로 이미 완화되었는지는 검사하지 않습니다. 판정 결과는 점검의 출발점일 뿐, 보안 결론이 아닙니다. 공식 advisory를 기준으로 삼으십시오.
MIT
이 도구가 답하는 것은 「내가 당했는가」입니다. 아래 항목들은 이 도구가 답할 수 없으니, 필요하시면 저에게 의뢰하실 수 있습니다:
📮 [email protected] —— 상황을 설명해 주시면 24시간 이내에 한 페이지 분량의 서면 답변을 드립니다: 가능한지, 어디가 어려운지, 대략 얼마나 걸리는지. 이 단계는 무료이며, 먼저 무엇을 약속하실 필요도 없습니다.
| 코드 | 의미 |
|---|---|
0 | 스캔이 끝났고, 모든 파일을 실제로 읽어 들였으며, 조치가 필요한 발견 사항이 없음 |
4 | 읽을 수 없는 파일이 있음 —— zip이 아니거나, 내용이 잘렸거나, 읽기에 실패함 |
🔴 4는 2026-09-09에 추가되었으며, 추가한 이유는 분명히 밝힐 가치가 있습니다.
그 이전에는 읽을 수 없는 파일이 출력에 한 줄 안내만 남기고 종료 코드는 그대로 0 이었습니다 ——
흔적은 사람이 보는 것이고, CI와 스크립트가 보는 것은 종료 코드이므로, 자동화에서는 「내가 그것을 읽지 못했다」가 「통과」와 같았습니다.
손상되었거나 암호화되었거나 다운로드가 불완전한 jar는 조용히 「문제를 발견하지 못함」이라는 한 줄이 되어버렸습니다.
「나는 그것을 읽을 수 없다」와 「당신은 안전하다」는 반드시 서로 다른 말이어야 합니다.
⚠️ 정상적인 빈 jar는 읽을 수 없는 것으로 간주하지 않습니다(22바이트짜리 EOCD 레코드는 진짜 빈 zip입니다), 4를 트리거하지 않습니다 ——
거짓 경보가 많아지면 진짜 경보를 아무도 보지 않게 됩니다.
나머지 종료 코드의 의미는 위의 각 판정 등급 및 사용 설명을 참조하십시오.