
Une analyse approfondie de CVE 2023 38408, une vulnérabilité critique d'OpenSSH, incluant le contexte technique, l'exploitation dans des environnements contrôlés et les stratégies d'atténuation.
L'objectif de ce rapport est d'analyser CVE-2023-38408, une vulnérabilité critique réelle découverte dans OpenSSH, à la fois par une compréhension théorique et une simulation pratique. Le rapport explique les fondements techniques de la vulnérabilité, démontre comment elle peut être exploitée dans des environnements contrôlés et examine les mesures d'atténuation mises en œuvre.
Comprendre les vulnérabilités de sécurité réelles par la simulation pratique aide non seulement à protéger les systèmes, mais renforce également la sensibilisation des développeurs et des administrateurs système aux vecteurs d'attaque potentiels. L'analyse de ces vulnérabilités comble le fossé entre la théorie et la mise en œuvre pratique de la sécurité.
CVE-2023-38408 est une vulnérabilité qui affecte ssh-agent dans OpenSSH lorsque le support PKCS#11 est activé. Elle permet l'exécution de code à distance sur une machine cliente si l'utilisateur se connecte à un serveur compromis avec le transfert d'agent activé (ssh -A). Cette vulnérabilité a des implications graves pour tout système reposant sur OpenSSH pour l'authentification sécurisée.
| Détails CVE | Informations |
|---|---|
| CVE ID | CVE-2023-38408 |
| Score CVSS | 9.8 (Critique) |
| Versions affectées | OpenSSH < 9.3p2 |
| Vecteur d'attaque | Réseau |
| Privilèges requis | Aucun |
| Interaction utilisateur | Requis |
| Impact | Compromission complète du système |
SSH (Secure Shell) est un protocole réseau cryptographique utilisé pour les communications sécurisées sur des réseaux non sécurisés. Il fournit des canaux chiffrés pour la connexion à distance, l'exécution de commandes, le transfert de fichiers, etc.```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'est-ce que ssh-agent
`ssh-agent` est un processus d'arrière-plan qui stocke en mémoire vos clés SSH privées déchiffrées, vous permettant de les utiliser sans avoir à ressaisir les phrases de passe à chaque fois que vous vous connectez à un système distant.
#### Transfert d'agent (ssh -A)
Le transfert d'agent permet à un système distant d'accéder à votre `ssh-agent` local via un socket de domaine Unix. Cela est utile pour chaîner des connexions SSH, mais introduit des risques de sécurité importants si la machine distante est compromise.```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
Techniquement, lorsque vous utilisez ssh -A, le client SSH configure un socket de domaine Unix sur le serveur distant qui agit comme un proxy vers votre ssh-agent local. La variable d'environnement SSH_AUTH_SOCK est définie pour pointer vers ce socket proxy. Tous les appels effectués vers SSH_AUTH_SOCK sur le serveur distant sont renvoyés via la connexion SSH et traités par votre ssh-agent local.
PKCS#11 est une API standard pour interagir avec des jetons cryptographiques, tels que les cartes à puce, les YubiKeys, ou les modules de sécurité matériels virtuels (HSM).
| Fonction PKCS#11 | Objectif | Niveau de risque |
|---|---|---|
C_Initialize() | Initialiser la bibliothèque | Faible |
C_GetSlotList() | Lister les slots disponibles | Faible |
C_FindObjects() | Trouver les objets cryptographiques | Moyen |
C_Sign() | Signer des données | Élevé |
dlopen() | Charger la bibliothèque partagée | Critique |
Le ssh-agent d'OpenSSH prend en charge le chargement de fournisseurs PKCS#11 (bibliothèques partagées .so) à l'aide de la commande ssh-add -s /path/to/provider.so. Ces bibliothèques permettent à l'agent d'interagir avec des modules matériels ou logiciels sécurisés pour utiliser des clés privées sans les exposer directement.
En interne, lorsque ssh-add -s est appelé, il effectue les opérations suivantes :
.so est chargé dynamiquement en mémoire à l'aide de dlopen().C_Initialize(), C_GetSlotList(), C_FindObjects() et C_Sign() via l'API PKCS#11.| Attribut | Détails |
|---|---|
| ID | CVE-2023-38408 |
| Sévérité | Élevée (CVSS 9.8) |
| Chronologie | Divulgué en juillet 2023, corrigé dans OpenSSH 9.3p2 |
| Logiciel affecté | Versions d'OpenSSH antérieures à 9.3p2 avec support PKCS#11 |
| Complexité de l'attaque | Faible |
| Vecteur d'attaque | Réseau via le transfert d'agent SSH |
La vulnérabilité provient du fait que ssh-agent charge n'importe quel fichier objet partagé (.so) fourni via ssh-add -s, sans vérifier s'il s'agissait d'un fournisseur PKCS#11 légitime.```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 Analyse du flux d'attaque```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
Au niveau le plus bas, la séquence des événements comprend :