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 или выше).
- Проверьте текущую версию пакета в файле
composer.jsonилиcomposer.lock. - Выполните обновление зависимостей с помощью Composer:
composer update facade/ignition
-
Если вы используете Laravel 8 и выше, убедитесь, что пакет обновлен как минимум до версии 2.5.2. Если вы используете более старые версии Laravel, рекомендуется обновить Ignition до последней доступной минорной версии в рамках вашей ветки.
-
После обновления убедитесь, что в
composer.lockзафиксирована версия не ниже 2.5.2.
Временные меры
Если немедленное обновление пакета невозможно, примените следующие защитные меры:
- Отключите режим отладки в файле конфигурации
.env. Это самый эффективный способ защиты для продуктовых сред, так как Ignition работает только приAPP_DEBUG=true.
APP_DEBUG=false
- Убедитесь, что на сервере установлена актуальная версия PHP, и отключите возможность использования протокола
phar://в настройкахphp.ini, если это не нарушает работу приложения:
phar.readonly = 1
-
Ограничьте доступ к приложению по IP-адресам или используйте Web Application Firewall (WAF) для фильтрации запросов, содержащих подозрительные строки типа
php://filterили_ignition/execute-solution. -
Удалите пакет Ignition из секции
requireи перенесите его вrequire-dev, чтобы он не устанавливался на "боевых" серверах:
composer remove facade/ignition
composer require facade/ignition --dev