FlawOpen

flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation

● CVE-2023-2640 · CVSS 7.8 · Haute
Recherche · FlawOpen

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.

💡 Explication en Langage Simple (ELI5)

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

Étape 1

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.

Étape 2

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.

Étape 3

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é.

Étape 4

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

IMPLÉMENTATION VULNÉRABLE
/* 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;
}
PATCH SÉCURISÉ ET ROBUSTE
/* 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

Sources