L'entreprise Qualys a découvert deux vulnérabilités (CVE-2021-44731, CVE-2021-44730) dans l'outil snap-confine, livré avec le drapeau SUID root et appelé par le processus snapd pour créer un environnement d'exécution pour les applications fournies dans des paquets autonomes au format snap. Les vulnérabilités permettent à un utilisateur local non privilégié d'exécuter du code avec les droits root sur le système. Les problèmes ont été corrigés dans la mise à jour d'aujourd'hui des paquets snapd pour Ubuntu 21.10, 20.04 et 18.04.
La première vulnérabilité (CVE-2021-44730) permet une attaque via la manipulation de liens durs, mais nécessite de désactiver la protection système des liens durs (en définissant sysctl fs.protected_hardlinks sur 0). Le problème provient d'une vérification incorrecte de l'emplacement des exécutables des programmes auxiliaires snap-update-ns et snap-discard-ns, exécutés avec des droits root. Le chemin vers ces fichiers était calculé dans la fonction sc_open_snapd_tool() en fonction de son propre chemin depuis /proc/self/exe, ce qui permet de créer un lien dur vers snap-confine dans son propre répertoire et d'y placer ses propres versions des utilitaires snap-update-ns et snap-discard-ns. Après avoir exécuté snap-confine via le lien dur, il lancera dans le répertoire actuel les fichiers snap-update-ns et snap-discard-ns fournis par l'attaquant avec les droits root.
La deuxième vulnérabilité est causée par une condition de course et peut être exploitée dans la configuration par défaut d'Ubuntu Desktop. Pour que l'exploit fonctionne avec succès sur Ubuntu Server, il est nécessaire de choisir l'un des paquets de la section « Featured Server Snaps » lors de l'installation. La condition de course se manifeste dans la fonction setup_private_mount(), appelée lors de la préparation de l'espace de noms des points de montage pour le paquet snap. Cette fonction crée un répertoire temporaire « /tmp/snap.$SNAP_NAME/tmp » ou utilise déjà un répertoire existant pour le montage bind des répertoires pour le paquet au format snap.
Étant donné que le nom du répertoire temporaire est prévisible, un attaquant peut remplacer son contenu par un lien symbolique à un moment après la vérification des propriétaires, mais avant l'appel du système de mount. Par exemple, on peut créer dans le répertoire /tmp/snap.lxd un lien symbolique « /tmp/snap.lxd/tmp », pointant vers un répertoire arbitraire, et l'appel à mount() suivra le lien symbolique et montera le répertoire dans l'espace de noms snap. De cette manière, on peut monter son propre contenu dans /var/lib et organiser le montage de son répertoire /etc dans l'espace de noms du paquet snap pour charger sa bibliothèque avec des droits root en remplaçant /etc/ld.so.preload.
Il est noté que la création d'un exploit s'est avérée être une tâche non triviale, car l'outil snap-confine est écrit en Go en utilisant des techniques de programmation sûres, possède une protection basée sur des profils AppArmor, filtre les appels système à l'aide du mécanisme seccomp, et utilise des espaces de noms pour le montage. Néanmoins, les chercheurs ont réussi à préparer un exploit fonctionnel pour obtenir des droits root dans le système. Le code de l'exploit sera publié dans quelques semaines, après que les utilisateurs auront installé les mises à jour fournies.
Source : opennet.ru
