CVE-2016-4437
Apache Shiro
2021-11-03
Apache Shiro contains a vulnerability which may allow remote attackers to execute code or bypass intended access restrictions via an unspecified request parameter when a cipher key has not been configured for the "remember me" feature.
Технический анализ и план устранения
Суть уязвимости
Уязвимость (CVE-2016-4437, Shiro-550) в Apache Shiro версий до 1.2.5 позволяет удаленному злоумышленнику выполнить произвольный код на сервере или обойти ограничения контроля доступа.
Механизм атаки:
1. Функция "remember me" использует сериализованные и зашифрованные куки для хранения состояния аутентификации пользователя.
2. Если в конфигурации Shiro не задан собственный криптографический ключ (cipherKey), используется ключ по умолчанию, который является общеизвестным.
3. Злоумышленник может создать вредоносную сериализованную Java-команду (например, для запуска шелла), зашифровать ее с помощью известного ключа по умолчанию и отправить в куках.
4. Когда Shiro получает и расшифровывает эти куки, происходит десериализация вредоносного объекта, что приводит к выполнению кода злоумышленника на сервере.
Как исправить
Основное решение — обновление Apache Shiro до безопасной версии.
Для систем на базе Linux (обновление через Maven/Gradle):
1. Определите текущую версию Shiro в файле конфигурации вашего проекта (например, pom.xml для Maven или build.gradle для Gradle).
2. Обновите зависимость до версии 1.2.5 или выше.
Пример для Maven (pom.xml):
xml
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.5</version> <!-- Минимальная безопасная версия -->
</dependency>
Пример для Gradle (build.gradle):
gradle
dependencies {
implementation 'org.apache.shiro:shiro-core:1.2.5'
}
3. Пересоберите и перезапустите ваше приложение.
Для Windows (если Shiro используется в Java-приложении):
Процесс аналогичен. Обновите версию библиотеки Shiro в вашем проекте (например, в pom.xml или build.gradle) до 1.2.5+, пересоберите WAR/JAR-файл и переразверните приложение на сервере (например, Tomcat).
Временное решение
Если немедленное обновление невозможно, примените следующие меры:
-
Настройте собственный криптографический ключ. Это самый эффективный способ. Укажите уникальный, сложный ключ в конфигурации Shiro, чтобы заменить уязвимый ключ по умолчанию. Пример для конфигурационного файла
shiro.ini:ini [main] securityManager.rememberMeManager.cipherKey = ваш_уникальный_ключ_здесь_база64Сгенерируйте безопасный ключ, например, с помощью команды:bash openssl rand -base64 128 -
Отключите функцию "remember me". Если она не критична для вашего приложения, полностью отключите ее в конфигурации Shiro. Пример для
shiro.ini:ini [main] securityManager.rememberMeManager = null -
Настройте правила WAF (Web Application Firewall). Добавьте правила для блокировки запросов, содержащих в куках (
Cookie) подозрительные или известные вредоносные последовательности, связанные с эксплойтами десериализации Java (например, сигнатуры классовcommons-collections). -
Ограничьте доступ. Настройте сетевые ACL или правила брандмауэра, чтобы ограничить доступ к приложению только доверенным IP-адресам или сегментам сети.