개념 증명 에뮬레이션 및 분석 도구로, 심각한 PostgreSQL SQL 삽입 취약점인 CVE-2025-1094를 대상으로 합니다. Docker 기반 실습 환경, 익스플로잇 스크립트, 근본 원인 분석, 보안 테스트 및 교육을 위한 단계별 시연을 포함합니다.
2025년 3월 14일에 수행된 이 상세 분석은 제공된 에뮬레이션 설정과 개념 증명(PoC) 실행을 기반으로 PostgreSQL에서 가상의 심각한 SQL 인젝션 취약점인 CVE-2025-1094를 탐구합니다. 이 분석은 취약점 소개, 근본 원인, 파일 기여, PoC 단계 및 완화 조치를 다루며, 에뮬레이션 과정의 모든 복잡한 세부 사항을 포함합니다.
CVE-2025-1094는 PostgreSQL의 치명적인 SQL 인젝션 결함으로 설명되며, 버전 17.3, 16.7, 15.11, 14.16, 13.19 이전에 영향을 미치고 CVSS 3.1 기본 점수 8.1로 기밀성, 무결성 및 가용성에 상당한 영향을 미칩니다. 이를 통해 공격자는 민감한 데이터에 접근하거나 원격 코드 실행(RCE)을 수행할 수 있으며, 실제 침해 사례에서 악용되었습니다. 예를 들어 BeyondTrust 사고는 17개 기업 고객에게 영향을 미쳤으며, BleepingComputer에 보고되었고, 미국 재무부 침해 사례는 The Register에 자세히 설명되어 있습니다. 2025년 3월 14일에 수행된 에뮬레이션은 server_encoding=EUC_TW 및 client_encoding=BIG5를 사용하는 Docker 설정으로, 익스플로잇을 트리거하는 데 중요했습니다. PoC는 DO 블록을 주입하여 대형 객체를 생성하고, pg_read_file을 통해 /etc/passwd를 읽고, lo_put으로 대형 객체에 쓰고, lo_export를 사용하여 로 내보내는 과정을 포함했으며, 인코딩 불일치가 권한 없는 파일 접근을 가능하게 하는 역할을 확인했습니다.
/tmp/payload근본 원인은 CWE-149: 인용 구문의 부적절한 중립화(Improper Neutralization of Quoting Syntax)로 분류되며, PostgreSQL의 libpq 함수(PQescapeLiteral(), PQescapeIdentifier(), PQescapeString(), PQescapeStringConn())에서 인용 구문을 적절히 처리하지 못하여, 결과가 psql 명령줄 도구의 입력을 구성하는 데 사용될 때 SQL 인젝션을 허용합니다. 이는 client_encoding이 BIG5로 설정되고 server_encoding이 EUC_TW인 경우 악화되며, 이는 설정에서 확인된 바와 같습니다. 에뮬레이션은 불일치를 생성하기 위해 EUC_TW와 zh_TW.EUC_TW가 필요했으며, psycopg2의 EUC_TW 지원 부족과 같은 문제는 UTF8로 연결한 후 BIG5로 전환하여 해결했습니다. 익스플로잇의 성공은 로그에 자세히 설명된 대로 안전한 쿼리 처리를 우회하는 subprocess.run(["psql", ...])을 통한 원시 SQL 실행에 달려 있었습니다.
설정의 각 파일은 CVE-2025-1094를 에뮬레이션하는 데 중요한 역할을 합니다. 아래는 표 형식의 자세한 분석입니다.
| 파일 | 수행 작업 | PoC에 대한 기여 | 필요한 이유 |
|---|---|---|---|
exploit.py | POST 요청에 DO 블록을 포함하여 대형 객체를 생성하고 내보내며 /etc/passwd를 읽습니다. | SQL 인젝션을 트리거하고, 인코딩 불일치를 악용하여 임의 SQL 명령을 실행합니다. | 익스플로잇 실행을 가능하게 하며, PoC 영향에 중요합니다. |
app.py | /vuln-endpoint를 노출하는 Flask 앱으로, psql을 통해 원시 SQL을 실행합니다. | 익스플로잇을 위한 취약한 엔드포인트를 제공합니다. | 익스플로잇의 진입점으로, 취약점 시연에 필요합니다. |
init.sql | 문자열 입력을 위한 id VARCHAR(255) 열을 가진 테스트 테이블을 생성합니다. | 인젝션을 위한 스키마를 설정하고, 유형 오류 없이 페이로드 실행을 보장합니다. | 익스플로잇을 위한 데이터베이스 설정으로, SQL 인젝션에 필수적입니다. |
Dockerfile | 필요한 종속성을 가진 Flask 앱 컨테이너를 빌드합니다. | 엔드포인트 배포를 위한 격리된 앱 서비스를 생성합니다. | 취약한 앱을 배포하며, PoC 재현성에 중요합니다. |
docker-compose.yml | 특정 구성으로 db 및 app 서비스를 정의하고 연결합니다. | 설정을 오케스트레이션하고, 인코딩 불일치 및 서비스 종속성을 보장합니다. | 서비스를 연결하며, 환경 설정 및 격리에 필수적입니다. |
Dockerfile.db | EUC_TW 인코딩으로 PostgreSQL 컨테이너를 빌드합니다. | 필요한 인코딩으로 취약한 데이터베이스를 생성합니다. | 필요한 인코딩으로 데이터베이스를 설정하며, 취약점 트리거에 중요합니다. |
2025년 3월 14일에 실행된 PoC는 다음 단계를 통해 익스플로잇의 영향을 보여주며, 각 단계에는 자세한 설명이 포함됩니다.
sudo docker compose up --build
db 및 app)를 빌드하고 시작하며, 필요한 경우 업데이트된 이미지로 컨테이너를 생성하고 postgre_default 네트워크에서 연결합니다. 취약한 환경이 설정되도록 보장하며, db는 EUC_TW 인코딩을 사용하고 app은 포트 5000에서 /vuln-endpoint를 노출하여 익스플로잇의 인코딩 불일치와 엔드포인트 접근에 중요합니다.curl -X POST http://localhost:5000/vuln-endpoint -d "input=test"
input=test를 포함한 POST 요청을 Flask 앱의 엔드포인트로 전송하여 연결성과 기본 기능을 확인하고, "Executed" 응답을 기대합니다. 앱이 실행 중이고 데이터베이스에 연결할 수 있음을 확인하여 익스플로잇을 위한 설정이 준비되었는지 보장합니다.
python3 cve-2025-1094-exploit.py
/etc/passwd를 작성한 후 /tmp/payload로 내보내며 실행 상태를 출력합니다. SQL 인젝션을 트리거하여 취약점을 악용해 /etc/passwd를 읽으며, 성공적인 파일 내보내기가 포함된 로그에서 볼 수 있듯이 CVE-2025-1094의 영향을 입증하는 데 중요합니다.
sudo docker ps
postgre-app-1 및 postgre-db-1이 실행 중인지 확인합니다. 익스플로잇을 실행하기 전에 설정을 확인하고, 두 서비스가 모두 활성 상태인지 확인하여 PoC 신뢰성에 중요합니다. 사용자에게 컨테이너 ID를 제공하며, 이후 명령에 필요합니다.sudo docker exec -it bash -c "LC_ALL=C ls -l /tmp/payload && LC_ALL=C cat /tmp/payload"
postgre-db-1 컨테이너에서 명령을 실행하여 /tmp/payload를 나열하고 표시하며, 익스플로잇 결과( /etc/passwd가 표시되어야 함)를 확인합니다. 파일을 확인하여 익스플로잇이 작동했는지 검증하고, /tmp/payload에 민감한 데이터가 포함되었는지 확인하며, PoC 검증과 일치하고 LC_ALL=C를 사용하여 로케일 깨짐을 방지합니다.
sudo docker exec -it psql -U postgres -d postgres -c "SELECT * FROM test;"
test 테이블에서 모든 항목을 선택하고, 익스플로잇의 INSERT( "Exploit ran with loid ..."가 표시되어야 함)를 확인합니다. 익스플로잇의 데이터베이스 수정을 확인하고, DO 블록이 실행되었는지 확인하며, PoC 검증과 일치하고 loid 로깅을 검증합니다.sudo docker compose down
Demonstration Video on Vimeo
PoC 데모를 보려면 Vimeo에서 클릭하세요.
CVE-2025-1094를 완화하기 위해 에뮬레이션 통찰력과 업계 지침에 따라 다음 조치를 권장합니다.
psql에 접근할 수 있도록 제한하여 공격 표면을 줄입니다.