
CVE-2022-31630에 대한 개념 증명 익스플로잇입니다. 이는 PHP의 GD 확장 기능에서 발생하는 범위를 벗어난 읽기(out-of-bounds read) 취약점입니다. 영향을 받는 PHP 버전에서 충돌 및 메모리 노출을 보여줍니다. 안전한 테스트를 위한 Docker 기반 실습 환경을 포함합니다.
#CVE-2022-31630 – 개념 증명 익스플로잇
경고: 이 코드는 교육 및 격리된 실험실 환경에서의 테스트 목적으로만 제작되었습니다. 허가 없이 다른 시스템에서 사용하는 것은 불법이며 책임을 지지 않습니다.
📌 설명
CVE-2022-31630은 PHP GD 확장의 imageloadfont() 함수에서 발생하는 Out-of-Bounds(OOB) 읽기 취약점입니다. 이 취약점을 통해 PHP 애플리케이션이 로드하는 폰트 파일을 제어할 수 있는 공격자가 할당된 버퍼 경계를 넘어 데이터를 읽을 수 있습니다. 발생할 수 있는 영향:
· Denial of Service(충돌) – 애플리케이션이 응답을 멈춥니다. · 정보 노출 – 메모리의 민감한 데이터(예: 키, 토큰 또는 기타 데이터 조각)가 읽힐 수 있습니다.
영향을 받는 PHP 버전
· PHP 7.4.x 7.4.33 미만 · PHP 8.0.x 8.0.25 미만 · PHP 8.1.x 8.1.12 미만
PHP 7.4.33은 이 CVE에 대한 패치가 적용된 첫 번째 버전입니다. 이 저장소는 취약한 버전(≤ 7.4.32)과 패치된 버전(≥ 7.4.33) 간의 동작 차이를 보여주기 위한 개념 증명(PoC)을 제공합니다.
🔍 기술 세부 사항
취약점은 GD 폰트 파일(.gdf 형식)을 읽을 때 입력 검증이 부족한 데서 비롯됩니다. 폰트 파일의 헤더 구조는 다음과 같습니다:
| 바이트 오프셋 | 크기 (바이트) | 설명 |
|---|
| 0 | 2 | 매직 넘버 (0x01BE) |
| 2 | 2 | 문자 수 (nchars) |
| 4 | 2 | 문자 너비 (width) (픽셀 단위) |
| 6 | 2 | 문자 높이 (height) |
| 8 | 2 | 문자당 바이트 수 (char_offset) |
width 값이 매우 크게 설정되면(예: 65535), 문자 비트맵을 저장할 버퍼 크기 계산이 잘못됩니다. 결과적으로 할당된 버퍼가 너무 작아집니다. 이후 imagechar() 함수가 해당 폰트에서 문자를 읽을 때 버퍼 경계를 넘어 메모리에 접근하게 됩니다 – 이것이 Out-of-Bounds 읽기입니다.
🧪 테스트 요구 사항
· Docker (격리된 환경 실행용) · PHP 7.4.32 또는 7.4.33 (php:7.4.32-cli / php:7.4.33-cli Docker 이미지 사용 가능) · GD 확장 (컨테이너 내에서 설치됨)
🚀 PoC 사용 방법
git clone https://github.com/sepkascurty-cpu/php-exploit_cve-2022-31630.git
cd exploit_cve-2022-31630
취약한 버전(7.4.32) 테스트:
docker run -it --rm -v $(pwd):/app php:7.4.32-cli bash
패치된 버전(7.4.33) 테스트:
docker run -it --rm -v $(pwd):/app php:7.4.33-cli bash
cd /app
apt-get update
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
docker-php-ext-configure gd --with-freetype --with-jpeg
docker-php-ext-install gd
php exploit_cve-2022-31630.php
📊 예제 출력
| PHP 버전 | 예상 결과 |
|---|---|
| 7.4.32 (취약) | 프로그램이 세그멘테이션 오류로 충돌하거나 메모리 누수 발생 (메모리에서 더미 데이터가 보임). |
| 7.4.33 (패치됨) | 실행이 정상적으로 완료되고 output.png 이미지 파일이 저장되며 충돌 없음. |
🛡️ 완화 방법
· PHP를 패치가 포함된 최신 버전으로 업데이트:
· PHP 7.4.33 이상
· PHP 8.0.25 이상
· PHP 8.1.12 이상
· 즉시 업데이트가 불가능한 경우, GD 확장 또는 imageloadfont() 함수를 꼭 필요하지 않다면 비활성화합니다.
· 애플리케이션에 최소 권한 원칙을 적용하여 메모리 유출 시 영향을 최소화합니다.
📚 참고 자료
· NVD의 CVE-2022-31630 · php-src의 패치 커밋 · PHP 릴리스 공지
⚠️ 면책 조항
이 저장소는 교육 및 보안 연구 목적으로 제공됩니다. 작성자는 이 코드의 오용에 대해 책임을 지지 않습니다. 반드시 소유하거나 서면 허가를 받은 환경에서만 테스트하시기 바랍니다.
인도네시아 사이버 보안 커뮤니티를 위해 제작되었습니다.