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
Herramientas/GitHubGitHub/sivaadityacoder/cve-2026-22038
Análisis de VulnerabilidadesAnálisis de CódigoDetección de SecretosAprendizaje y EducaciónAnálisis de Registros
GitHubsivaadityacoder/cve-2026-22038

CVE-2026-22038

Análisis detallado de CVE-2026-22038, una vulnerabilidad de alta gravedad en los bloques AutoGPT Stagehand que registra claves API en texto plano, incluyendo la causa raíz, el impacto y la remediación.

Ver Repositorio
hace 4 mesesAún no revisado

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

CVE-2026-22038 — AutoGPT Stagehand Blocks Registran Claves API en Texto Plano

ID CVE: CVE-2026-22038
Producto: Plataforma AutoGPT (integración Stagehand)
Versiones afectadas: Todas las versiones hasta autogpt-platform-beta-v0.6.45 inclusive
Corregido en: autogpt-platform-beta-v0.6.46
Tipo de vulnerabilidad: CWE-532 — Inserción de Información Sensible en Archivos de Registro
Gravedad: Alta
Reportado por: Panuganti Siva Aditya (@sivaadityacoder)
Fecha del informe: 19 de diciembre de 2025
Aviso de GitHub: GHSA-rc89-6g7g-v5v7


Mi Enfoque

AutoGPT es una plataforma de código abierto que permite a los usuarios construir y ejecutar agentes de IA autónomos. Incluye una integración Stagehand que se conecta a la automatización de navegadores y proveedores de LLM como OpenAI, Anthropic y Groq.

Durante una revisión de código de los bloques Stagehand, noté que los objetos de credenciales se pasaban directamente a las llamadas logger.info(). Rastreé cada declaración de registro y descubrí que se llamaba a en línea — omitiendo explícitamente la protección que proporciona Pydantic.

.get_secret_value()
SecretStr

El archivo vulnerable:

root@kitploit:~
autogpt_platform/backend/backend/blocks/stagehand/blocks.py

Tres bloques están afectados, cada uno con el mismo patrón:

StagehandObserveBlock (Líneas 185–188)

root@kitploit:~
logger.info(f"OBSERVE: Stagehand credentials: {stagehand_credentials}")
logger.info(
    f"OBSERVE: Model credentials: {model_credentials} for provider "
    f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)

StagehandActBlock (Líneas 285–288)

root@kitploit:~
logger.info(f"ACT: Stagehand credentials: {stagehand_credentials}")
logger.info(
    f"ACT: Model credentials: {model_credentials} for provider "
    f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)

StagehandExtractBlock (Líneas 373–376)

root@kitploit:~
logger.info(f"EXTRACT: Stagehand credentials: {stagehand_credentials}")
logger.info(
    f"EXTRACT: Model credentials: {model_credentials} for provider "
    f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)

Para confirmar la explotabilidad, ejecuté cada bloque Stagehand con credenciales válidas y busqué en los registros de la aplicación:

root@kitploit:~
grep "secret:" /var/log/autogpt/application.log

La salida confirmó que las claves API reales aparecían en texto plano:

root@kitploit:~
[INFO] OBSERVE: Model credentials: ... secret: sk-proj-abc123xyz789...
[INFO] ACT: Model credentials: ... secret: sk-ant-api03-def456uvw...
[INFO] EXTRACT: Model credentials: ... secret: sk-1234567890abcdef...

Causa Raíz

El código de AutoGPT utiliza correctamente el tipo SecretStr de Pydantic para las claves API. Cuando un objeto SecretStr se incluye en una f-string o se imprime normalmente, se muestra como ********** — esa protección es intencional.

La causa raíz es que los desarrolladores llamaron a .get_secret_value() directamente dentro de las declaraciones logger.info(). Esto desempaqueta explícitamente el secreto y pasa el valor de cadena sin procesar al registrador, omitiendo por completo el enmascaramiento integrado de SecretStr.

El nivel de registro es INFO, lo que significa que estas declaraciones se ejecutan en entornos de producción normales — no solo en sesiones de depuración locales. Cada vez que uno de estos bloques se ejecuta con credenciales, el secreto se escribe en el archivo de registro.


Impacto

  • Robo de credenciales — claves API en texto plano en archivos de registro accesibles para cualquiera con acceso a los registros
  • Daño financiero — las claves robadas se utilizan para realizar costosas llamadas API a costa de la víctima
  • Acceso a datos — las credenciales robadas pueden otorgar acceso a los datos de la víctima en esos servicios
  • Agotamiento de cuotas — un atacante puede agotar deliberadamente los límites de tasa para denegar el servicio
  • Ventana de exposición prolongada — los archivos de registro a menudo se conservan durante 30–90 días, por lo que una clave utilizada una vez podría permanecer expuesta durante meses
  • Problemas de cumplimiento — registrar secretos viola los requisitos de PCI-DSS, SOC 2 y GDPR

