Apache AGE

Vulnerabilidades de Apache AGE de Apache Software Foundation

Vulnerabilidad CVE-2022-45786 de Apache AGE. Lista CVE de fallos de seguridad de Apache AGE.

5 de febrero del 2023

CVE-2022-45786: Hay problemas con los controladores AGE para Golang y Python que permiten que se produzcan inyecciones de SQL. Esto afecta a AGE para PostgreSQL 11 y AGE para PostgreSQL 12, todas las versiones hasta la 1.1.0 inclusive, cuando se usan esos controladores. La solución es actualizar a los controladores de Golang y Python más recientes, además de la última versión de AGE que se usa para PostgreSQL 11 o PostgreSQL 12.

La actualización de AGE agregará una nueva función para permitir la parametrización de la función cypher(), que , junto con las actualizaciones del controlador, resolverán este problema.

Antecedentes (para aquellos que desean más información): después de investigar a fondo este problema, descubrimos que, debido a la naturaleza de la función cypher(), no era fácil parametrizar los valores que se le pasaban.

Esto permitió inyecciones de SQL, si el desarrollador del controlador no tuvo cuidado. El desarrollador de los controladores Golang y Pyton no utilizó completamente la parametrización, probablemente debido a esto, lo que permitió las inyecciones de SQL.

La solución obvia a este problema es usar la parametrización en los controladores para todas las consultas de PG SQL.

Sin embargo, la parametrización de todas las consultas PG se complica por el hecho de que la llamada a la función cypher() en sí misma no se puede parametrizar directamente, ya que no es una función real.

Al menos, no los parámetros que tomarían el nombre del gráfico y la consulta de cifrado. La razón por la que la función cypher() no puede tener esos valores parametrizados es porque la función es un marcador de posición y en realidad nunca se ejecuta.

El nodo de la función cypher(), creado por PG en el árbol de consulta, se transforma y reemplaza con un árbol de consulta para la consulta de cifrado real durante la fase de análisis.

El problema es que los parámetros, que se pasarían y que la transformación de la función cypher() debe resolverse, solo se resuelven en la fase de ejecución, que es mucho más tarde. Dado que la transformación de la función cypher() necesita conocer el nombre del gráfico y la consulta de cifrado antes de la ejecución, no se pueden pasar como parámetros.

La solución que estamos probando en este momento, y que proponemos usar, es crear una función que se llamará antes de la ejecución de la transformación de la función cypher(). Esta nueva función permitirá pasar valores como parámetros para el nombre del gráfico y la consulta de cifrado. Como este comando se ejecutará antes de la transformación de la función cypher(), sus valores se resolverán. Estos valores se pueden almacenar en caché para que los use la transformación de la función cypher() inmediatamente siguiente. Como características adicionales, los valores en caché almacenarán el pid de la sesión de llamada, para su validación. Y, la transformación de la función cypher() borrará esta información almacenada en caché después de la invocación de la función, independientemente de si se usó o no. Este método permitirá la parametrización de la función cypher() indirectamente y proporcionará una forma de bloquear los ataques de inyección SQL.