CVE

Vulnerabilidad en Apollo Federation (CVE-2024-43414)

Severidad:
ALTA
Type:
No Disponible / Otro tipo
Fecha de publicación:
27/08/2024
Última modificación:
27/08/2024

Descripción

Apollo Federation es una arquitectura para componer API de forma declarativa en un gráfico unificado. Cada equipo puede ser dueño de su porción del gráfico de forma independiente, lo que les permite realizar entregas de forma autónoma e incremental. Las instancias de @apollo/query-planner >=2.0.0 y <2.8.5 se ven afectadas por una vulnerabilidad de denegación de servicio. Las versiones de @apollo/gateway >=2.0.0 y <2.8.5 y Apollo Router <1.52.1 también se ven afectadas por el uso de @apollo/query-panner. Si se le pide a @apollo/query-planner que planifique una consulta suficientemente compleja, es posible que se repita infinitamente y nunca se complete. Esto da como resultado un consumo de memoria ilimitado y una falla o terminación por falta de memoria (OOM). Este problema puede desencadenarse si tiene al menos un campo que no sea @key y que pueda resolverse mediante varios subgrafos. Para identificar estos campos compartidos, se debe revisar el esquema de cada subgrafo. El mecanismo para identificar campos compartidos varía según la versión de Federación que estén utilizando sus subgrafos. Puede comprobar si sus subgrafos utilizan la Federación 1 o la Federación 2 revisando sus esquemas. Los esquemas de subgrafos de Federación 2 contendrán una directiva @link que hace referencia a la versión de Federación que se utiliza, mientras que los subgrafos de Federación 1 no. Por ejemplo, en un subgrafo de Federación 2, encontrará una línea como @link(url: "https://specs.apollo.dev/federation/v2.0"). Si una directiva @link similar no está presente en su esquema de subgrafo, está utilizando la Federación 1. Tenga en cuenta que un supergrafo puede contener una combinación de subgrafos de Federación 1 y Federación 2. Este problema se debe a que el planificador de consultas de Apollo intenta utilizar un número que excede el número de Javascript.MAX_VALUE en algunos casos. En Javascript, Number.MAX_VALUE es (2^1024 - 2^971). Cuando el planificador de consultas recibe una solicitud Graphql entrante, divide la consulta en partes y, para cada parte, genera una lista de posibles pasos de ejecución para resolver la parte. Estos candidatos representan los pasos que seguirá el planificador de consultas para satisfacer las partes de la consulta más grande. Como parte de las operaciones normales, el planificador de consultas requiere y calcula la cantidad de planes de consulta posibles para la consulta total. Es decir, necesita el producto del número de candidatos al plan de consulta para cada parte de la consulta. En circunstancias normales, después de generar todos los candidatos al plan de consulta y calcular el número de todas las permutaciones, el planificador de consultas pasa a clasificar los candidatos y eliminar las opciones menos óptimas. En consultas particularmente complejas, especialmente aquellas donde los campos se pueden resolver a través de múltiples subgrafos, esto puede hacer que el número de todas las permutaciones del plan de consulta aumente. En el peor de los casos, esto puede terminar siendo un número mayor que Number.MAX_VALUE. En Javascript, si se excede Number.MAX_VALUE, Javascript representa el valor como "infinito". Si el recuento de candidatos se evalúa como infinito, el componente del planificador de consultas responsable de eliminar los planes de consultas que no son óptimos en realidad no elimina los candidatos, lo que hace que el planificador de consultas evalúe muchos órdenes de magnitud más candidatos a planes de consultas de los necesarios. Este problema se solucionó en @apollo/query-planner v2.8.5, @apollo/gateway v2.8.5 y Apollo Router v1.52.1. Se recomienda a los usuarios que actualicen. Este problema se puede evitar asegurándose de que no haya campos que se puedan resolver en varios subgrafos. Si todos los subgrafos utilizan la Federación 2, puede confirmar que no se verá afectado asegurándose de que ninguno de sus esquemas de subgrafos utilice la directiva @shareable. --- TRUNCADO ----