
Un análisis en profundidad de CVE 2023 38408, una vulnerabilidad crítica de OpenSSH, que incluye antecedentes técnicos, explotación en entornos controlados y estrategias de mitigación.
El propósito de este informe es analizar CVE-2023-38408, una vulnerabilidad crítica del mundo real descubierta en OpenSSH, mediante la comprensión teórica y la simulación práctica. El informe explica los fundamentos técnicos de la vulnerabilidad, demuestra cómo puede ser explotada en entornos controlados y examina las medidas de mitigación implementadas.
Comprender las vulnerabilidades de seguridad del mundo real a través de la simulación práctica no solo ayuda a proteger los sistemas, sino que también fortalece la conciencia de los desarrolladores y administradores de sistemas sobre posibles vectores de ataque. Analizar dichas vulnerabilidades cierra la brecha entre la teoría y la implementación práctica de la seguridad.
CVE-2023-38408 es una vulnerabilidad que afecta a ssh-agent en OpenSSH cuando el soporte PKCS#11 está habilitado. Permite la ejecución remota de código en una máquina cliente si el usuario se conecta a un servidor comprometido con el reenvío de agente habilitado (ssh -A). Esta vulnerabilidad tiene graves implicaciones para cualquier sistema que dependa de OpenSSH para la autenticación segura.
| Detalles de CVE | Información |
|---|---|
| ID de CVE | CVE-2023-38408 |
| Puntuación CVSS | 9.8 (Crítico) |
| Versiones Afectadas | OpenSSH < 9.3p2 |
| Vector de Ataque | Red |
| Privilegios Requeridos | Ninguno |
| Interacción del Usuario | Requerida |
| Impacto | Compromiso total del sistema |
SSH (Secure Shell) es un protocolo de red criptográfico utilizado para la comunicación segura a través de redes no seguras. Proporciona canales cifrados para inicio de sesión remoto, ejecución de comandos, transferencia de archivos y más.```mermaid graph LR A[SSH Client] -->|Encrypted Connection| B[SSH Server] A -->|Authentication| C[ssh-agent] C -->|Private Keys| D[Key Store] B -->|Agent Forwarding| E[Remote ssh-agent Proxy]
### 2.2 Qué es ssh-agent
`ssh-agent` es un proceso en segundo plano que almacena tus claves SSH privadas descifradas en la memoria, permitiéndote usarlas sin tener que volver a introducir las frases de contraseña cada vez que te conectas a un sistema remoto.
#### Reenvío del agente (ssh -A)
El reenvío del agente permite que un sistema remoto acceda a tu `ssh-agent` local a través de un socket de dominio Unix. Esto es útil para encadenar conexiones SSH, pero introduce riesgos de seguridad significativos si la máquina remota está comprometida.```mermaid
sequenceDiagram
participant Client as SSH Client
participant Agent as ssh-agent
participant Server as Remote Server
participant Proxy as Agent Proxy
Client->>Agent: Start agent
Client->>Server: ssh -A user@server
Server->>Proxy: Create proxy socket
Note over Server,Proxy: SSH_AUTH_SOCK=/tmp/ssh-xxx/agent.xxx
Server->>Proxy: ssh-add request
Proxy->>Client: Forward request
Client->>Agent: Process request
Agent->>Client: Response
Client->>Proxy: Forward response
Proxy->>Server: Final response
Técnicamente, cuando usas ssh -A, el cliente SSH crea un socket de dominio Unix en el servidor remoto que actúa como un proxy hacia tu ssh-agent local. La variable de entorno SSH_AUTH_SOCK se configura para apuntar a este socket proxy. Cualquier llamada realizada a SSH_AUTH_SOCK en el servidor remoto se reenvía de vuelta a través de la conexión SSH y es procesada por tu ssh-agent local.
PKCS#11 es una API estándar para interactuar con tokens criptográficos, como tarjetas inteligentes, YubiKeys o módulos de seguridad de hardware virtuales (HSM).
| Función PKCS#11 | Propósito | Nivel de Riesgo |
|---|---|---|
C_Initialize() | Inicializar la librería | Bajo |
C_GetSlotList() | Listar slots disponibles | Bajo |
C_FindObjects() | Encontrar objetos criptográficos | Medio |
C_Sign() | Firmar datos | Alto |
dlopen() | Cargar librería compartida | Crítico |
El ssh-agent de OpenSSH soporta la carga de proveedores PKCS#11 (librerías compartidas .so) mediante el comando ssh-add -s /path/to/provider.so. Estas librerías permiten que el agente interactúe con módulos de hardware o software seguros para usar claves privadas sin exponerlas directamente.
Internamente, cuando se ejecuta ssh-add -s, se realiza lo siguiente:
.so se carga dinámicamente en memoria usando dlopen().C_Initialize(), C_GetSlotList(), C_FindObjects() y C_Sign() a través de la API PKCS#11.| Atributo | Detalles |
|---|---|
| ID | CVE-2023-38408 |
| Severidad | Alta (CVSS 9.8) |
| Cronología | Divulgada en julio de 2023, corregida en OpenSSH 9.3p2 |
| Software Afectado | Versiones de OpenSSH anteriores a 9.3p2 con soporte PKCS#11 |
| Complejidad de Ataque | Baja |
| Vector de Ataque | Red a través de reenvío del agente SSH |
La vulnerabilidad se origina porque ssh-agent carga cualquier archivo de objeto compartido (.so) proporcionado mediante ssh-add -s, sin validar si se trataba de un proveedor PKCS#11 legítimo.```mermaid
graph TD
A[Attacker sends ssh-add -s malicious.so] --> B[Request forwarded to victim's ssh-agent]
B --> C[ssh-agent calls dlopen on malicious.so]
C --> D[Constructor function executes immediately]
D --> E[Arbitrary code runs on victim machine]
### 3.3 Análisis del Flujo de Ataque```mermaid
sequenceDiagram
participant V as Victim
participant A as Attacker
participant Agent as ssh-agent
participant Lib as Malicious .so
V->>A: ssh -A attacker@host
Note over V,A: Agent forwarding enabled
A->>Agent: ssh-add -s /path/to/malicious.so
Agent->>Lib: dlopen("/path/to/malicious.so")
Note over Lib: Constructor executes
Lib->>V: Malicious code runs
Note over V: System compromised
En el nivel más bajo, la secuencia de eventos incluye: