FlawOpen

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

● CVE-2023-2640 · CVSS 7.8 · Hoch
Sicherheitsforschung · FlawOpen

CVE-2023-2640: LPE in Ubuntu-OverlayFS

CVE-2023-2640 umgeht Berechtigungsprüfungen in bestimmten Ubuntu-OverlayFS-Kerneln. Prüfen Sie Kernelvariante und Anbieter-Patch.

💡 Einfache Erklärung (ELI5)

Stellen Sie sich ein Gebäude vor, in dem ein Mitarbeiter prüft, ob jemand ein amtliches Siegel auf ein Dokument setzen darf. Ein lokaler Schnellweg sollte Prüfungen nur für interne Wartungsetiketten umgehen. Eine spätere Änderung leitete alle Siegelanfragen über diesen Weg, auch eingeschränkte Sicherheitssiegel. Der Fix stellt die normale Berechtigungsprüfung im User-Namespace des eingehängten Dateisystems wieder her.

Kernkonzepte & Begriffe

OverlayFS
OverlayFS ist ein Linux-Union-Dateisystem, das Dateien aus einer unteren Ebene präsentiert und Änderungen in eine obere Ebene schreibt.
Extended attribute (xattr)
Ein erweitertes Attribut (xattr) sind Metadaten an einem Dateisystemobjekt. Linux-Sicherheitsmodule und Dateifähigkeiten verwenden bestimmte xattr-Namespaces.
ovl_do_setxattr()
OverlayFS-Helper zum Schreiben eines xattr in ein Objekt der oberen Ebene. Der betroffene Wrapper nutzte zu breit eine VFS-Funktion ohne Berechtigungsprüfung.
Copy-up
OverlayFS-Vorgang, der eine Kopie in der oberen Ebene anlegt, wenn ein Schreibzugriff eine beschreibbare Kopie des unteren Objekts benötigt.

Framework-Zuordnungen

  • CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-863

Ursachenanalyse

Laut Ubuntu-CVE-Eintrag erfordert die verwundbare Konfiguration sowohl den Upstream-Commit c914c0e27eb0 als auch den Ubuntu-SAUCE-Patch „Skip permission checking for trusted.overlayfs.* xattrs“. Dieser Patch änderte OverlayFS-xattr-Wrapper so, dass sie VFS-Funktionen mit _noperm nutzten; Prüfungen sollten nur für interne trusted.overlayfs.*-Metadaten entfallen. Nach der Upstream-Änderung am Wrapper wurde der Helper auch für andere xattrs verwendet. Dadurch konnte ein lokaler Benutzer ohne Privilegien privilegierte erweiterte Attribute auf eingehängten Dateien setzen und sie ohne passende Prüfungen in die obere Ebene übernehmen lassen. Canonicals Fix nimmt den breiten Pfad ohne Berechtigungsprüfung zurück und ruft vfs_setxattr() mit dem User-Namespace des oberen Mounts auf. Es handelt sich um eine lokale Rechteausweitung speziell im Ubuntu-Kernel; die Betroffenheit hängt von Release, Kernelvariante sowie Namespace- und Mount-Richtlinien ab.

Schritt-für-Schritt Angriffsablauf

Schritt 1

Betroffene Ubuntu-Kernelkonfiguration

Der Kernel muss sowohl c914c0e27eb0 als auch den Ubuntu-SAUCE-Patch zum Überspringen der Prüfungen für trusted.overlayfs.*-xattrs enthalten. Die Upstream-Versionsnummer allein belegt keine Betroffenheit.

Schritt 2

Lokaler Benutzer erreicht den xattr-Pfad

Ein lokaler Benutzer ohne Privilegien muss den betroffenen OverlayFS-Pfad gemäß den Namespace- und Mount-Richtlinien des Hosts nutzen können. Ubuntu beschreibt einen lokalen Angriff.

Schritt 3

Berechtigungsumgehung betrifft weitere xattrs

Der geänderte Wrapper leitete xattr-Änderungen an _noperm-Helper weiter, die für interne OverlayFS-Metadaten gedacht waren. Durch die Upstream-Änderung konnten auch andere xattrs die passenden Prüfungen umgehen.

Schritt 4

Privilegiertes Attribut erreicht die obere Ebene

Ubuntu zufolge konnten privilegierte erweiterte Attribute ohne erforderliche Prüfung auf gemounteten Dateien gesetzt und in obere Dateien kopiert werden; dies kann lokale Rechteausweitung ermöglichen. Nicht jede Kernel- oder Containerkonfiguration ist gleich betroffen.

Quellcode: Verwundbar vs. Sicher

Der betroffene SAUCE-Pfad rief nach einer Upstream-Änderung für alle xattrs __vfs_setxattr_noperm() auf. Der Fix verwendet vfs_setxattr() mit dem User-Namespace des oberen Mounts und stellt die normalen VFS-Prüfungen wieder her. Dies ist ein fokussierter Auszug aus Canonicals Patch; umgebende Debug-Ausgaben sind weggelassen.

Quelltextauszug: fs/overlayfs/overlayfs.h

VERWUNDBARE IMPLEMENTIERUNG
/* Kontext des maßgeblichen Ubuntu-Patches vor dem Zurücknehmen der SAUCE-Änderung. */
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;
}
GEHÄRTETER SICHERHEITS-PATCH
/* Maßgebliche Ubuntu-Korrektur: den VFS-Wrapper zur Berechtigungsprüfung wiederherstellen. */
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;
}

Checkliste für Engineering & Systemsicherheit

Quellen