
A finales de marzo de 2019, la compañía estadounidense Trustwave, que se dedica a servicios de ciberseguridad y protección contra amenazas, publicó un mensaje sobre una vulnerabilidad en el DBMS PostgreSQL, que está presente en todas las versiones a partir de PostgreSQL 9.3 a la versión 11.2. Esta vulnerabilidad se registró en la base de datos de vulnerabilidades de seguridad de la información CVE (Common Vulnerabilities and Exposures) con el número CVE-2019-9193 . Este mensaje causó un gran revuelo, porque de acuerdo con el sistema de calificación de vulnerabilidad CVSS (Common Vulnerability Scoring System), esta vulnerabilidad recibió una calificación de 9.0 en una escala de 10 puntos.
A las vulnerabilidades se les asignaron las siguientes características:
- Impacto de la confidencialidad (influencia en la confidencialidad): la divulgación completa de la información conduce a la divulgación de todos los archivos del sistema.
- Impacto de integridad (impacto en la integridad): una pérdida completa de la protección del sistema, como resultado, todo el sistema se ve comprometido.
- Impacto en la disponibilidad: la disponibilidad de un recurso no está disponible por completo.
- La complejidad del acceso es baja. El uso requiere muy poco conocimiento o habilidades.
- Autenticación: requiere que un atacante inicie sesión en el sistema, por ejemplo, a través de la línea de comandos o mediante una sesión de escritorio o una interfaz web.
- Acceso obtenido - no.
- Tipo (s) de vulnerabilidad (tipo de vulnerabilidad): ejecución de código.
Ahora veamos qué sucede realmente.
En 2013, se agregó una confirmación en PostgreSQL 9.3, que, similar al comando \ copy meta en psql, le permite mover datos entre las tablas de PostgreSQL y los archivos normales en el sistema de archivos. COPY TO copia el contenido de la tabla al archivo y COPY FROM - del archivo a la tabla (agrega datos a los que ya están en la tabla). A diferencia del metacomando \ copy, que se implementa en el cliente, el comando COPY..TO / FROM se implementa en el lado del servidor. El comando COPY tiene un parámetro opcional PROGRAM 'comando', que permite al servidor ejecutar el 'comando' y pasar la salida estándar al servidor PostgreSQL o viceversa. Fue este parámetro el que causó el pánico y el mensaje sobre la vulnerabilidad, ya que según Trustwave, este comando le permite ejecutar código arbitrario en el contexto del usuario del sistema operativo. Sin embargo, ¡esto es exactamente lo que pretendían los desarrolladores! En esta ocasión, hubo una publicación oficial del Grupo de Desarrollo Global de PostgreSQL (PGDG), así como correspondencia en la lista de correo general pgsql-general (CVE-2019-9193 sobre COPY FROM / TO PROGRAM ) y comentarios de desarrolladores líderes, por ejemplo Magnus Hagander, en su blog .
Pero para entender la esencia, los detalles son importantes. Esto es lo que dice la documentación sobre esto: " Tenga en cuenta que el comando se inicia a través del shell de comandos, por lo que si necesita pasar cualquier argumento a este comando desde una fuente no confiable, debe deshacerse cuidadosamente de todos los caracteres especiales que tienen un significado especial en el shell, o para cribarlos. Por razones de seguridad, es mejor limitarse a una línea de comando fija o al menos no permitir que los usuarios ingresen contenido arbitrario en ella ".
Además, la documentación dice que solo los superusuarios de la base de datos pueden ejecutar el comando COPIAR con un archivo o un comando externo, o (en la versión 11 apareció) miembros de los roles integrados pg_read_server_files, pg_write_server_files o pg_execute_server_program, ya que esto le permite leer / escribir cualquier archivo y ejecutar cualquier programas a los que el servidor tiene acceso. La ejecución de un comando en PROGRAM puede estar limitada por otros mecanismos de control de acceso que operan en el sistema operativo, por ejemplo SELinux.
Estructuralmente, no hay límite de seguridad entre el superusuario de la base de datos y el usuario del sistema operativo en cuyo nombre se ejecuta el proceso del servidor. Las funciones para COPY ... PROGRAM agregadas en PostgreSQL 9.3 no cambiaron nada de lo anterior, pero agregaron un nuevo comando dentro de los mismos límites de seguridad que ya existían. Por lo tanto, el servidor PostgreSQL no puede ejecutarse como el superusuario del sistema operativo (por ejemplo, root).
La funcionalidad COPY..TO / FROM ... PROGRAM proporciona posibilidades ilimitadas para la manipulación de datos, el procesamiento posterior de datos, la compresión de datos sobre la marcha, etc. Y prohibir el uso de herramientas tan útiles sería un error. En el blog de Michael Paquier se dan ejemplos del constructo COPY..TO / FROM ... PROGRAM.
Una conclusión importante que se desprende de esta historia es que al diseñar y crear bases de datos, es necesario recordar no solo las características funcionales, sino también la seguridad de la información y seguir las siguientes reglas:
Por lo tanto, descubrimos que CVE-2019-9193 no es una vulnerabilidad. Pero no debes relajarte. No se pierda información sobre actualizaciones y nuevas versiones menores que corrigen las vulnerabilidades identificadas , sin las cuales no puede hacer un solo proyecto grande.