🇰🇷 한글 설명
pgAdmin 4의 데이터 가져오기/내보내기 도구에서 SQL 쿼리 검증 로직의 오류로 인해 발생하는 원격 코드 실행(RCE) 취약점입니다. 공격자가 특수하게 조작된 쿼리를 사용하여 psql의 \\copy 명령어를 조작함으로써 시스템 명령어를 실행할 수 있습니다. 이는 pgAdmin의 괄호 균형 검사기가 백슬래시(\\)의 이스케이프 처리를 잘못 해석하여 발생합니다.
💡 쉬운 설명
pgAdmin의 데이터 관리 기능에 보안 구멍이 있어, 악의적인 명령어가 포함된 SQL을 입력하면 해커가 컴퓨터를 마음대로 조종할 수 있습니다. 이는 프로그램이 특수 기호를 처리하는 방식이 실제 데이터베이스와 달라서 발생하는 문제입니다.
🇺🇸 원문 (English)
pgAdmin 4's Import/Export Data tool builds a psql \copy (...) command line by interpolating a user-supplied SQL query into a Jinja template and passing the rendered line to psql via --command. To stop an attacker from breaking out of the (...) wrapper, create_import_export_job() (route POST /import_export/job/<sid>, gated only by the ordinary, commonly-granted tools_import_export_data permission) validated the query with a hand-written parenthesis-balance checker, _is_query_parens_balanced(). That checker always treated a backslash before a single quote (\') as escaping the quote, i.e. as if standard_conforming_strings were off. PostgreSQL has defaulted standard_conforming_strings to on since 9.1 (2010), the default on every PostgreSQL version pgAdmin 4 currently supports (13-18); under that default psql's own \copy tokenizer treats \ as an ordinary character, so a single quote immediately after it closes the string literal. A query such as SELECT 'a\') TO PROGRAM 'echo pwned' x' was therefore accepted as "balanced" by pgAdmin's checker (which believed the ) was still inside the string), while psql, run through the actual rendered command line, closes the string at that point and treats the following ) as the end of the wrapping \copy (...) subquery, exposing an attacker-chosen TO PROGRAM '<command>' clause that psql executes via popen() -- independent of a subsequent syntax error later on the same line. This is the same class of bug as CVE-2025-12762/CVE-2025-13780 (RCE via psql meta-command/COPY injection during PLAIN-format dump restore), reached through an independently written defense in a different module (Import/Export Data rather than Restore) that had its own, different logic bug (inverted backslash-escape semantics rather than a BOM-defeated regex anchor).
The fix rejects any backslash inside a single-quoted string in the query outright, rather than picking one of the two possible psql interpretations. This is intentionally conservative: because the correct interpretation of \ depends on the target server's standard_conforming_strings setting, which the checker cannot reliably know at validation time, refusing the query is safer than guessing.
This issue affects pgAdmin 4: from the introduction of _is_query_parens_balanced() before 9.18.
📍 영향받는 시스템
pgAdmin 4 (version 9.18 미만 버전)
⚔️ 공격 벡터
Import/Export Data 도구의 SQL 쿼리 입력란에 백슬래시와 따옴표를 조합한 조작된 쿼리 주입
🛡️ 대응 방법
pgAdmin 4를 최신 보안 패치가 적용된 버전으로 업데이트하십시오.
🔧 검증 코드
출력된 버전이 9.18 미만인 경우 해당 취약점에 노출된 상태입니다.
pgadmin4 --version 2>/dev/null || dpkg -l | grep pgadmin4