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).

Временное решение

Если немедленное обновление невозможно, примените следующие меры:

  1. Настройте собственный криптографический ключ. Это самый эффективный способ. Укажите уникальный, сложный ключ в конфигурации Shiro, чтобы заменить уязвимый ключ по умолчанию. Пример для конфигурационного файла shiro.ini: ini [main] securityManager.rememberMeManager.cipherKey = ваш_уникальный_ключ_здесь_база64 Сгенерируйте безопасный ключ, например, с помощью команды: bash openssl rand -base64 128

  2. Отключите функцию "remember me". Если она не критична для вашего приложения, полностью отключите ее в конфигурации Shiro. Пример для shiro.ini: ini [main] securityManager.rememberMeManager = null

  3. Настройте правила WAF (Web Application Firewall). Добавьте правила для блокировки запросов, содержащих в куках (Cookie) подозрительные или известные вредоносные последовательности, связанные с эксплойтами десериализации Java (например, сигнатуры классов commons-collections).

  4. Ограничьте доступ. Настройте сетевые ACL или правила брандмауэра, чтобы ограничить доступ к приложению только доверенным IP-адресам или сегментам сети.