
Rapport technique et preuve de concept pour CVE-2020-15778, une vulnérabilité d'injection de commande authentifiée dans OpenSSH scp (<=8.3p1) permettant l'exécution de code à distance via des charges utiles (payloads) utilisant des guillemets inversés dans les chemins de fichiers.
Adresse e-mail : [email protected]
Linkedin : www.linkedin.com/in/chinmay-pandya
Produit : Openssh
Composant affecté : SCP
Version vulnérable : <=openssh-8.3p1
Version corrigée : -
Numéro CVE : CVE-2020-15778
Ligne vulnérable : https://github.com/openssh/openssh-portable/blob/a2855c048b3f4b17d8787bd3f24232ec0cd79abe/scp.c#L989
Type de vulnérabilité : Injection de commande / Injection eval (Authentifié)
Type d'attaque : Attaque à distance
Chronologie de la divulgation :
- Problème découvert - 9 juin 2020
- CVE obtenu - 16 juillet 2020
- Fournisseur notifié - 9 juin 2020
- Accusé de réception du fournisseur reçu - 9 juin 2020
- Divulgation publique le 18 juillet 2020
scp est un programme de copie de fichiers entre ordinateurs. Il utilise le protocole SSH. Il est inclus par défaut dans la plupart des distributions Linux et Unix.
Lors de la copie de fichiers vers un serveur distant, le chemin du fichier est ajouté à la fin de la commande scp locale. Par exemple, si vous exécutez la commande suivante
scp SourceFile user@host:directory/TargetFile
cela exécutera une commande locale
scp -t directory/TargetFile
Lors de la création de la commande scp locale, elle ne nettoie pas le nom de fichier. Un attaquant peut passer une charge utile avec backtick comme nom de fichier et lorsque la commande scp locale est exécutée, le shell local exécutera également la charge utile avec backtick.
Exécutez la commande suivante avec scp
scp /sourcefile remoteserver:'`touch /tmp/exploit.sh`/targetfile'
Après avoir exécuté cette commande, allez sur le serveur distant et vous verrez dans le répertoire /tmp/ que le fichier exploit.sh est présent. Mettre des guillemets simples dans le nom de fichier est important pour empêcher l'exécution de la charge utile sur le shell local, ou utiliser un caractère d'échappement comme les guillemets simples dans le nom de fichier peut empêcher l'exécution de la charge utile sur le shell local.
CECI EST UNE EXPLOITATION AUTHENTIFIÉE ET NÉCESSITE DES IDENTIFIANTS SSH / SCP VALIDES POUR EXÉCUTER UNE COMMANDE SUR LE SERVEUR DISTANT
La commande scp est un protocole historique (appelé rcp) qui repose sur ce style de passage d'arguments et rencontre des problèmes d'expansion. Il s'est avéré très difficile d'ajouter de la « sécurité » au modèle scp. Toutes les tentatives de « détecter » et « prévenir » les transferts d'arguments anormaux ont de grandes chances de casser les flux de travail existants. Oui, nous reconnaissons que la situation est mauvaise. Mais nous ne voulons pas casser les modèles simples que les gens utilisent pour scp, jusqu'à ce qu'il existe un remplacement courant. Les gens devraient utiliser rsync ou autre chose à la place s'ils sont inquiets.
Code pour SCP - https://github.com/openssh/openssh-portable/blob/master/scp.c