🇰🇷 한글 설명
pgAdmin 4 7.2 이상 9.17 미만에서 MASTER_PASSWORD_HOOK 설정의 %u 치환 시 사용자명이 셸 명령어에 직접 삽입되어, 인증된 사용자가 셸 메타문자를 포함한 사용자명으로 pgAdmin 서비스 계정 권한의 임의 명령을 실행할 수 있습니다. 수정본은 설정 문자열을 argv로 분할한 뒤 shell=False로 실행하여 사용자명을 단일 인자로 제한합니다.
💡 쉬운 설명
사용자 이름에 특수 문자를 넣어 서버에서 원하는 명령을 실행할 수 있는 취약점입니다. 업데이트하면 사용자 이름이 단순한 문자열로만 처리되어 이 공격이 차단됩니다.
🇺🇸 원문 (English)
The MASTER_PASSWORD_HOOK setting, introduced in pgAdmin 4 7.2, lets an administrator configure an external command that returns a per-user encryption key, with %u in the configured string replaced by the current user's name. The previous implementation substituted the username directly into the command string and executed the result with subprocess.Popen(..., shell=True). Because the username can originate from an external authentication source (OAuth/OIDC claims, Kerberos, webserver auth) rather than a value pgAdmin fully controls, a username containing shell metacharacters (';', '$()', backticks, pipes, '&&', newlines) allowed an authenticated user to execute arbitrary commands as the pgAdmin service account in any deployment where the configured hook string uses %u.
Fix tokenises the trusted, administrator-configured hook string into an argument vector first (using shlex in POSIX-quoting mode, with backslash-escaping disabled so Windows-style paths are not mis-parsed), substitutes the untrusted username into the individual argv elements, and executes with shell=False. The username is therefore always confined to a single argv element; any shell metacharacters it contains are inert. Administrators whose MASTER_PASSWORD_HOOK previously relied on shell features (pipes, redirection, environment-variable expansion, globbing) within the hook string itself must move that logic into the invoked script, since it is no longer interpreted by a shell.
This issue affects pgAdmin 4: from 7.2 before 9.17.
📍 영향받는 시스템
pgAdmin 4 7.2 이상 9.17 미만, MASTER_PASSWORD_HOOK 설정에 %u를 사용하는 환경
⚔️ 공격 벡터
외부 인증(OAuth/OIDC, Kerberos 등)을 통해 인증된 사용자가 셸 메타문자를 포함한 사용자명으로 임의 명령을 실행
🛡️ 대응 방법
pgAdmin 4를 9.17 이상으로 업데이트하고, 기존에 셸 기능(파이프, 리다이렉션 등)에 의존하던 훅 로직은 호출되는 스크립트 내부로 옮기기
🔧 검증 코드
출력된 버전이 9.17 이상이면 패치 적용됨, 7.2 이상 9.17 미만이면 취약한 버전이므로 업데이트 필요
pip show pgadmin4 2>/dev/null | grep -i '^version'