🇰🇷 한글 설명
Envoy 프록시에서 ext_authz 필터에 failure_mode_allow: true 설정이 되어 있을 경우 권한 상승이 발생할 수 있습니다. 비-UTF-8 데이터가 포함된 HTTP 헤더를 수신하면 잘못된 프로토부 메시지가 생성되어 외부 서비스에서 디코딩 오류가 발생하며, 이 과정에서 인증을 우회하거나 로그 기록이 누락될 수 있습니다.
💡 쉬운 설명
특수한 문자가 포함된 요청을 보내면 보안 검사 시스템이 오류를 일으켜 인증을 통과해버리는 문제입니다. 이로 인해 보안 검사를 거치지 않은 요청이 시스템에 들어오거나 기록이 남지 않을 수 있습니다.
🇺🇸 원문 (English)
Envoy is an open source edge and service proxy designed for cloud-native applications. Prior to versions 1.26.0, 1.25.3, 1.24.4, 1.23.6, and 1.22.9, escalation of privileges is possible when `failure_mode_allow: true` is configured for `ext_authz` filter. For affected components that are used for logging and/or visibility, requests may not be logged by the receiving service.
When Envoy was configured to use ext_authz, ext_proc, tap, ratelimit filters, and grpc access log service and an http header with non-UTF-8 data was received, Envoy would generate an invalid protobuf message and send it to the configured service. The receiving service would typically generate an error when decoding the protobuf message. For ext_authz that was configured with ``failure_mode_allow: true``, the request would have been allowed in this case. For the other services, this could have resulted in other unforeseen errors such as a lack of visibility into requests.
As of versions 1.26.0, 1.25.3, 1.24.4, 1.23.6, and 1.22.9, Envoy by default sanitizes the values sent in gRPC service calls to be valid UTF-8, replacing data that is not valid UTF-8 with a `!` character. This behavioral change can be temporarily reverted by setting runtime guard `envoy.reloadable_features.service_sanitize_non_utf8_strings` to false. As a workaround, one may set `failure_mode_allow: false` for `ext_authz`.
📍 영향받는 시스템
Envoy versions prior to 1.26.0, 1.25.3, 1.24.4, 1.23.6, and 1.22.9
⚔️ 공격 벡터
비-UTF-8 데이터가 포함된 HTTP 헤더를 전송하여 gRPC 서비스 호출 시 잘못된 프로토부 메시지 생성 유도
🛡️ 대응 방법
Envoy를 수정된 버전(1.26.0, 1.25.3 등)으로 업데이트하거나, ext_authz 설정에서 failure_mode_allow를 false로 변경
🔧 검증 코드
출력된 버전이 취약점이 해결된 버전(1.26.0, 1.25.3, 1.24.4, 1.23.6, 1.22.9 이상)인지 확인합니다.
envoy --version 2>/dev/null | grep -E '1.26.0|1.25.3|1.24.4|1.23.6|1.22.9|(?<!1\.)(1\.[0-9]{2}|[0-9]\.[0-9])'