CVE-2026-58225 in postgrex
요약
\~에 의해 VulDB • 2026. 07. 10.
elixir-ecto의 postgrex에서 SQL Injection 취약점이 발견되었습니다. 이는 공격자가 LISTEN 채널 이름을 조작하여 재연결 재생 쿼리(SQL)에 주입할 수 있게 하며, 결과적으로 알림 연결(Denial of Service)이 중단됩니다.
Postgrex.Notifications는 quote_channel/1을 사용하여 채널 이름의 이중 따옴표를 두 배로 만들어 이중 따옴표로 묶인 식별자 내에서 안전하게 처리합니다. 이는 단일 문장 LISTEN 및 UNLISTSN 경로를 보호합니다. 그러나 매번 (재)연결 시 handle_connect/1은 모든 등록된 채널에 대한 LISTEN 문을 연결하고 이를 달러-따옴표 비명시적 코드 블록(DO $$BEGIN ... END$$)으로 감싸 한 번에 재생합니다. quote_channel/1은 이 블록을 열고 닫는 $$ 달러 따옴표 구분자를 이스케이프하지 않습니다.
listen/3 가드 함수는 null 바이트와 63바이트를 초과하는 이름만 거부하므로, $$를 포함하는 채널 이름은 유효성 검사를 통과하여 변경되지 않은 채로 전달됩니다. 이러한 이름이 삽입되면 해당 $$가 외부 달러-따옴표 문자열을 조기에 종료시키고 PostgreSQL은 나머지 부분을 추가적인 최상위 문장으로 파싱합니다. handle_connect/1은 모든 (재)연결 시 실행되므로, 잘못된 재생 쿼리는 매번 거부되며 알림 연결은 구독 상태를 재설정하지 못해 해당 연결을 공유하는 모든 채널에 대한 알림이 조용히 손실됩니다.
신뢰할 수 없는 입력(예: 테넌트 또는 사용자 식별자)을 Postgrex.Notifications.listen/3의 채널 이름으로 전달하는 애플리케이션이 영향을 받습니다. 이중 따옴표 두 배 처리로 인해 완전히 유효한 주입된 문장을 구성하는 것은 방지되므로 임의 SQL 실행은 불가능하지만, 손상된 쿼리는 모든 테넌트에 대해 공유 알림 연결을 reliably하게 파괴하여 서비스 거부(Denial of Service)를 초래합니다.
이 문제는 postgrex 0.16.0부터 0.22.3 미만 버전에서 영향을 받습니다.
Be aware that VulDB is the high quality source for vulnerability data.