Escenario de ataque:

  1. Un atacante obtiene acceso de lectura a los archivos de registro mediante un sistema de agregación mal configurado (Splunk, ELK, Datadog, CloudWatch), una cuenta de monitoreo comprometida o acceso interno excesivo.
  2. Busca en los registros patrones como secret:, sk-proj- o sk-ant-.
  3. Extrae las claves API reales de la salida de los registros.
  4. Verifica la clave:
root@kitploit:~
curl https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer sk-proj-abc123xyz789..." \
  -H "Content-Type: application/json" \
  -d '{"model": "gpt-4", "messages": [{"role": "user", "content": "test"}]}'
  1. Con una clave válida puede realizar llamadas API, agotar cuotas o acceder a los datos de la víctima.

Credenciales expuestas: claves API de Stagehand / Browserbase, claves API de OpenAI, claves API de Anthropic, claves API de Groq y cualquier credencial de proveedor de LLM configurada en los bloques Stagehand.


Corrección

El parche en autogpt-platform-beta-v0.6.46 elimina las llamadas a .get_secret_value() de las declaraciones logger.info().

Enfoque recomendado — eliminar el secreto del registro por completo:

root@kitploit:~
# Antes (vulnerable):
logger.info(
    f"OBSERVE: Model credentials: {model_credentials} for provider "
    f"{model_credentials.provider} secret: {model_credentials.api_key.get_secret_value()}"
)

# Después (corregido):
logger.info(
    f"OBSERVE: Model credentials for provider {model_credentials.provider} (API key redacted)"
)

Alternativa — redactar, manteniendo la estructura del registro intacta:

root@kitploit:~
def redact_secret(value: str) -> str:
    if len(value) <= 8:
        return "***"
    return f"{value[:4]}...{value[-4:]}"

logger.info(
    f"OBSERVE: Model credentials for provider {model_credentials.provider} "
    f"secret: {redact_secret(model_credentials.api_key.get_secret_value())}"
)

El enfoque de redacción expone solo los primeros y últimos 4 caracteres — suficiente para identificar qué clave se utilizó sin revelar el secreto completo.


Conclusiones Clave

  1. Nunca llames a .get_secret_value() en declaraciones de registro. Si tu framework te proporciona un tipo de enmascaramiento de secretos (SecretStr, SecretBytes, etc.), deja que haga su trabajo. Llamar al método de desempaquetado dentro de un registrador anula todo el propósito.

  2. INFO es registro a nivel de producción. Los volcados de credenciales estilo depuración nunca deberían llegar a INFO. Si realmente necesitas confirmar qué credenciales están activas, registra solo metadatos no sensibles (nombre del proveedor, prefijo de la clave, últimos 4 caracteres).

  3. Los archivos de registro son una superficie de ataque. Trátalos como cualquier otro almacén de datos sensibles — restringe el acceso, rótalos y audita lo que entra. Las herramientas de agregación (Splunk, ELK, Datadog) a menudo tienen acceso de lectura amplio, por lo que un secreto en cualquier línea de registro es efectivamente un secreto también en esos sistemas.

  4. La corrección siempre es más simple que el error. Eliminar dos líneas de registro (o reemplazarlas con equivalentes redactados) cierra por completo esta exposición. La deuda de seguridad por "registro de depuración temporal" dejado en producción es común y prevenible con revisión de código.

  5. Las protecciones de SecretStr son opcionales, no automáticas. Los desarrolladores deben entender que la protección solo se mantiene mientras nadie desempaquete explícitamente el valor. La revisión de código debería marcar cualquier uso de .get_secret_value() fuera de la ruta de autenticación.


Cronología

FechaEvento
19 de diciembre de 2025Reportado a los mantenedores de AutoGPT mediante Huntr y el Aviso de Seguridad de GitHub
2025–2026El mantenedor Nicholas Tindle reconoció el informe
Antes de abril de 2026Corregido en autogpt-platform-beta-v0.6.46
25 de abril de 2026Asignado CVE-2026-22038

Referencias

  • Aviso de Seguridad de GitHub GHSA-rc89-6g7g-v5v7
  • CWE-532: Inserción de Información Sensible en Archivos de Registro
  • Hoja de Referencia de Registro de OWASP
  • Entrada de la Base de Datos CVE de Trickest
Descargar herramienta