Injection de commande dans le dom0 de Qubes OS via le rapport d'erreur de qvm-copy-to-vm
L'équipe de Qubes OS a publié le bulletin de sécurité QSB-118 révélant une vulnérabilité critique dans le mécanisme de copie de fichiers. Un qube compromis peut exécuter des commandes arbitraires dans dom0, le domaine d'administration privilégié du système. La faille découle d'un assainissement incomplet des noms de fichiers combiné à l'utilisation de la fonction C system().
Fil « Avis de sécurité pour l'exécution de code arbitraire dans QubesOS »

Un problème de sécurité critique identifié sous la référence QSB-118 touche toutes les versions de Qubes OS (système d'exploitation basé sur l'isolation par machines virtuelles). La vulnérabilité réside dans l'outil qvm-copy-to-vm, utilisé pour transférer des fichiers depuis dom0 (le domaine d'administration privilégié contrôlant l'hyperviseur) vers un qube (une machine virtuelle isolée). Si un utilisateur tente de copier un fichier vers une VM compromise, cette dernière peut exploiter le canal de retour d'erreur pour prendre le contrôle total du système.
Une désinfection insuffisante des entrées non fiables
Le transfert s'appuie sur le protocole « qfile », un format d'archive simplifié qui inclut une confirmation finale renvoyée par la VM cible vers la source. Ce message contient un code d'erreur et le nom du dernier fichier traité. Lorsqu'une erreur survient, dom0 tente de nettoyer ce nom de fichier distant via la fonction sanitize_remote_filename() avant d'afficher un dialogue graphique d'alerte.
L'analyse du code source montre l'origine du problème : la désinfection se contente de remplacer les guillemets doubles (") et les caractères non-ASCII par des tirets bas (_), tout en laissant intacts les métacaractères du shell (comme les guillemets simples ou les points-virgules) :
static void sanitize_remote_filename(char *untrusted_filename)
{
for (; *untrusted_filename; ++untrusted_filename) {
if (*untrusted_filename < ' ' ||
*untrusted_filename > '~' ||
*untrusted_filename == '"')
*untrusted_filename = '_';
}
}
Ensuite, la fonction display_error() formate une chaîne de commande destinée à kdialog ou zenity et l'exécute en appelant system() (une fonction C qui passe une chaîne d'instructions directement à un interpréteur shell). Un nom de fichier spécialement conçu par la VM cible peut alors casser l'encadrement en guillemets simples et injecter des commandes arbitraires exécutées par dom0.
Différence d'implémentation et correctif
Il est à noter que l'agent exécuté au sein des VM cibles (core-agent-linux) n'est pas affecté. Sa version de la fonction d'affichage d'erreur utilise directement l'appel système execlp() pour lancer l'interface graphique sans passer par un shell (system()), ce qui neutralise le risque d'injection.
Pour combler cette faille dans dom0, l'équipe du projet met à disposition un paquet de correctif :
- Paquet concerné :
qubes-core-dom0-linuxen version 4.3.22 (pour Qubes OS 4.3) - Action requise : effectuer une mise à jour standard du système dom0 via l'outil Qubes Update ou sa ligne de commande.