
Офлайн-проверщик для 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 / .warBOOT-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 компилирует RuleTable.java из двух первичных источников данных:
GHSA-6g23-24mc-hx6x → затронутые диапазоны + официальные исправленные версииmaven-metadata.xml с repo1.maven.org → версии, фактически существующие в публичном репозиторииИ содержит четыре утверждения: число диапазонов ≥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 не считается непрочитанным (запись EOCD размером 22 байта — это настоящий пустой zip) и не вызывает 4 —
когда ложных тревог много, настоящие тревоги никто не смотрит.
Значения остальных кодов выхода см. в описанных выше уровнях вердикта и разделах использования.