flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation
CVE-2023-2640 : LPE OverlayFS Ubuntu
CVE-2023-2640 contourne les permissions OverlayFS sur certains noyaux Ubuntu. Vérifiez la variante du noyau et installez le correctif.
Imaginez un bâtiment où un employé vérifie si quelqu’un peut apposer un sceau officiel sur un document. Un raccourci local devait ignorer ces contrôles uniquement pour les étiquettes de maintenance du bâtiment. Une modification ultérieure a fait passer toutes les demandes de sceau par ce raccourci, y compris les sceaux de sécurité restreints. Le correctif rétablit le contrôle normal des permissions dans le user namespace du système de fichiers monté.
Concepts Clés et Termes
OverlayFS- OverlayFS est un système de fichiers union Linux qui présente les fichiers d’une couche inférieure et écrit les modifications dans une couche supérieure.
Extended attribute (xattr)- Un attribut étendu (xattr) est une métadonnée associée à un objet du système de fichiers. Les modules de sécurité Linux et les capacités de fichiers utilisent des namespaces xattr spécifiques.
ovl_do_setxattr()- Helper OverlayFS qui écrit un xattr dans un objet de la couche supérieure. Le wrapper affecté utilisait trop largement une fonction VFS sans contrôle de permission.
Copy-up- Opération OverlayFS qui crée une copie dans la couche supérieure lorsqu’une écriture exige une copie modifiable de l’objet inférieur.
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-863
Analyse de Cause Racine
La fiche CVE Ubuntu indique que la configuration vulnérable nécessite à la fois le commit upstream c914c0e27eb0 et le patch SAUCE Ubuntu « Skip permission checking for trusted.overlayfs.* xattrs ». Ce patch a modifié les wrappers xattr d’OverlayFS pour utiliser des fonctions VFS _noperm, afin d’ignorer les contrôles uniquement pour les métadonnées internes trusted.overlayfs.*. Après la modification upstream des wrappers, le helper a également servi pour d’autres xattrs ; un utilisateur local non privilégié pouvait donc définir des attributs étendus privilégiés sur des fichiers montés et les faire copier dans la couche supérieure sans contrôles appropriés. Le correctif Canonical rétablit le chemin avec vérification et appelle vfs_setxattr() avec le user namespace du montage supérieur. Il s’agit d’une élévation locale propre au noyau Ubuntu ; l’exposition dépend de la version, de la variante du noyau et des politiques de namespace et de montage.
Déroulement de l'Attaque Étape par Étape
Configuration de noyau Ubuntu concernée
Le noyau doit contenir c914c0e27eb0 et le patch SAUCE Ubuntu qui ignore les contrôles pour les xattrs trusted.overlayfs.*. Le numéro upstream seul ne suffit pas à établir l’exposition.
Un utilisateur local atteint le chemin xattr
Un utilisateur local non privilégié doit pouvoir atteindre le chemin OverlayFS concerné selon les politiques de namespace et de montage de l’hôte. Ubuntu décrit une attaque locale.
Le contournement s’étend aux autres xattrs
Le wrapper modifié dirigeait les mises à jour xattr vers des helpers _noperm, prévus pour les métadonnées internes d’OverlayFS. La modification upstream a aussi exposé d’autres xattrs à l’absence de contrôle approprié.
Un attribut privilégié atteint la couche supérieure
Ubuntu indique que des attributs étendus privilégiés pouvaient être définis sur des fichiers montés puis copiés dans la couche supérieure sans contrôle requis, avec un risque d’élévation locale. Toutes les configurations ne sont pas équivalentes.
Code Source : Vulnérable vs Sécurisé
Le chemin SAUCE affecté appelait __vfs_setxattr_noperm() pour tous les xattrs après qu’une modification upstream en a élargi la portée. Le correctif utilise vfs_setxattr() avec le user namespace du montage supérieur et rétablit les contrôles VFS normaux. Il s’agit d’un extrait ciblé du patch Canonical, sans les journaux de débogage environnants.
Extrait source: fs/overlayfs/overlayfs.h
/* Contexte du correctif Ubuntu de référence avant l’annulation du changement SAUCE. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
const char *name, const void *value,
size_t size, int flags)
{
struct inode *inode = dentry->d_inode;
int err;
inode_lock(inode);
err = __vfs_setxattr_noperm(&init_user_ns, dentry, name,
value, size, flags);
inode_unlock(inode);
return err;
}
/* Correctif Ubuntu de référence : rétablir l’enveloppe VFS qui vérifie les permissions. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
const char *name, const void *value,
size_t size, int flags)
{
int err = vfs_setxattr(ovl_upper_mnt_userns(ofs), dentry, name,
value, size, flags);
return err;
}
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓Consultez la fiche CVE Ubuntu pour la version, la variante de noyau et le paquet exacts ; le problème dépend d’une combinaison précise de changements Ubuntu et upstream.
- ✓Installez le paquet de noyau corrigé pour la version et la variante Ubuntu concernées, redémarrez, puis vérifiez le noyau actif.
- ✓Si la mise à jour doit attendre et que la charge le permet, évaluez la mesure temporaire documentée par Ubuntu pour limiter la création de user namespaces non privilégiés ; testez l’impact sur applications et conteneurs.
- ✓Dans les wrappers xattr d’OverlayFS, utilisez les API VFS avec contrôle de permission et le user namespace du montage correct pour les attributs contrôlés par l’utilisateur ; réservez les helpers sans contrôle aux métadonnées internes dûment justifiées.