ProxySQL은 MySQL과 그 포크, PostgreSQL을 위한 프록시입니다. 버전 2.0.0~3.0.8에서 ProxySQL MySQL 프런트엔드는 `PROXY UNKNOWN <addr> <addr> <port> <port>\r\n` PP1 프레임을 올바른 형식의 PROXY 프로토콜 헤더로 허용합니다. HAProxy PROXY 프로토콜 v1 사양에 따르면 프로토콜 토큰이 'UNKNOWN'인 경우 프록시가 클라이언트 ID를 확인할 수 없다고 선언했기 때문에 수신자는 이를 따르는 모든 주소 필드를 무시해야 합니다. ProxySQL은 해당 주소 필드를 구문 분석합니다.
ProxySQL은 MySQL과 그 포크, PostgreSQL을 위한 프록시입니다. 버전 2.0.0~3.0.8에서 ProxySQL MySQL 프런트엔드는 PROXY UNKNOWN <addr> <addr> <port> <port>\r\n PP1 프레임을 올바른 형식의 PROXY 프로토콜 헤더로 허용합니다. HAProxy PROXY 프로토콜 v1 사양에 따르면 프로토콜 토큰이 'UNKNOWN'인 경우 프록시가 클라이언트 ID를 확인할 수 없다고 선언했기 때문에 수신자는 이를 따르는 모든 주소 필드를 무시해야 합니다. ProxySQL은 sscanf를 통해 해당 주소 필드를 구문 분석하고 스푸핑된 소스 주소를 세션의 addr.addr 필드에 씁니다. 거기에서 client_addr 조건자가 라우팅과 ACL을 결정하는 쿼리 규칙 일치자로 직접 흐릅니다. mysql-proxy_protocol_networks = '*'(기본값)인 경우 모든 TCP 피어는 PP1 프레임을 보내고 소스 IP 클레임을 선택할 수 있습니다. 이를 통해 client_addr 값에 고정된 mysql_query_rules 행은 위조 가능합니다. 공격자는 일치시키려는 주소를 PP1 라인에 쓰고 ProxySQL은 쿼리가 해당 주소에서 나온 것처럼 라우팅합니다. 실제로 이는 라우팅 및 ACL 우회입니다. 실제 배포에서는 읽기-쓰기 분할(내부 앱은 기본으로 이동, 공용 트래픽은 읽기 복제본으로 이동), 앱별 스키마 고정 및 쿼리 필터 규칙(DDL은 관리자 CIDR에서만 허용되고 공개 쿼리는 위험한 패턴에서 차단됨)에 'client_addr'을 사용합니다. 프런트엔드 포트에 도달할 수 있는 공격자는 이러한 경로 중 하나로 침입할 수 있습니다. 버전 3.0.9에서는 이 문제를 패치합니다.