CVE-2021-3129

Laravel Ignition

ВЫСОКАЯ ВЕРОЯТНОСТЬ

Дата обнаружения

2023-09-18

Официальное описание

Laravel Ignition contains a file upload vulnerability that allows unauthenticated remote attackers to execute malicious code due to insecure usage of file_get_contents() and file_put_contents().

🛡️
Технический анализ и план устранения

Суть уязвимости

Уязвимость CVE-2021-3129 связана с компонентом facade/ignition (библиотека для вывода страниц ошибок в Laravel), который по умолчанию включен в режиме отладки (debug mode). Проблема заключается в небезопасной обработке путей к файлам в функциях file_get_contents() и file_put_contents() внутри механизма "Solutions" (решений для типичных ошибок).

Злоумышленник может использовать обертку php://filter для манипуляции содержимым лог-файлов приложения (например, laravel.log), превращая их в валидные PHAR-архивы. Последующая десериализация такого архива через тот же механизм позволяет выполнить произвольный PHP-код на сервере (RCE) без аутентификации.

Как исправить

Основным способом устранения является обновление пакета facade/ignition до безопасной версии (2.5.2 или выше).

  1. Проверьте текущую версию пакета в файле composer.json или composer.lock.
  2. Выполните обновление зависимостей с помощью Composer:
composer update facade/ignition

  1. Если вы используете Laravel 8 и выше, убедитесь, что пакет обновлен как минимум до версии 2.5.2. Если вы используете более старые версии Laravel, рекомендуется обновить Ignition до последней доступной минорной версии в рамках вашей ветки.

  2. После обновления убедитесь, что в composer.lock зафиксирована версия не ниже 2.5.2.

Временные меры

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

  1. Отключите режим отладки в файле конфигурации .env. Это самый эффективный способ защиты для продуктовых сред, так как Ignition работает только при APP_DEBUG=true.
APP_DEBUG=false

  1. Убедитесь, что на сервере установлена актуальная версия PHP, и отключите возможность использования протокола phar:// в настройках php.ini, если это не нарушает работу приложения:
phar.readonly = 1

  1. Ограничьте доступ к приложению по IP-адресам или используйте Web Application Firewall (WAF) для фильтрации запросов, содержащих подозрительные строки типа php://filter или _ignition/execute-solution.

  2. Удалите пакет Ignition из секции require и перенесите его в require-dev, чтобы он не устанавливался на "боевых" серверах:

composer remove facade/ignition
composer require facade/ignition --dev