gRPC-Go — это реализация gRPC на языке Go. В версиях до 1.79.3 имеется обход авторизации, возникающий из-за неправильной проверки ввода псевдозаголовка `:path` HTTP/2. Сервер gRPC-Go был слишком мягок в своей логике маршрутизации, принимая запросы, в которых в `:path` опущена обязательная начальная косая черта (например, `Service/Method` вместо `/Service/Method`).
Хотя сервер успешно перенаправил эти запросы правильному обработчику, перехватчики авторизации (включая официальный пакет grpc/authz) оценили необработанную, неканоническую строку пути. Следовательно, правила «запретить», определенные с использованием канонических путей (начинающихся с `/`), не смогли соответствовать входящему запросу, что позволило ему обойти политику, если присутствовало резервное правило «разрешения». Это влияет на серверы gRPC-Go, которые используют перехватчики авторизации на основе пути, такие как официальная реализация RBAC в `google.golang.org/grpc/authz` или пользовательские перехватчики, использующие `info.FullMethod` или `grpc.Method(ctx)`; И политика безопасности содержит определенные правила «запрета» для канонических путей, но разрешает другие запросы по умолчанию (резервное правило «разрешения»).
Эта уязвимость может быть использована злоумышленником, который может отправлять необработанные кадры HTTP/2 с неверными заголовками `:path` непосредственно на сервер gRPC. Исправление в версии 1.79.3 гарантирует, что любой запрос с `:path`, который не начинается с косой черты, немедленно отклоняется с ошибкой `codes.Unimplemented`, не позволяя ему достичь перехватчиков авторизации или обработчиков с неканонической строкой пути. Хотя обновление является наиболее безопасным и рекомендуемым путем, пользователи могут снизить уязвимость, используя один из следующих методов: использовать проверяющий перехватчик (рекомендуемое средство устранения); нормализация на уровне инфраструктуры; и/или ужесточение политики.
Показать оригинальное описание (EN)
gRPC-Go is the Go language implementation of gRPC. Versions prior to 1.79.3 have an authorization bypass resulting from improper input validation of the HTTP/2 `:path` pseudo-header. The gRPC-Go server was too lenient in its routing logic, accepting requests where the `:path` omitted the mandatory leading slash (e.g., `Service/Method` instead of `/Service/Method`). While the server successfully routed these requests to the correct handler, authorization interceptors (including the official `grpc/authz` package) evaluated the raw, non-canonical path string. Consequently, "deny" rules defined using canonical paths (starting with `/`) failed to match the incoming request, allowing it to bypass the policy if a fallback "allow" rule was present. This affects gRPC-Go servers that use path-based authorization interceptors, such as the official RBAC implementation in `google.golang.org/grpc/authz` or custom interceptors relying on `info.FullMethod` or `grpc.Method(ctx)`; AND that have a security policy contains specific "deny" rules for canonical paths but allows other requests by default (a fallback "allow" rule). The vulnerability is exploitable by an attacker who can send raw HTTP/2 frames with malformed `:path` headers directly to the gRPC server. The fix in version 1.79.3 ensures that any request with a `:path` that does not start with a leading slash is immediately rejected with a `codes.Unimplemented` error, preventing it from reaching authorization interceptors or handlers with a non-canonical path string. While upgrading is the most secure and recommended path, users can mitigate the vulnerability using one of the following methods: Use a validating interceptor (recommended mitigation); infrastructure-level normalization; and/or policy hardening.
Характеристики атаки
Последствия
Строка CVSS v3.1
Тип уязвимости (CWE)
Уязвимые продукты 1
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Grpc Grpc
cpe:2.3:a:grpc:grpc:*:*:*:*:*:go:*:*
|
— |
1.79.3
|