
Un'analisi approfondita di CVE 2023 38408, una vulnerabilità critica di OpenSSH, che include il background tecnico, lo sfruttamento in ambienti controllati e le strategie di mitigazione.
Lo scopo di questo rapporto è analizzare CVE-2023-38408, una critica vulnerabilità reale scoperta in OpenSSH, attraverso sia la comprensione teorica che la simulazione pratica. Il rapporto spiega le basi tecniche della vulnerabilità, dimostra come può essere sfruttata in ambienti controllati ed esamina le misure di mitigazione implementate.
Comprendere le vulnerabilità di sicurezza reali attraverso la simulazione pratica non solo aiuta a proteggere i sistemi, ma rafforza anche la consapevolezza degli sviluppatori e degli amministratori di sistema riguardo ai potenziali vettori di attacco. Analizzare tali vulnerabilità colma il divario tra teoria e implementazione pratica della sicurezza.
CVE-2023-38408 è una vulnerabilità che colpisce ssh-agent in OpenSSH quando il supporto PKCS#11 è abilitato. Consente l'esecuzione remota di codice su una macchina client se l'utente si connette a un server compromesso con il forwarding dell'agente abilitato (ssh -A). Questa vulnerabilità ha gravi implicazioni per qualsiasi sistema che si affidi a OpenSSH per l'autenticazione sicura.
| Dettagli CVE | Informazioni |
|---|---|
| CVE ID | CVE-2023-38408 |
| Punteggio CVSS | 9.8 (Critico) |
| Versioni affette | OpenSSH < 9.3p2 |
| Vettore d'attacco | Rete |
| Privilegi richiesti | Nessuno |
| Interazione utente | Richiesta |
| Impatto | Compromissione completa del sistema |
SSH (Secure Shell) è un protocollo di rete crittografico utilizzato per comunicazioni sicure su reti non sicure. Fornisce canali crittografati per accesso remoto, esecuzione di comandi, trasferimento file e altro.```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 Cos'è ssh-agent
`ssh-agent` è un processo in background che memorizza in memoria le chiavi SSH private decifrate, consentendo di utilizzarle senza dover reinserire le passphrase ogni volta che ci si connette a un sistema remoto.
#### Agent Forwarding (ssh -A)
L'Agent Forwarding permette a un sistema remoto di accedere al `ssh-agent` locale tramite un socket di dominio Unix. È utile per concatenare connessioni SSH, ma introduce rischi significativi per la sicurezza se la macchina remota viene compromessa.```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
Tecnicamente, quando usi ssh -A, il client SSH crea un socket di dominio Unix sul server remoto che funge da proxy per il tuo ssh-agent locale. La variabile d'ambiente SSH_AUTH_SOCK viene impostata per puntare a questo socket proxy. Qualsiasi chiamata fatta a SSH_AUTH_SOCK sul server remoto viene inoltrata indietro attraverso la connessione SSH e processata dal tuo ssh-agent locale.
PKCS#11 è un'API standard per interagire con token crittografici, come smartcard, YubiKey o moduli di sicurezza hardware virtuali (HSM).
| Funzione PKCS#11 | Scopo | Livello di Rischio |
|---|---|---|
C_Initialize() | Inizializza la libreria | Basso |
C_GetSlotList() | Elenca gli slot disponibili | Basso |
C_FindObjects() | Trova oggetti crittografici | Medio |
C_Sign() | Firma i dati | Alto |
dlopen() | Carica libreria condivisa | Critico |
L'ssh-agent di OpenSSH supporta il caricamento di provider PKCS#11 (librerie condivise .so) usando il comando ssh-add -s /path/to/provider.so. Queste librerie permettono all'agente di interagire con moduli hardware o software sicuri per utilizzare chiavi private senza esporle direttamente.
Sotto il cofano, quando si chiama ssh-add -s, viene eseguito quanto segue:
.so viene caricato dinamicamente in memoria usando dlopen().C_Initialize(), C_GetSlotList(), C_FindObjects() e C_Sign() tramite l'API PKCS#11.| Attributo | Dettagli |
|---|---|
| ID | CVE-2023-38408 |
| Gravità | Alto (CVSS 9.8) |
| Tempistica | Divulgato a luglio 2023, risolto in OpenSSH 9.3p2 |
| Software Affetto | Versioni di OpenSSH precedenti alla 9.3p2 con supporto PKCS#11 |
| Complessità Attacco | Bassa |
| Vettore Attacco | Rete tramite forwarding dell'agente SSH |
La vulnerabilità deriva dal fatto che ssh-agent carica qualsiasi file oggetto condiviso (.so) fornito tramite ssh-add -s, senza verificare che si tratti di un provider PKCS#11 legittimo.```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 Analisi del Flusso di Attacco```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
Al livello più basso, la sequenza di eventi include:
ssh-add -s /path/to/lib.sossh-agent locale riceve questa richiesta e chiama ciecamente dlopen("/path/to/lib.so", RTLD_NOW).so ha una funzione costruttore (__attribute__((constructor))), questa viene eseguita immediatamente al caricamento